NAV
java php python go javascript

XAgent 转帐钱包 API 文档 V3.0

前言

对接流程

  1. 提供相应信息,联系我方在UAT环境给您开户
  2. 提供您的服务器 IP 用以添加服务器 IP 白名单。
  3. 开户完成,我方提供publicKey、businessAccount、site等其他参数,和游戏后台地址
  4. 根据您的游戏需求,我方提供相对应的游戏编码表,对接用
  5. 将游戏相关数据(名称、编码、封面素材等)在您的平台创建出来
  6. 通过接口文档开始对接接口
  7. 接口对接完毕,联调测试无误
  8. 正式环境准备接入,我方商务介入,与您洽谈商务事项
  9. 正式环境开户完毕,切换接口地址和参数
  10. 提供您的后台IP白名单,在游戏后台配置白名单
  11. 正式环境预运营与验收
  12. 接入完毕,正式上线

对接说明

  1. 我方所有接口参数入参 , 大小写敏感(不会忽略大小写) , 请注意传值

  2. 在您的WEB / H5 / APP 平台,配置好游戏入口后,用户点击游戏入口,调用我方提供的用户注册/登录接口, 传入account、游戏编码、gameType等参数

  3. 成功后,取到接口返回值,其中url字段,就是携带了该用户登录态token的form表单 或 url 链接

  4. 通过访问、内嵌url字段,即可跳转进入游戏本体内部

  5. 您需要取用户的唯一ID作为account,按照一定的规则,拼接好,传入接口

  6. 您可在我方提供的游戏控制台(后台),创建不同的代理线路,每条线路可配置独立的RTP配置,每条线路的用户也是分割独立的。

  7. 我方在给您开户时,会帮您创建好一条默认的代理线路供您使用,后续若需要更多,可自行去后台添加

  8. 您还可以在后台创建您的子代理,将不同的代理线路分配给您的子代理管理,并附带 子代理后台,可查看分配给该子代理的相关游戏数据、用户订单记录、报表、调整RTP参数等。

白名单限制

我方的所有接口域名 , 以及给您开设的游戏后台 , 均有设置IP白名单限制 , 若未进行配置 , 则无法调用接口 / 访问后台 , 所以在对接开始之前 , 需要您提供如下IP信息给我方进行预配置:

  1. 您各环境的服务器的IP地址

  2. 您需要访问游戏后台的设备IP地址

API 文档

接口域名

UAT环境:https://xagent-open-api-uat-hh.ncfc.cc

正式环境:联系商务获取

接入前准备

Headers:

参数名称 参数值 是否必须 示例 备注
Content-Type application/json application/json
businessAccount 我方提供的总代唯一标识 ballGame
site XAgent商户后台中的代理线路标识 default 若无另行设定,带入default即可

参数加密示例:

/**
 * @param jsonString json字串,格式示例:{"field_1":"value_1","field_2":"value_2"}
 * @param publicKey  公钥,格式示例:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADC....
 * @return 加密后的请求参数,包含加密后的数据字段
 * @throws Exception 加密过程中可能抛出的异常
 */
public static Map<String, String> encryptRequestBody(String jsonString, String publicKey) throws Exception {
    // 将json字符串转换为字节数组
    byte[] data = jsonString.getBytes(StandardCharsets.UTF_8);

    // 通过Base64解码获取公钥字节数组
    byte[] keyBytes = Base64.getDecoder().decode(publicKey);

    // 使用公钥字节数组创建X509EncodedKeySpec对象
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);

    // 使用KeyFactory生成公钥对象
    KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // 加密算法
    Key publicK = keyFactory.generatePublic(x509KeySpec);

    // 初始化Cipher对象,用于RSA加密
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, publicK);

    int inputLen = data.length;
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int offSet = 0;
    byte[] cache;

    // 对数据进行分段加密,每次加密块的大小不超过MAX_ENCRYPT_BLOCK
    int MAX_ENCRYPT_BLOCK = 117;   // RSA加密的最大块大小,PKCS1填充方式下为117字节
    while (inputLen - offSet > 0) {
        int len = Math.min(MAX_ENCRYPT_BLOCK, inputLen - offSet);
        cache = cipher.doFinal(data, offSet, len);
        out.write(cache);
        offSet += len;
    }

    // 获取加密后的字节数组
    byte[] encryptedData = out.toByteArray();
    out.close();

    // 将加密后的字节数组进行Base64编码,转换为字符串
    String base64String = Base64.getEncoder().encodeToString(encryptedData);

    // 创建一个Map,将Base64编码后的加密数据作为参数放入Map中
    Map<String, String> encryptParam = new HashMap<>();
    encryptParam.put("data", base64String);

    // 返回包含加密数据的Map
    return encryptParam;
}

public static void main(String[] args) throws Exception {
  String account = "用户名";
  String password = "password";

  // 手動拼接 JSON
  String jsonString = "{"
  + "\"account\":\"" + account + "\","
  + "\"password\":\"" + password + "\""
  + "}";

  System.out.println(jsonString);

  String base64PublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...'; // 替換為你的 base64 公鑰內容

  OkHttpClient client = new OkHttpClient().newBuilder()
  .build();

  MediaType mediaType = MediaType.parse("application/json");
  RequestBody body = RequestBody.create(mediaType, encryptRequestBody( jsonString , base64PublicKey ));



  Request request = new Request.Builder()
  .url("your-api-endpoint")
  .method("POST", body )
  .addHeader("businessAccount", "我方提供的总代唯一标识")
  .addHeader("site", "XAgent 商户后台中的代理线路标识")
  .addHeader("Content-Type", "application/json")
  .build();
  Response response = client.newCall(request).execute();
}
<?php
// 假設 json 資料與 base64 公鑰字串
$jsonString = json_encode([
    'account'=> '用户名',
    'password'=> 'password'
]);

$base64PublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...'; // 替換為你的 base64 公鑰內容

// 1. 將 base64 公鑰解碼並封裝成 PEM 格式
$pubKeyFormatted = "-----BEGIN PUBLIC KEY-----\n" .
    chunk_split($base64PublicKey, 64, "\n") .
    "-----END PUBLIC KEY-----";

// 2. 載入公鑰
$publicKey = openssl_pkey_get_public($pubKeyFormatted);
if (!$publicKey) {
    die("公鑰格式錯誤");
}

// 3. 將 JSON 字串轉為位元組(UTF-8)
$data = $jsonString;

// 4. RSA 1024-bit 公鑰 -> 明文限制 117 bytes (PKCS1 padding)
$chunkSize = 117;
$offset = 0;
$encrypted = '';

while ($offset < strlen($data)) {
    $chunk = substr($data, $offset, $chunkSize);
    $encryptedChunk = '';
    if (!openssl_public_encrypt($chunk, $encryptedChunk, $publicKey, OPENSSL_PKCS1_PADDING)) {
        die("加密失敗");
    }
    $encrypted .= $encryptedChunk;
    $offset += $chunkSize;
}

// 5. 最終結果:Base64 編碼後輸出
$encryptedBase64 = base64_encode($encrypted);
echo "加密結果(Base64):\n" . $encryptedBase64;
// HTTP POST 请求函数
function httpPost($encryptedBase64) {
    $url = 'your-api-endpoint'; // 替换为您的API接口地址

    $options = array(
        'http' => array(
            'header' => "businessAccount: 我方提供的总代唯一标识\r\n" .
            "site: XAgent 商户后台中的代理线路标识\r\n" .
            "Content-Type: application/json\r\n",
            'method'  => 'POST',
            'content' => json_encode([
                'data'=> $encryptedBase64
            ])
        )
    );

    $context  = stream_context_create($options);
    $result = file_get_contents($url, false, $context);

    return $result;
}
?>
import base64
from json import dumps
import requests
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
def rsa_encrypt_chunked(data: bytes, public_key_pem: str) -> bytes:
    """
    使用 RSA 公钥 (PKCS#1) 分段加密数据。
    :param data: 需要加密的原始数据 (bytes)
    :param public_key_pem: 公钥字符串 (PEM 格式)
    :return: 加密后的原始 bytes (未进行 Base64 编码)
    """
    key = RSA.importKey(public_key_pem)
    cipher_rsa = PKCS1_v1_5.new(key)
    def get_rsa_chunk_size(public_key_pem: str) -> int:
        """
        计算 RSA 加密时单次最大加密数据的大小。
        :param public_key_pem: 公钥字符串 (PEM 格式)
        :return: 可加密的最大字节数
        """
        key = RSA.importKey(public_key_pem)
        key_bits = key.size_in_bits()  # 获取密钥的位数
        key_bytes = key_bits // 8  # 转换为字节
        return key_bytes - 11  # PKCS#1 v1.5 需要扣除 11 字节填充
    offset = 0
    encrypted_data = b""
    chunk_size = get_rsa_chunk_size(public_key_pem)  # 计算分块大小
    while offset < len(data):
        chunk = data[offset: offset + chunk_size]  # 获取当前分块数据
        encrypted_chunk = cipher_rsa.encrypt(chunk)  # 使用 RSA 加密
        encrypted_data += encrypted_chunk  # 拼接加密后的数据
        offset += chunk_size  # 移动偏移量
    return encrypted_data
if __name__ == "__main__":
    # 业务账号唯一标识
    business_account = "我方提供的总代唯一标识"
    # 代理线路标识
    site = "XAgent 商户后台中的代理线路标识"
    # RSA 公钥
    public_key_str = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END PUBLIC KEY-----"""
    # 需要加密的参数
    payload = {"account": "用户名", "password": "password"}
    data_bytes = dumps(payload).encode("utf-8")  # 将字典转换为 JSON 并编码为字节
    # 分段加密数据
    encrypted_bytes = rsa_encrypt_chunked(data_bytes, public_key_str)
    # 对加密数据进行 Base64 编码
    encrypted_b64 = base64.b64encode(encrypted_bytes).decode("utf-8")
    # 发送请求的参数
    encrypt_param = {"data": encrypted_b64}
    # 请求头
    headers = {
        "Content-Type": "application/json",
        "businessAccount": business_account,
        "site": site
    }
    # 接口地址
    url = "https://xxxx.xxx.xxxx.xxxx/v3/xxxxx/xxxx/xxxx"
    # 发送 POST 请求
    response = requests.post(url, json=encrypt_param, headers=headers)
    print("Response:", response.text)
package main

import (
    "bytes"
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/base64"
    "encoding/json"
    "encoding/pem"
    "fmt"
    "net/http"
)

func main() {
    // 参数
    param := map[string]string{
        "account":  "用户名",
        "password": "password",
    }

    // JSON 编码
    jsonData, err := json.Marshal(param)
    if err != nil {
        fmt.Println("JSON Marshal error:", err)
        return
    }

    // RSA 加密
    publicKey := `-----BEGIN PUBLIC KEY-----
your-public-key-here
-----END PUBLIC KEY-----`

    encodedData, err := rsaEncrypt(jsonData, publicKey)
    if err != nil {
        fmt.Println("RSA Encryption error:", err)
        return
    }

    // Base64 编码
    base64String := base64.StdEncoding.EncodeToString(encodedData)
    fmt.Println("encoded:", base64String)

    // 构建请求参数
    encryptParam := map[string]string{
        "data": base64String,
    }

    // 调用接口
    req, err := http.NewRequest("POST", "your-api-endpoint", encryptParam)
    if err != nil {
        fmt.Println("HTTP Post error:", err)
    }

    // 设置请求头
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("site", "XAgent 商户后台中的代理线路标识")
    req.Header.Set(businessAccount", "我方提供的总代唯一标识")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("HTTP Post get response error:", err)
    }

    fmt.Println("Response:", resp)
}
const crypto = require('crypto');
const axios = require('axios');

// 参数
const param = {
  account: '用户名',
  password: 'password'
};

// JSON 编码
const jsonData = JSON.stringify(param);

// RSA 加密
const publicKey = `-----BEGIN PUBLIC KEY-----
your-public-key-here
-----END PUBLIC KEY-----`;
const buffer = Buffer.from(jsonData, 'utf8');
const encryptedData = crypto.publicEncrypt(publicKey, buffer);

// Base64 编码
const base64String = encryptedData.toString('base64');
console.log("encoded: " + base64String);

// 构建请求参数
const encryptParam = {
  data: base64String
};

// 调用接口
var endpoint = 'your-api-endpoint';
let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: endpoint,
  headers: {
    'businessAccount': '我方提供的总代唯一标识',
    'site': 'XAgent 商户后台中的代理线路标识',
    'Content-Type': 'application/json'
  },
  data : encryptParam
};

axios.request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  }
  1. Content-Type :application/json.
  2. 需要将我方提供的2个固定值,添加在请求头中,header key为 site和businessAccount
  3. 您需要将请求体使用公钥 (publicKey) 进行RSA加密,然后把加密后的byte数组转为Base64字符串,最后组装为 {"data":"加密后的Base64字符串"} 格式的json提交给接口
  4. http返回对象中 code为返回码 200=正常,数据在data中.当code不为200时,message为错误信息.
  5. 请求示例
    • 例 XAgent服务器域名为 https://xagent-open-api-uat.ncfc.cc
    • 某个接口的地址为 /v3/single/act
    • 商户端公钥为 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADC...
    • 业务参数json数据 {"field_1":"value_1","field_2":"value_2"}
    • 先对业务参数RSA加密得到密文 Os977UOvhnqN+0xY4YBg95vlBpaKmgWAHnTa...
    • 设置请求头 businessAccount site content-type
    • 对密文base64编码后,构建统一的请求参数实体 {"data":"Os977UOvhnqN+0xY4YBg95vlBpaKmgWAHnTa..."}
    • 使用post提交方式请求 https://xagent-open-api-uat.ncfc.cc/v3/single/act
    • 得到响应数据 {"code":200,"message":"success","data":{"field_a":"value_a","field_b":"value_b"}}
    • 判断code是否为200, 若为200, 则强烈建议商户端对响应数据进行验签, 不是200则不会有签名值, 签名值从响应头 signature 中获取得到
    • 将Body中的数据拼接上公钥得到 {"code":200,"message":"success","data":{"field_a":"value_a","field_b":"value_b"}}MIGfMA0GCSqGSIb3DQEBAQUAA4GNADC...
    • 将拼接好的字符串通过MD5算法得到信息摘要, 再与响应头中的签名值进行比较, 若一致则响应数据是安全的
    • 之后再根据业务参数进行后续的业务逻辑判断

用户注册 / 登录(游戏入口)

接口路径

POST /v3/transfer/user/login

接口描述

于会员登入游戏时调用此接口, 请求此接口 注册/登录用户 , 并同时获取带用户token的URL入口,account必须唯一。

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
account string Y 玩家帐号 (只支持(2~13)位小写字符或数字) ^[a-z0-9]{2,8}$
password string Y 帐号密码 (不超过20字符)
gameType string Y 游戏类别代码 (参考附录)
isMobile bool Y 是否为手机端
gameCode string Y 游戏编码, 具体游戏的编码
lang string Y 语言类型 (参考附录)
coin string Y 货币类型 (参考附录)
line string N 线路, 部分场馆支持, 如支持的则用这个值填充三方的“线路/站点”体系的必填参数, 不传则为默认值
lobby string N 大厅地址, 部分场馆支持, 比如从场馆游戏页面回跳到商户的页面, 如支持的则用这个值填充三方的“大厅地址/玩家IP”体系的必填参数, 不传则为空
userIP string N 玩家IP, 如支持的则用这个值填充三方的“大厅地址/玩家IP”体系的必填参数, 不传则为空
orderNoMerchant string N 上分订单号,长度不超过50位
inAmount decimal N 转入金额, 2位小数
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/single/user/login' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"afafCuR6SHzSHFMjOEm44FdKkDPL9KMpeJEVfeolaUFI6RDHRlpL+BDRYGnniSHcEeKycmaKblh0w5fH8xVMTrssep1VmlSuIDd6VZJX+LQgWpjs7ExpAK4aD9O1NqssfcYbgtVUAzuAanbk3AStWtp8MFi7X7jkzm5WeeuCkX8tgXt3CEBfczlegzKiLZoYhdobLXbBaMo0auj8ZxWiQobnP4vL2Q/19sd0kIzkaYgryYpDa4e9PbR2QMwnowXOgfJ5hYh//+YAybgGq1NzHfc4N2AWK3QGFk2H8rHqVMgnyBeTBSE+hWqyXauDfl4yq43rGU+MqekEB0Dz2utY3A=="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 200 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string N 错误码不为200时,此字段展示错误信息
data object N 具体数据字段,见data数据定义 *备注:* 具体数据内容

data 数据:

参数 数据类型 必填 说明
urlType int Y url类型 [1:直接跳转的url 2:自动跳转的form表单]
url string Y 进入游戏地址
orderNo string N 订单号 - XAgent的
orderNoMerchant string N 订单号 - 下游商户的
status int N 转账结果 [0:初始化/未知状态; 1:成功; 2:失败;]

获取玩家余额

接口路径

POST /v3/transfer/user/balance

接口描述

此接口用于您获取您平台用户在我方指定场馆中的余额情况

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
account string Y 玩家帐号 (只支持(2~8)位小写字符或数字) ^[a-z0-9]{2,8}$
password string Y 帐号密码 (不超过20字符)
gameType string Y 游戏类别代码 (参考附录)
coin string Y 货币类型 (参考附录)
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/user/balance' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"aKVH/5WJ6dEbJ5AJYCd5SBIMEGZuTAOfQVADRlRhdkirBpxDFdLyefnpZ8MsL/Ub8ArkY83NoOJrQJAcLkA9HdKnvfDn+3g7yLmPTNXBvAdNdg0y4muFsAEe8FdEHedYYk0AZVfGqKGHlzm+t8wwbUlbtnmfqQwXyUSMoH3Sy6M="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 200 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string N 错误码不为200时,此字段展示错误信息
data object N 具体数据字段,见data数据定义 *备注:* 具体数据内容

data

参数 数据类型 必填 说明
balance decimal Y 余额
coin string Y 请求参数中的币种

转账(上分/下分)

接口路径

POST /v3/transfer/user/transfer

接口描述

此接口用于给指定用户上分、下分

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
account string Y 玩家帐号 (只支持(2~8)位小写字符或数字) ^[a-z0-9]{2,8}$
password string Y 帐号密码 (不超过20字符)
gameType string Y 游戏类别代码 (参考附录)
coin string Y 货币类型 (参考附录)
orderNoMerchant string Y 上分/下分订单号,长度不超过50位
type string Y 转帐类别 [in为上分(转入),out为下分(转出)]
amount decimal Y 金额, 2位小数
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/user/transfer' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"W1po3lRSZsBV6aHzoEEgmadgZx7kKZlMsROUj4W42VxWfIZRw2Mfdo+NSJUs2bZoCRc30r3Tpw4uiJtNIVY9U6eA07Ur4ss5ejyfHZJK5CIFKtpx0jDOhr2Ok1mCqkuA31jG+rsrh8Bh0OaCG9Rts6ztZO+MYgdnI/d0GY2BBSJKBYWH7dLNCgjwxjrHgii/ufzDck5RxhfHVBbHDnuUr5KAu2O5iW1WwItqoOCz2YvA591EifHMNgBt7cKVxdFujvISjTjpGqXC8oJF1QWTPkLGGX0WuSeZksS4toC576c9DN1D/vFy8Q2kiyaA29YttCX2kKOOUGAuM/rdGFhpmg=="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string N 错误码不为200时,此字段展示错误信息
data object N 具体数据字段,见data数据定义 *备注:* 具体数据内容

data数据:

参数 数据类型 必填 说明
orderNo string Y 订单号 - XAgent的
orderNoMerchant string Y 订单号 - 下游商户的
status int Y 转账结果 [0:初始化/未知状态; 1:成功; 2:失败;]

获取历史注单

接口路径

POST /v3/transfer/bet/betting

接口描述

查询游戏历史注单的接口(一次调用最多返回5000条数据)

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
gameType string Y 游戏类别代码 (参考附录)
startTimestampMs string Y 开始时间戳
endTimestampMs string Y 结束时间戳, 开始与结束时间不能超过12个小时
pageIndex string Y 页码
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/bet/betting' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"SNQQ39/jXIZkpmq16SK4ujLLVNnrbjM4KZ/LV0xJrcwbzyQRN1SuPvOMP5D8jtP5LGrs4cGjzSbD6MHThlUsPSEdplPa9yxnSzKXKGcoGtXgpqNryEY10iCQEJaFN0Cw43+u83jBUle6hPryf5Rj5fn9jLilumaTQYQeRLj1u20="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string N 错误码不为200时,此字段展示错误信息
data String N 具体数据字段,见下方data数据定义

data数据:

参数 数据类型 必填 说明
pageIndex string Y 页码
pageTotal string Y 总页数
bets BetItemModel[] Y 历史注单集合

BetItemModel:

参数 数据类型 必填 说明
betNoVenue string Y 场馆注单号
account string Y 玩家账号
coin string Y 币种 (参考附录)
gameType string Y 游戏类别 (参考附录)
gameCode string Y 游戏编码
betAmount decimal Y 投注金额
validAmount decimal Y 有效投注
netWinningAmount decimal Y 净输赢
betTimestampMs long Y 下注时间戳
settlementTimestampMs long Y 结算时间戳
isTrial bool Y 是否试玩注单
betState int Y 注单状态 (参考附录)
settlementState int Y 结算状态 (参考附录)
extend object Y 注单扩展信息, 不同类别的注单的扩展信息有所差异 (参考附录)
site string Y XAgent商户后台中的代理线路标识

转账订单查询

接口路径

POST /v3/transfer/user/transfer-search

接口描述

根据订单号查询转账订单详情的接口

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:
参数 数据类型 必填 说明
orderNoMerchant string Y 上分/下分订单号,长度不超过50位
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/user/transfer-search' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"QB8pXcVHA2Iu7iEMooxQvwzsFAYQqPYYNg8969dnUkjteud0w6YSR65NktMSY6Ql9LUto1OMHOw8v7FEwHOTJ6KxpJPbVuvwyp7vxpjLhZ3wFQ4zECOPxEKYrXVo6gaDDAUBbe9F8kaUqxWUXlQxjWrqMXbCHn1hsQC4caVyLMA="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string N 错误码不为200时,此字段展示错误信息
data object N 具体数据字段,见下方TransferOrder数据定义

data

参数 数据类型 必填 说明
orderNo string Y 订单号 - XAgent的
orderNoMerchant string Y 订单号 - 下游商户的
status int Y 转账结果 [0:初始化/未知状态; 1:成功; 2:失败;]

获取游戏列表

接口路径

POST /v3/transfer/game/list-gamecode

接口描述

获取游戏列表的接口

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
gameType string Y 游戏类别代码 (参考附录)
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/game/list-gamecode' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"G4HEngPlnZ85x449qYvOsqeV2KjlgXTAjmWF2tUjRFSuOiVMvtFnxvEIwqEz7a1QCUrqaBPKWCOnAUs+OAkv61vApOhI9gZ9pU1o5fy7V+g0Q9Y4WYlD48chxr5KwFI5E9peTJaUaje+n50YBOgFhzKhfN3muQeJbEMIdYWB42A="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string Y 错误码不为200时,此字段展示错误信息
data GameCodeList[] Y 游戏集合 (参考附录)

获取游戏类别列表

接口路径

POST /v3/transfer/game/list-gametype

接口描述

获取游戏类别列表的接口

场馆

如需对接 XG 场馆,需要实现此接口。

请求参数

Body:

参数 数据类型 必填 说明
coin string Y 货币类型 (参考附录)
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/game/list-gametype' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"JWBtLQ47oLSCHOYr+UaXwMZEdkw/s3moTstrFBFAwzukvW0lh57aeVXEqjLjMXxHOnObn/QmnMlUUygBSgCSlRY9J5T6HevQ2F5TmM4ESlRN1v1WeF++RKLSkuk45aOl2XywB9DcpVV8O9aorsByuhZ4MSUgo8fhePty3EnFN3w="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string Y 错误码不为200时,此字段展示错误信息
data GameTypeList[] Y 游戏类别集合 (数据结构参考附录)

PG游戏馆会员踢线接口

接口路径

POST /v3/transfer/game/pgKickOut

接口描述

PG游戏专用,踢会员下线接口,调用后会员会被强制下线处理

请求参数

Body:

参数 数据类型 必填 说明
account string Y 玩家帐号
gameType string Y 游戏类别代码 (参考附录)
# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/game/pgKickOut' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"jAmvMbJ4ZgPt6GDnp9x0jAirH2qr3RiVLPXqm5xX+t2LzuY6lx9FttA7pA/iRksJXpvRuDfJouKSo3VtcjKkeV6qg39Ft1b8+yVdnZNjwC+peir7AMUbcx/61Unx6zTqt1K0n4RX89NGd7Y/kt9gYjShZQLtceqc0NR1FypJe34="
}'

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string Y 错误码不为200时,此字段展示错误信息

PG游戏馆查看订单详情

接口路径

POST /v3/transfer/game/pgSnapshot

接口描述

PG游戏专用,可查看某个会员某个PG游戏订单的详细游戏截图详情,调用接口后以URL的形式返回,直接访问即可查看

请求参数

# input sample
curl --location 'https://xagent-open-api-uat-hh.ncfc.cc/v3/transfer/game/pgSnapshot' \
--header 'businessAccount: testaccount' \
--header 'site: default' \
--header 'Content-Type: application/json' \
--data '{
"data":"Z2R6/LFNXDvne7A2hXDx8WF6rTXZmihVIu1ZtoI9KIykueP5DFRX4VWeP0CZUXVxTLTlrx6Vr8xGk7O/G8RtEhqjDDx4Zka3wN0t19rIRsJyB3xMdBxBqHW8M6qk9Ou7IcFt+S0/PnkceEZjPdEDRWBs5bNQwSZ6x+mjKNSnA88="
}'

Body:

参数 数据类型 必填 说明
account string Y 玩家帐号
gameType string Y 游戏类别代码 (参考附录)
gameCode string Y 游戏代码 (参考附录)
orderNo string Y 订单编号

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number Y 错误码,调用成功为200,失败为其他值,参考常见错误码定义
message string Y 错误码不为200时,此字段展示错误信息
data string Y 游戏订单详情页面的URL,直接访问即可查看

附录

GameType 游戏类别

此处只展示部分GameType,仅作参考,详细请移步查看XAgent Game List 文档, 后续增加了会在文档中体现, 或者通过商户后台查看最新数据

编码 名称 说明
xg_electronic XG电子
ag_live AsiaGaming真人
ag_electronic AsiaGaming电子
ag_live AsiaGaming真人
ax_electronic Aviatrix电子
bng_electronic BNG电子
cr_sport 皇冠体育
dg_live DreamGaming真人
evo_live Evolution真人
fb_sport FB体育
fg_brand FunGaming棋牌
imty_sport InplayMatrix体育
jdb_electronic 夺宝电子
ky_brand 开元棋牌
mg_electronic MicroGaming电子
nlc_electronic NoLimitCity电子
ob_live DB(原OB)真人
obty_sport 熊猫体育
pg_electronic PocketGames电子
png_electronic PlayNGo电子
pp_electronic PragmaticPlay电子
pp_live PragmaticPlay真人
rt_electronic Red Tiger电子
sc_lottery SHI CAI彩票
sexy_live Sexy真人
shb_sport 沙巴体育

Coin 币种

后续增加了会在文档中体现, 或者通过商户后台查看最新数据

编码 名称 说明
aud 澳大利亚元
bdt 孟加拉塔卡
brl 巴西雷亚尔
cny 人民币
eur 欧元
hkd 港元
idr 印尼盾
inr 印度卢比
irr 伊朗里亚尔
jpy 日元
khr 柬埔寨瑞尔
krw 韩元
mmk 缅元
myr 马来西亚令吉
ngn 尼日利亚奈拉
npr 尼泊尔卢比
php 菲律宾比索
pkr 巴基斯坦卢比
pyg 巴拉圭爪拉尼
rub 俄罗斯卢布
sgd 新加坡元
thb 泰铢
twd 新台币
usd 美元
vnd 越南盾
usdt USDT

Lang 语言

后续增加了会在文档中体现, 或者通过商户后台查看最新数据

编码 名称 说明
en 英文
hi 印地语
id 印尼语
ja 日语
ko 韩文
pt 葡萄牙文
ta 泰米尔语
th 泰语
vi 越南语
zh 中文
zh_hant 中文-繁体
es 西班牙语

BetOperateStates 注单处理结果

编码 名称 说明
0 未知, 未赋值情况下的默认值或者不确定是否成功的任意情况, 也是失败
1 成功
2 失败
3 余额不足
4 玩家不存在
20 注单不存在
21 注单重复
22 注单已结算
23 注单已取消
24 注单已回滚

BillOperateStates 账单处理结果

编码 名称 说明
0 未知, 未赋值情况下的默认值或者不确定是否成功的任意情况, 也是失败
1 成功
2 失败
3 余额不足
4 玩家不存在
20 账单不存在
21 账单重复
23 账单已取消

VenueResultCodes 常见错误码

编码 名称 说明
200 成功, 除此之外全部都为失败
400 参数错误
9*** 内部服务错误
9999 包含任何失败的情况
3000 XAgent-系统维护
3001 XAgent-IP白名单限制
3002 商户未开通这个游戏馆或者币种
5000 游戏馆系统维护
5001 游戏馆IP白名单限制
5002 游戏馆不可访问
5003 游戏馆系统繁忙
5004 不可直接进入大厅
5005 订单处理中
5006 余额不足
7000 商户端系统维护
7001 商户端IP白名单限制
7003 商户端系统繁忙
7004 商户端账号不存在

BetState 注单状态

编码 名称 转账模式 单一钱包 说明
0 未知状态 可用 可用
1 注单已被接受,有效 可用 可用
2 拒绝/投注失败 可用 不可用
3 撤销/注销/第三方强制撤单/退款 可用 不可用
4 注单已被取消 可用 可用
5 回收/出售 可用 不可用

SettlementState 结算状态

编码 名称
1 未结算/未开奖/等待开奖
3 赢/中奖
4 输/未中奖
5 和/平局

GameTypeList 游戏类别实体

参数 数据类型 必填 说明
gameType string Y 游戏类别
name string Y 对应的中文名
isEnable bool Y 是否启用 true / false

GameCodeList 游戏列表实体

参数 数据类型 必填 说明
gameType string Y 游戏类别
gameCode string Y 游戏编码, 具体游戏的编码
gameNameEnus string Y 游戏英文名称
gameNamePtbr string Y 游戏葡萄牙语名称
gameNameZhcn string Y 游戏中文名称
isEnable bool Y 是否启用 true / false
logoUrl string Y 游戏logo
remark string Y 备注