AG GAME · Slots API V5.0.0
Documentation Game API pour l’intégration AG GAME Slots
Cette documentation d’API de slots fournit la référence publique de l’AG GAME Slots API V5.0.0. Utilisez la référence pour examiner la signature, le lancement de jeu, les flux de portefeuille, les enregistrements de transaction et la gestion des erreurs, puis suivez le processus d’intégration pour confirmer l’accès et les éléments de test propres au projet.
Vue d’ensemble de l’API et périmètre d’accès
Référence publique et éléments contrôlés du projet
Cette page explique l’objectif du protocole public actuel. L’URL de base réelle, les identifiants, les contraintes complètes des champs, la liste définitive des callbacks et la configuration de production sont confirmés pour chaque projet via l’intégration contrôlée.
Référence de la Slots API
- Authentification et signature
- Lancement du jeu et gestion de session
- Flux de portefeuille unique et de transfert
- Enregistrements de transaction et gestion des erreurs
Préparation des tests et de la production
Éléments nécessaires et prochaines étapes
Préparez le périmètre du projet, l’architecture de portefeuille et les éléments de test, puis utilisez le processus d’intégration pour confirmer les environnements, les responsabilités et les conditions de lancement vérifiables.
Démarrer le processus d’intégration · Discuter de l’accès de test
Authentification et signature
En-têtes communs
| En-tête | Type | Obligatoire | Description |
|---|---|---|---|
X-MERCHANT-CODE | string | Obligatoire | Code marchand attribué à la plateforme |
X-TIMESTAMP | string | Obligatoire | Horodatage au moment de la requête |
X-NONCE | string | Obligatoire | Chaîne aléatoire utilisée pour chaque requête |
X-SIGN | string | Obligatoire | Signature de requête générée avec HmacSHA256 |
X-CONTENT-PROCESSING-TYPE | string | Obligatoire | Type de traitement de contenu fourni selon la configuration d’intégration |
Chaîne de signature
Sérialisez le corps JSON final. Concaténez les valeurs dans l’ordre indiqué, sans séparateur, puis calculez HMAC-SHA256 avec la clé de signature. Envoyez le résultat dans X-SIGN. Les octets signés doivent correspondre exactement au corps envoyé ; reformater le JSON peut produire C10004.
merchantCode + timestamp + nonce + signType + bodyimport { createHmac } from "node:crypto";
const signType = "HmacSHA256";
const body = JSON.stringify(requestBody);
const signingText = merchantCode + timestamp + nonce + signType + body;
const signature = createHmac("sha256", secretKey)
.update(signingText, "utf8")
.digest("hex");Réponse commune
Le résultat métier est indiqué par code. Le statut HTTP seul ne confirme pas le résultat d’une transaction.
| Champ | Type | Description |
|---|---|---|
code | string | Code de résultat métier |
msg | string | Message de résultat |
success | boolean | Indicateur de réussite dans l’exemple |
data | object | Données de réponse de l’opération |
{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {}
}Catalogue de 17 capacités publiques
Catalogue de jeux et sessions
POST /game/v5/providersLister les fournisseurs de jeux
POST /game/v5/categoriesLister les catégories de jeux
POST /game/v5/gamesLister les jeux avec pagination
POST /game/v5/game/urlCréer une session de jeu joueur et obtenir une URL de lancement
POST /game/v5/player/force/logoutForcer la fin d’une session de jeu joueur
Callbacks de portefeuille unique
POST {MERCHANT-URL}/wallet/balanceConsulter le solde du portefeuille d’un joueur
POST {MERCHANT-URL}/player/infoConsulter les informations du joueur
POST {MERCHANT-URL}/wallet/betRecevoir une notification de mise
POST {MERCHANT-URL}/wallet/winRecevoir une notification de règlement ou de mise-règlement
POST {MERCHANT-URL}/wallet/cancelRecevoir une notification d’annulation de commande
Portefeuille de transfert
POST /game/v5/cash/depositTransférer des fonds vers le portefeuille de jeu d’un joueur
POST /game/v5/cash/withdrawRetirer des fonds du portefeuille de jeu d’un joueur
POST /game/v5/cash/balanceConsulter le solde du portefeuille de jeu d’un joueur
POST /game/v5/cash/transactionLister les enregistrements de transactions du portefeuille avec pagination
POST {CONTROLLED-PATH:FUND-RECOVERY}Récupérer tous les fonds d’un portefeuille de jeu par une opération contrôlée
Enregistrements et marchand
POST /game/v5/game/recordLister les enregistrements de jeux avec pagination
POST {CONTROLLED-PATH:MERCHANT-CONFIGURATION}Consulter la configuration du marchand et les informations de portefeuille par une opération contrôlée
POST/game/v5/game/urlCréer une session de jeu
/game/v5/game/urlCréer une session de jeuCrée une session de jeu pour un joueur donné et renvoie une URL permettant de lancer le jeu.
Champs de requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
reqTraceId | string | Obligatoire | Identifiant de requête unique ; ne doit pas être réutilisé |
gameCode | string | Obligatoire | Code du jeu |
playerId | string | Obligatoire | Identifiant unique du joueur côté marchand |
currencyCode | string | Obligatoire | Code devise du portefeuille |
language | string | Obligatoire | Langue de l’interface de jeu |
terminalType | string | Facultatif | Type de terminal : PHONE ou PC ; PHONE par défaut |
returnUrl | string | Facultatif | URL de retour après la sortie du joueur du jeu |
ipAddress | string | Obligatoire | Adresse IPv4 ou IPv6 du joueur |
subMerchantCode | string | Facultatif | Code sous-marchand ; ne peut pas contenir de tiret bas |
nickName | string | Facultatif | Pseudonyme du joueur |
avatarUrl | string | Facultatif | URL d’avatar du joueur |
{
"reqTraceId": "trace-demo-001",
"gameCode": "{game-code}",
"playerId": "player-demo-001",
"currencyCode": "{currency-code}",
"language": "en",
"terminalType": "PC",
"returnUrl": "https://{merchant-host}/lobby",
"ipAddress": "192.0.2.10"
}{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {
"gameCode": "{game-code}",
"playerId": "player-demo-001",
"gameUrl": "https://{game-launch-host}/session/{token}",
"expireTime": "2026-08-08T10:30:00Z"
}
}Champs de réponse
| Champ | Type | Retourné | Description |
|---|---|---|---|
data.gameCode | string | Obligatoire | Code du jeu |
data.playerId | string | Obligatoire | Identifiant du joueur |
data.gameUrl | string | Obligatoire | URL de lancement du jeu |
data.expireTime | string | Facultatif | Heure d’expiration de session |
POST{MERCHANT-URL}/wallet/winCallback de règlement du portefeuille
{MERCHANT-URL}/wallet/winCallback de règlement du portefeuilleEn mode portefeuille unique, la plateforme envoie une notification de gain ou de mise-règlement au portefeuille marchand. Le marchand doit traiter la transaction de manière idempotente et renvoyer le solde résultant dans la réponse.
Champs de requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
reqTraceId | string | Obligatoire | Identifiant de requête unique |
playerId | string | Obligatoire | Identifiant unique du joueur côté marchand |
currencyCode | string | Obligatoire | Code devise du portefeuille |
gameCode | string | Obligatoire | Code du jeu |
transactionId | string | Obligatoire | Identifiant de transaction plateforme unique |
roundId | string | Obligatoire | Identifiant unique de tour de jeu |
betId | string | Obligatoire | Identifiant de mise associé |
betAmount | string | Obligatoire | Montant de mise pour cette transaction |
winAmount | string | Obligatoire | Montant du gain pour cette transaction |
isFree | boolean | Obligatoire | Indique si l’enregistrement a été généré par une partie gratuite |
isEnd | boolean | Obligatoire | Indique si le tour de jeu actuel est terminé |
betTime | string | Obligatoire | Heure de mise |
settledTime | string | Obligatoire | Heure de règlement |
type | string | Obligatoire | Type de notification : win ou bet_win |
{
"reqTraceId": "trace-demo-002",
"playerId": "player-demo-001",
"currencyCode": "{currency-code}",
"gameCode": "{game-code}",
"transactionId": "txn-demo-002",
"roundId": "round-demo-001",
"betId": "bet-demo-001",
"betAmount": "10.00",
"winAmount": "18.50",
"isFree": false,
"isEnd": true,
"betTime": "2026-08-08T10:00:00Z",
"settledTime": "2026-08-08T10:00:08Z",
"type": "bet_win"
}{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {
"merchantBetId": "merchant-bet-demo-001",
"balance": "108.50"
}
}POST/game/v5/cash/depositTransférer des fonds vers le portefeuille de jeu
/game/v5/cash/depositTransférer des fonds vers le portefeuille de jeuEn mode portefeuille de transfert, transfère le montant indiqué depuis le système marchand vers le portefeuille de jeu d’un joueur.
Champs de requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
reqTraceId | string | Obligatoire | Identifiant de requête unique utilisé pour le suivi des requêtes |
playerId | string | Obligatoire | Identifiant unique du joueur côté marchand |
currencyCode | string | Obligatoire | Code devise du portefeuille |
amount | string | Obligatoire | Montant du transfert |
merchantTransactionId | string | Obligatoire | Identifiant de transaction marchand unique utilisé pour le rapprochement des transactions |
{
"reqTraceId": "trace-demo-003",
"playerId": "player-demo-001",
"currencyCode": "{currency-code}",
"amount": "100.00",
"merchantTransactionId": "merchant-txn-demo-001"
}{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {
"balance": "100.00"
}
}Générez un merchantTransactionId unique pour chaque transfert et conservez la requête ainsi que le résultat métier afin de rapprocher le statut final via le point de terminaison de consultation des transactions.
POST/game/v5/game/recordConsulter les enregistrements de jeux
/game/v5/game/recordConsulter les enregistrements de jeuxConsulte les enregistrements de mises et de gains d’un joueur par plage horaire avec pagination.
Champs de requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
reqTraceId | string | Obligatoire | Identifiant de requête unique |
pageNum | integer | Obligatoire | Numéro de page |
pageSize | integer | Obligatoire | Enregistrements par page |
reqData.startTime | string | Obligatoire | Heure de début de consultation |
reqData.endTime | string | Obligatoire | Heure de fin de consultation |
sort | string | Facultatif | Ordre de tri |
{
"reqTraceId": "trace-demo-004",
"pageNum": 1,
"pageSize": 50,
"reqData": {
"startTime": "2026-08-08T00:00:00Z",
"endTime": "2026-08-08T23:59:59Z"
},
"sort": "DESC"
}{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {
"gameRecordList": [{
"orderNo": "order-demo-001",
"playerId": "player-demo-001",
"betAmount": "10.00",
"winAmount": "18.50",
"betTime": "2026-08-08T10:00:00Z",
"winTime": "2026-08-08T10:00:08Z",
"gameCode": "{game-code}",
"currencyCode": "{currency-code}",
"roundId": "round-demo-001"
}]
}
}Codes d’erreur
| Code | Message | Action |
|---|---|---|
C10000 | Requête réussie | Requête réussie |
C10001 | Exception du service de base | Exception du service de base |
C10002 | Erreur de paramètre de requête | Vérifiez les champs de requête et les types de données |
C10003 | En-tête de requête non valide | Vérifiez les cinq en-têtes communs |
C10004 | Erreur de signature | Vérifiez l’ordre de signature, la clé et le corps de requête original |
C20001 | Code marchand absent | Vérifiez le code marchand |
G10001 | Exception du service de jeu | Exception du service de jeu |
G20001 | ID joueur vide | Fournissez playerId |
G20002 | ID jeu absent | Vérifiez le code du jeu |
G20003 | Jeu hors ligne | Le jeu est hors ligne ou indisponible |
G30001 | Session de jeu joueur expirée | Créez une nouvelle session de jeu |
G30002 | Solde marchand insuffisant | Le solde marchand est insuffisant |
G30003 | Solde joueur insuffisant | Le solde joueur est insuffisant |
G40001 | Exception de service tiers | Exception de service tiers |
Questions techniques
Comment l’API AG génère-t-elle une signature de requête ?
Sérialisez le corps final de la requête comme body, puis concaténez merchantCode + timestamp + nonce + signType + body dans cet ordre et sans séparateurs. signType est fixé à HmacSHA256. Calculez HMAC-SHA256 avec la clé de signature et placez le résultat dans X-SIGN. Le body utilisé pour la signature doit être exactement identique au corps envoyé.
Pourquoi C10004 est-il renvoyé ?
C10004 indique un échec de vérification de signature. Vérifiez d’abord le code marchand, timestamp, nonce, clé de signature et le type fixe HmacSHA256. Vérifiez ensuite que le middleware n’a pas sérialisé de nouveau la chaîne JSON signée, modifié l’ordre des champs ou les espaces. Conservez reqTraceId et l’heure de requête pour le diagnostic, mais n’enregistrez jamais la clé de signature.
Quelle est la différence entre portefeuille unique et portefeuille de transfert ?
En mode portefeuille unique, le marchand conserve le solde du joueur et la plateforme coopère avec le portefeuille marchand par les callbacks de solde, de mise et de règlement. En mode portefeuille de transfert, le marchand appelle des points de terminaison tels que /game/v5/cash/deposit et /game/v5/cash/withdraw pour déplacer des fonds entre son système et le portefeuille de jeu du joueur. Le modèle utilisé dépend de la configuration d’intégration du marchand et ne doit pas être mélangé dans le même flux de transaction.
Comment traiter les callbacks de portefeuille répétés ?
Le marchand doit utiliser transactionId comme base d’idempotence des transactions de callback. Lorsque la même transaction arrive à nouveau, renvoyez le résultat de traitement et le solde déjà confirmés ; ne la débitez ni ne la créditez une seconde fois. Conservez la requête, le résultat métier et le solde final pour le rapprochement. La nécessité de /wallet/bet et /wallet/cancel reste soumise à la liste finale des callbacks du marchand.
Une requête de transfert peut-elle être réessayée directement après un délai d’attente ?
Ne créez pas une nouvelle transaction et ne répétez pas le transfert tant que le résultat est inconnu. Utilisez d’abord le merchantTransactionId d’origine pour appeler /game/v5/cash/transaction et consulter le résultat, puis décidez d’un nouvel envoi selon l’accord technique final. Cela évite une comptabilisation en double lorsque la première requête a réussi mais que sa réponse a été perdue sur le réseau.
À quoi servent reqTraceId et merchantTransactionId ?
reqTraceId est l’identifiant de suivi unique de chaque requête. Il permet d’associer les journaux d’appel et de diagnostiquer une requête ; il doit être généré et enregistré pour chaque requête, y compris lors d’une nouvelle tentative. merchantTransactionId est l’identifiant unique de transaction côté marchand, utilisé pour le rapprochement des transferts, les consultations de résultat et la prévention du traitement répété d’une même transaction métier. Ils ont des objectifs différents et ne se remplacent pas.
Comment créer une session de jeu joueur ?
Obtenez un gameCode disponible dans le catalogue de jeux, préparez l’identifiant joueur, la devise, la langue et l’adresse IP, puis appelez /game/v5/game/url avec les en-têtes communs de requête. Une réponse réussie renvoie gameUrl et peut renvoyer expireTime ; le client doit ouvrir l’URL tant que la session est valide.
Comment consulter les enregistrements de jeu d’un joueur ?
Appelez /game/v5/game/record avec pageNum, pageSize et la plage reqData.startTime et reqData.endTime ; sort peut être fourni si nécessaire. Lisez les enregistrements de commande, joueur, montant de mise, gain, code jeu et tour dans gameRecordList de la réponse, puis poursuivez la consultation page par page.
Vérifications avant la production
Séparez les environnements de test et de production. Conservez les clés sur le serveur, hors du navigateur, des journaux et des discussions. Testez les délais, doublons, annulations et rapprochements avec les identifiants de transaction. Confirmez la configuration de production et les opérations contrôlées avec l’équipe d’intégration.
Démarrer le processus d’intégration