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

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êteTypeObligatoireDescription
X-MERCHANT-CODEstringObligatoireCode marchand attribué à la plateforme
X-TIMESTAMPstringObligatoireHorodatage au moment de la requête
X-NONCEstringObligatoireChaîne aléatoire utilisée pour chaque requête
X-SIGNstringObligatoireSignature de requête générée avec HmacSHA256
X-CONTENT-PROCESSING-TYPEstringObligatoireType 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 + body
import { 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.

ChampTypeDescription
codestringCode de résultat métier
msgstringMessage de résultat
successbooleanIndicateur de réussite dans l’exemple
dataobjectDonné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/providers

    Lister les fournisseurs de jeux

  • POST /game/v5/categories

    Lister les catégories de jeux

  • POST /game/v5/games

    Lister les jeux avec pagination

  • POST /game/v5/game/url

    Créer une session de jeu joueur et obtenir une URL de lancement

  • POST /game/v5/player/force/logout

    Forcer la fin d’une session de jeu joueur

Callbacks de portefeuille unique

  • POST {MERCHANT-URL}/wallet/balance

    Consulter le solde du portefeuille d’un joueur

  • POST {MERCHANT-URL}/player/info

    Consulter les informations du joueur

  • POST {MERCHANT-URL}/wallet/bet

    Recevoir une notification de mise

  • POST {MERCHANT-URL}/wallet/win

    Recevoir une notification de règlement ou de mise-règlement

  • POST {MERCHANT-URL}/wallet/cancel

    Recevoir une notification d’annulation de commande

Portefeuille de transfert

  • POST /game/v5/cash/deposit

    Transférer des fonds vers le portefeuille de jeu d’un joueur

  • POST /game/v5/cash/withdraw

    Retirer des fonds du portefeuille de jeu d’un joueur

  • POST /game/v5/cash/balance

    Consulter le solde du portefeuille de jeu d’un joueur

  • POST /game/v5/cash/transaction

    Lister 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/record

    Lister 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

Crée une session de jeu pour un joueur donné et renvoie une URL permettant de lancer le jeu.

Authentification : en-têtes communs de requêteContent-Type: application/json

Champs de requête

ChampTypeObligatoireDescription
reqTraceIdstringObligatoireIdentifiant de requête unique ; ne doit pas être réutilisé
gameCodestringObligatoireCode du jeu
playerIdstringObligatoireIdentifiant unique du joueur côté marchand
currencyCodestringObligatoireCode devise du portefeuille
languagestringObligatoireLangue de l’interface de jeu
terminalTypestringFacultatifType de terminal : PHONE ou PC ; PHONE par défaut
returnUrlstringFacultatifURL de retour après la sortie du joueur du jeu
ipAddressstringObligatoireAdresse IPv4 ou IPv6 du joueur
subMerchantCodestringFacultatifCode sous-marchand ; ne peut pas contenir de tiret bas
nickNamestringFacultatifPseudonyme du joueur
avatarUrlstringFacultatifURL d’avatar du joueur
Requête
{
  "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"
}
Réponse
{
  "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

ChampTypeRetournéDescription
data.gameCodestringObligatoireCode du jeu
data.playerIdstringObligatoireIdentifiant du joueur
data.gameUrlstringObligatoireURL de lancement du jeu
data.expireTimestringFacultatifHeure d’expiration de session

POST{MERCHANT-URL}/wallet/winCallback de règlement du portefeuille

En 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.

Direction : plateforme → marchandType : win / bet_win

Champs de requête

ChampTypeObligatoireDescription
reqTraceIdstringObligatoireIdentifiant de requête unique
playerIdstringObligatoireIdentifiant unique du joueur côté marchand
currencyCodestringObligatoireCode devise du portefeuille
gameCodestringObligatoireCode du jeu
transactionIdstringObligatoireIdentifiant de transaction plateforme unique
roundIdstringObligatoireIdentifiant unique de tour de jeu
betIdstringObligatoireIdentifiant de mise associé
betAmountstringObligatoireMontant de mise pour cette transaction
winAmountstringObligatoireMontant du gain pour cette transaction
isFreebooleanObligatoireIndique si l’enregistrement a été généré par une partie gratuite
isEndbooleanObligatoireIndique si le tour de jeu actuel est terminé
betTimestringObligatoireHeure de mise
settledTimestringObligatoireHeure de règlement
typestringObligatoireType de notification : win ou bet_win
Requête de callback
{
  "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"
}
Réponse du marchand
{
  "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

En mode portefeuille de transfert, transfère le montant indiqué depuis le système marchand vers le portefeuille de jeu d’un joueur.

Modèle de portefeuille : portefeuille de transfertClé de transaction : merchantTransactionId

Champs de requête

ChampTypeObligatoireDescription
reqTraceIdstringObligatoireIdentifiant de requête unique utilisé pour le suivi des requêtes
playerIdstringObligatoireIdentifiant unique du joueur côté marchand
currencyCodestringObligatoireCode devise du portefeuille
amountstringObligatoireMontant du transfert
merchantTransactionIdstringObligatoireIdentifiant de transaction marchand unique utilisé pour le rapprochement des transactions
Requête
{
  "reqTraceId": "trace-demo-003",
  "playerId": "player-demo-001",
  "currencyCode": "{currency-code}",
  "amount": "100.00",
  "merchantTransactionId": "merchant-txn-demo-001"
}
Réponse
{
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {
    "balance": "100.00"
  }
}
Rapprochement des transactions

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

Consulte les enregistrements de mises et de gains d’un joueur par plage horaire avec pagination.

Champs de requête

ChampTypeObligatoireDescription
reqTraceIdstringObligatoireIdentifiant de requête unique
pageNumintegerObligatoireNuméro de page
pageSizeintegerObligatoireEnregistrements par page
reqData.startTimestringObligatoireHeure de début de consultation
reqData.endTimestringObligatoireHeure de fin de consultation
sortstringFacultatifOrdre de tri
Requête
{
  "reqTraceId": "trace-demo-004",
  "pageNum": 1,
  "pageSize": 50,
  "reqData": {
    "startTime": "2026-08-08T00:00:00Z",
    "endTime": "2026-08-08T23:59:59Z"
  },
  "sort": "DESC"
}
Réponse
{
  "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

CodeMessageAction
C10000Requête réussieRequête réussie
C10001Exception du service de baseException du service de base
C10002Erreur de paramètre de requêteVérifiez les champs de requête et les types de données
C10003En-tête de requête non valideVérifiez les cinq en-têtes communs
C10004Erreur de signatureVérifiez l’ordre de signature, la clé et le corps de requête original
C20001Code marchand absentVérifiez le code marchand
G10001Exception du service de jeuException du service de jeu
G20001ID joueur videFournissez playerId
G20002ID jeu absentVérifiez le code du jeu
G20003Jeu hors ligneLe jeu est hors ligne ou indisponible
G30001Session de jeu joueur expiréeCréez une nouvelle session de jeu
G30002Solde marchand insuffisantLe solde marchand est insuffisant
G30003Solde joueur insuffisantLe solde joueur est insuffisant
G40001Exception de service tiersException 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

AG GAME

Échangeons sur votre projet

Contactez-nous
TelegramWhatsApp