AG GAME · Slots API V5.0.0
Documentación de Game API para la integración de Slots de AG GAME
Esta documentación de API de slots ofrece la referencia pública de AG GAME Slots API V5.0.0. Use la referencia para revisar la firma, el inicio de juego, los flujos de monedero, los registros de transacciones y el tratamiento de errores; después, siga el proceso de integración para confirmar acceso y materiales de prueba específicos del proyecto.
Resumen de la API y alcance de acceso
Referencia pública y materiales controlados del proyecto
Esta página explica el propósito del protocolo público actual. La URL base real, las credenciales, las restricciones completas de campos, la lista final de callbacks y la configuración de producción se confirman por proyecto mediante la integración controlada.
Referencia de la Slots API
- Autenticación y firma
- Inicio del juego y gestión de sesión
- Flujos de monedero único y de transferencia
- Registros de transacciones y tratamiento de errores
Preparación para pruebas y producción
Materiales requeridos y próximos pasos
Prepare el alcance del proyecto, la arquitectura de monedero y los materiales de prueba; después, use el proceso de integración para confirmar entornos, responsabilidades y condiciones verificables de lanzamiento.
Iniciar el proceso de integración · Hablar sobre acceso de prueba
Autenticación y firma
Cabeceras comunes
| Cabecera | Tipo | Obligatorio | Descripción |
|---|---|---|---|
X-MERCHANT-CODE | string | Obligatorio | Código de comercio asignado a la plataforma |
X-TIMESTAMP | string | Obligatorio | Marca de tiempo de la solicitud |
X-NONCE | string | Obligatorio | Cadena aleatoria usada en cada solicitud |
X-SIGN | string | Obligatorio | Firma de la solicitud generada con HmacSHA256 |
X-CONTENT-PROCESSING-TYPE | string | Obligatorio | Tipo de procesamiento de contenido indicado según la configuración de integración |
Cadena de firma
Serialice el cuerpo JSON final. Concatene los valores en el orden indicado, sin separadores, y calcule HMAC-SHA256 con la clave de firma. Envíe el resultado en X-SIGN. Los bytes firmados deben coincidir exactamente con los enviados; reformatear JSON puede producir 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");Respuesta común
El resultado de negocio se obtiene mediante code. El estado HTTP por sí solo no confirma el resultado de una transacción.
| Campo | Tipo | Descripción |
|---|---|---|
code | string | Código de resultado de negocio |
msg | string | Mensaje de resultado |
success | boolean | Indicador de éxito en el ejemplo |
data | object | Datos de respuesta de la operación |
{
"code": "C10000",
"msg": "Request succeeded",
"success": true,
"data": {}
}Catálogo de 17 capacidades públicas
Catálogo de juegos y sesiones
POST /game/v5/providersListar proveedores de juegos
POST /game/v5/categoriesListar categorías de juegos
POST /game/v5/gamesListar juegos con paginación
POST /game/v5/game/urlCrear una sesión para jugador y obtener una URL de inicio
POST /game/v5/player/force/logoutForzar el cierre de una sesión de juego
Callbacks de monedero único
POST {MERCHANT-URL}/wallet/balanceConsultar el saldo de monedero de un jugador
POST {MERCHANT-URL}/player/infoConsultar información de jugador
POST {MERCHANT-URL}/wallet/betRecibir una notificación de apuesta
POST {MERCHANT-URL}/wallet/winRecibir una notificación de liquidación o liquidación de apuesta
POST {MERCHANT-URL}/wallet/cancelRecibir una notificación de cancelación de pedido
Monedero de transferencia
POST /game/v5/cash/depositTransferir fondos a un monedero de juego de jugador
POST /game/v5/cash/withdrawTransferir fondos desde un monedero de juego de jugador
POST /game/v5/cash/balanceConsultar el saldo de monedero de juego de un jugador
POST /game/v5/cash/transactionListar registros de transacciones de monedero con paginación
POST {CONTROLLED-PATH:FUND-RECOVERY}Recuperar todos los fondos de un monedero de juego mediante una operación controlada
Registros y comercio
POST /game/v5/game/recordListar registros de juego con paginación
POST {CONTROLLED-PATH:MERCHANT-CONFIGURATION}Consultar configuración de comercio e información de monedero mediante una operación controlada
POST/game/v5/game/urlCrear sesión de juego
/game/v5/game/urlCrear sesión de juegoCrea una sesión de juego para un jugador específico y devuelve una URL que puede iniciar el juego.
Campos de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reqTraceId | string | Obligatorio | Identificador único de solicitud; no se puede reutilizar |
gameCode | string | Obligatorio | Código de juego |
playerId | string | Obligatorio | Identificador único de jugador en el lado del comercio |
currencyCode | string | Obligatorio | Código de moneda del monedero |
language | string | Obligatorio | Idioma de la interfaz del juego |
terminalType | string | Opcional | Tipo de terminal: PHONE o PC; PHONE de forma predeterminada |
returnUrl | string | Opcional | URL de retorno después de que el jugador salga del juego |
ipAddress | string | Obligatorio | Dirección IPv4 o IPv6 del jugador |
subMerchantCode | string | Opcional | Código de subcomercio; no puede contener guion bajo |
nickName | string | Opcional | Apodo del jugador |
avatarUrl | string | Opcional | URL de avatar del jugador |
{
"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"
}
}Campos de respuesta
| Campo | Tipo | Devuelto | Descripción |
|---|---|---|---|
data.gameCode | string | Obligatorio | Código de juego |
data.playerId | string | Obligatorio | Identificador de jugador |
data.gameUrl | string | Obligatorio | URL de inicio del juego |
data.expireTime | string | Opcional | Hora de caducidad de la sesión |
POST{MERCHANT-URL}/wallet/winCallback de liquidación de monedero
{MERCHANT-URL}/wallet/winCallback de liquidación de monederoEn modo de monedero único, la plataforma envía una notificación de pago o de liquidación de apuesta al monedero del comercio. El comercio debe procesar la transacción de forma idempotente y devolver el saldo resultante en la respuesta.
Campos de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reqTraceId | string | Obligatorio | Identificador único de solicitud |
playerId | string | Obligatorio | Identificador único de jugador en el lado del comercio |
currencyCode | string | Obligatorio | Código de moneda del monedero |
gameCode | string | Obligatorio | Código de juego |
transactionId | string | Obligatorio | Identificador único de transacción de plataforma |
roundId | string | Obligatorio | Identificador único de ronda de juego |
betId | string | Obligatorio | Identificador de apuesta relacionada |
betAmount | string | Obligatorio | Importe de apuesta para esta transacción |
winAmount | string | Obligatorio | Importe de pago para esta transacción |
isFree | boolean | Obligatorio | Indica si el registro fue generado por un juego gratuito |
isEnd | boolean | Obligatorio | Indica si la ronda de juego actual ha terminado |
betTime | string | Obligatorio | Hora de apuesta |
settledTime | string | Obligatorio | Hora de liquidación |
type | string | Obligatorio | Tipo de notificación: win o 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/depositTransferir fondos al monedero de juego
/game/v5/cash/depositTransferir fondos al monedero de juegoEn modo de monedero de transferencia, transfiere el importe indicado desde el sistema del comercio al monedero de juego de un jugador.
Campos de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reqTraceId | string | Obligatorio | Identificador único de solicitud usado para el seguimiento de solicitudes |
playerId | string | Obligatorio | Identificador único de jugador en el lado del comercio |
currencyCode | string | Obligatorio | Código de moneda del monedero |
amount | string | Obligatorio | Importe de transferencia |
merchantTransactionId | string | Obligatorio | Identificador único de transacción del comercio usado para conciliación |
{
"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"
}
}Genere un merchantTransactionId único para cada transferencia y conserve la solicitud y el resultado de negocio para poder conciliar el estado final mediante el endpoint de consulta de transacciones.
POST/game/v5/game/recordConsultar registros de juego
/game/v5/game/recordConsultar registros de juegoConsulta los registros de apuestas y pagos de un jugador por rango de tiempo con paginación.
Campos de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reqTraceId | string | Obligatorio | Identificador único de solicitud |
pageNum | integer | Obligatorio | Número de página |
pageSize | integer | Obligatorio | Registros por página |
reqData.startTime | string | Obligatorio | Hora inicial de consulta |
reqData.endTime | string | Obligatorio | Hora final de consulta |
sort | string | Opcional | Orden de clasificación |
{
"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"
}]
}
}Códigos de error
| Código | Mensaje | Acción |
|---|---|---|
C10000 | Solicitud completada correctamente | Solicitud completada correctamente |
C10001 | Excepción de servicio base | Excepción de servicio base |
C10002 | Error de parámetro de solicitud | Revise campos de solicitud y tipos de datos |
C10003 | Encabezado de solicitud no válido | Revise los cinco encabezados comunes |
C10004 | Error de firma | Revise orden de firma, clave y cuerpo original de solicitud |
C20001 | Falta código de comercio | Revise el código de comercio |
G10001 | Excepción de servicio de juego | Excepción de servicio de juego |
G20001 | ID de jugador vacío | Proporcione playerId |
G20002 | Falta ID de juego | Revise el código de juego |
G20003 | Juego sin conexión | El juego está sin conexión o no está disponible |
G30001 | Sesión de juego de jugador caducada | Cree una nueva sesión de juego |
G30002 | Saldo de comercio insuficiente | El saldo del comercio es insuficiente |
G30003 | Saldo de jugador insuficiente | El saldo del jugador es insuficiente |
G40001 | Excepción de servicio de terceros | Excepción de servicio de terceros |
Preguntas técnicas
¿Cómo genera AG API una firma de solicitud?
Serialice el cuerpo final de la solicitud como body y concatene merchantCode + timestamp + nonce + signType + body en ese orden y sin separadores. signType se fija como HmacSHA256. Calcule HMAC-SHA256 con la clave de firma y coloque el resultado en X-SIGN. El body usado para la firma debe ser exactamente igual al cuerpo enviado.
¿Por qué se devuelve C10004?
C10004 indica un fallo de verificación de firma. Primero revise el código de comercio, timestamp, nonce, clave de firma y el tipo fijo HmacSHA256. Después confirme que el middleware no ha serializado de nuevo la cadena JSON firmada, cambiado el orden de campos ni los espacios. Conserve reqTraceId y la hora de solicitud para diagnóstico, pero nunca registre la clave de firma.
¿Cuál es la diferencia entre monedero único y monedero de transferencia?
En modo de monedero único, el comercio mantiene el saldo del jugador y la plataforma colabora con el monedero del comercio mediante callbacks de saldo, apuesta y liquidación. En modo de monedero de transferencia, el comercio llama a endpoints como /game/v5/cash/deposit y /game/v5/cash/withdraw para mover fondos entre su sistema y el monedero de juego del jugador. El esquema utilizado depende de la configuración de integración del comercio y no debe mezclarse en el mismo flujo de transacción.
¿Cómo deben manejarse los callbacks repetidos de monedero?
El comercio debe usar transactionId como base de idempotencia para transacciones de callback. Cuando llegue la misma transacción de nuevo, devuelva el resultado de procesamiento y el saldo ya confirmados; no la debite ni la acredite otra vez. Conserve la solicitud, el resultado de negocio y el saldo final para conciliación. La necesidad de /wallet/bet y /wallet/cancel queda sujeta a la lista final de callbacks del comercio.
¿Puede reintentarse directamente una solicitud de transferencia después de un tiempo de espera?
No cree una transacción nueva ni repita la transferencia mientras se desconozca el resultado. Primero use el merchantTransactionId original para llamar a /game/v5/cash/transaction y consultar el resultado; luego decida si debe reenviar según el acuerdo técnico final. Esto evita la contabilización duplicada cuando la primera solicitud tuvo éxito pero su respuesta se perdió en la red.
¿Para qué se usan reqTraceId y merchantTransactionId?
reqTraceId es el identificador de seguimiento único de cada solicitud. Se usa para asociar registros de llamadas y diagnosticar una solicitud; debe generarse y registrarse para cada solicitud incluso durante reintentos. merchantTransactionId es el identificador único de transacción del lado del comercio, usado para conciliación de transferencias, consultas de resultado y para evitar procesar repetidamente la misma transacción de negocio. Tienen finalidades distintas y no se sustituyen.
¿Cómo se crea una sesión de juego de jugador?
Obtenga un gameCode disponible del catálogo de juegos, prepare identificador de jugador, moneda, idioma y dirección IP, y luego llame a /game/v5/game/url con los encabezados comunes de solicitud. Una respuesta correcta devuelve gameUrl y puede devolver expireTime; el cliente debe abrir la URL mientras la sesión sea válida.
¿Cómo se consultan los registros de juego de un jugador?
Llame a /game/v5/game/record con pageNum, pageSize y el rango reqData.startTime y reqData.endTime; sort puede enviarse si se necesita. Lea los registros de orden, jugador, importe de apuesta, pago, código de juego y ronda desde gameRecordList en la respuesta, y continúe la consulta página por página.
Comprobaciones antes de producción
Separe entornos de pruebas y producción. Mantenga las claves en el servidor, fuera de navegador, registros y chat. Pruebe tiempos de espera, solicitudes repetidas, cancelaciones y conciliación con identificadores de transacción. Confirme la configuración de producción y las operaciones controladas con el equipo de integración.
Iniciar el proceso de integración