Skip to content
v1.0.0 (2026-08-15 18:56)

游戏启动与进入 (Launch Game) ✓ 已完成

概述

  • 接口说明:申请进入指定游戏。接口会处理多端适配(UA 自动判定)、单一钱包余额一致性(未结算注单核对)以及防重入锁(防抖锁 + 单一游戏锁)等复杂业务。
  • 鉴权说明必须登录。必须在 Request Header 中携带玩家专属的 Member Token (Authorization: Bearer <member_token>)。非登录状态或 Token 失效将拒绝提供游戏链接。

底层业务逻辑与安全校验

WARNING

游戏启动 (Launch) 接口是平台最重要的核心入口,必须严格保留以下防御机制:

  1. 高并发防抖锁 (Concurrency Lock):玩家请求启动时,系统使用 Redis SETNX launch:lock:{memberId} 给该玩家上排他锁(TTL 3 秒)。防止因网络卡顿造成的连点,导致向第三方重复发起会话。冲突时返回 429;Redis 故障时降级放行。
  2. 单一钱包余额一致性 (Wallet Consistency):进入新游戏前,系统查询 hub_callback_wager(注单集合)判断是否存在 status=BET 的未结算注单。若有,必须等该注单结算后再允许入场(重连同一游戏不受影响)。本地余额以 Mongo member_wallet 为权威,靠 Hub BetPush/Balance 回调实时同步。
  3. 游戏期间资金保护 (Fund Protection):玩家在游戏中(Redis 单游戏锁存在)时,禁止提现与币种兑换,防止玩家在游戏进行期间(资金悬停在第三方)在本地提现。本地余额不做清零
  4. 多端自适应返回platform 未传时根据 User-Agent 自动判定(WEB/MOBILE);若某些特殊游戏配置为 isapp=true(如 918Kiss, Mega888),则返回专属唤醒协议与下载链接 (dwnlink)。

IMPORTANT

  1. 强制登录校验:此接口使用 VerifyMemberToken 校验玩家身份,未登录或 Token 已失效的玩家将拒绝访问。
  2. 异地登录挤占检查 (Single Sign-On Guard):如果系统开启了单设备登录限制,当检测到账号在其他设备重复登录时,系统将拦截请求并返回 logged in elsewhere 提示。
  3. 代理秘钥自动鉴权:系统会根据玩家所属代理 (agent_id) 自动关联该代理配置的 PanelApiKeyPanelSecretKey,安全调用底层 Hub 游戏代理服务。
  4. 自动开户与钱包建仓:玩家首次启动某厂商游戏时,第三方 Hub 系统会自动为其在游戏商处注册账号并初始化该币种的钱包。

NOTE

后端调用 Hub /papi/v1/game/launch 时,member_id 传玩家原生用户名(username,与退出游戏 /client/games/exit、后台踢人保持一致);Hub 底层会以该 username 自动注册玩家账号并创建钱包。


1. POST - 玩家获取游戏启动链接

  • 路径: /client/games/url
  • Content-Type: application/jsonapplication/x-www-form-urlencoded

请求 Header

参数名类型必填说明
AuthorizationStringBearer Token(玩家 JWT,必须已登录),格式为 Bearer <token>
Accept-LanguageString指定响应语言(如 zh-CN, en-US

请求参数

参数名类型必填说明
game_idStringHub 游戏 ID(game_list.hub_game_id),或来自游戏列表接口id / hub_game_id
platformStringWEB / MOBILE / DESKTOP。不传则根据 User-Agent 自动判定;默认 WEB
languageString语言,不传则取玩家语言偏好,默认 en-US
return_urlString游戏返回地址(退出后跳转)
currencyString币种(如 MYR, USD)。不传则使用代理绑定的主币种

响应参数

字段名类型说明
game_urlString游戏启动全路径 URL(前端可直接使用 window.location.href 或在 iframe/新窗口打开该链接)

响应示例 (成功)

json
{
  "status": true,
  "code": 0,
  "data": {
    "game_url": "https://thirdparty.com/launch?token=xxxxx",
    "isapp": false,
    "dwnlink": ""
  },
  "msg": "Success"
}

响应示例 (未登录 / Token 失效)

json
{
```json
{
  "status": false,
  "code": 700,
  "msg": "验证失败: unauthorized",
  "data": null
}

响应示例 (账号已在其他设备登录)

json
{
  "status": false,
  "code": 700,
  "msg": "验证失败: logged in elsewhere",
  "data": null
}

成功示例 (移动端原生唤醒)

json
{
  "status": true,
  "code": 0,
  "data": {
    "game_url": "pussy888://launch",
    "isapp": true,
    "dwnlink": "https://download.pussy888.com"
  },
  "msg": "Success"
}

错误响应示例 (并发点击被防抖锁拦截)

json
{
  "status": false,
  "code": 429,
  "data": null,
  "msg": "启动请求处理中,请稍后再试"
}

}


### 错误响应示例 (存在未结算注单)

```json
{
  "status": false,
  "code": 7,
  "data": {},
  "msg": "您有未结算的注单,请先完成结算后再进入新游戏"
}

NOTE

msg 会根据玩家语言自动返回(优先取 JWT 的 language claim、x-language 请求头或玩家档案语言),以上为中文(zh_cn)示例,英文玩家将收到英文文案。