v1.0.0 (2026-08-15 18:56)
游戏启动与进入 (Launch Game) ✓ 已完成
概述
- 接口说明:申请进入指定游戏。接口会处理多端适配(UA 自动判定)、单一钱包余额一致性(未结算注单核对)以及防重入锁(防抖锁 + 单一游戏锁)等复杂业务。
- 鉴权说明:必须登录。必须在 Request Header 中携带玩家专属的 Member Token (
Authorization: Bearer <member_token>)。非登录状态或 Token 失效将拒绝提供游戏链接。
底层业务逻辑与安全校验
WARNING
游戏启动 (Launch) 接口是平台最重要的核心入口,必须严格保留以下防御机制:
- 高并发防抖锁 (Concurrency Lock):玩家请求启动时,系统使用 Redis
SETNX launch:lock:{memberId}给该玩家上排他锁(TTL 3 秒)。防止因网络卡顿造成的连点,导致向第三方重复发起会话。冲突时返回429;Redis 故障时降级放行。 - 单一钱包余额一致性 (Wallet Consistency):进入新游戏前,系统查询
hub_callback_wager(注单集合)判断是否存在status=BET的未结算注单。若有,必须等该注单结算后再允许入场(重连同一游戏不受影响)。本地余额以 Mongomember_wallet为权威,靠 HubBetPush/Balance回调实时同步。 - 游戏期间资金保护 (Fund Protection):玩家在游戏中(Redis 单游戏锁存在)时,禁止提现与币种兑换,防止玩家在游戏进行期间(资金悬停在第三方)在本地提现。本地余额不做清零。
- 多端自适应返回:
platform未传时根据 User-Agent 自动判定(WEB/MOBILE);若某些特殊游戏配置为isapp=true(如 918Kiss, Mega888),则返回专属唤醒协议与下载链接 (dwnlink)。
IMPORTANT
- 强制登录校验:此接口使用
VerifyMemberToken校验玩家身份,未登录或 Token 已失效的玩家将拒绝访问。 - 异地登录挤占检查 (Single Sign-On Guard):如果系统开启了单设备登录限制,当检测到账号在其他设备重复登录时,系统将拦截请求并返回
logged in elsewhere提示。 - 代理秘钥自动鉴权:系统会根据玩家所属代理 (
agent_id) 自动关联该代理配置的PanelApiKey和PanelSecretKey,安全调用底层 Hub 游戏代理服务。 - 自动开户与钱包建仓:玩家首次启动某厂商游戏时,第三方 Hub 系统会自动为其在游戏商处注册账号并初始化该币种的钱包。
NOTE
后端调用 Hub /papi/v1/game/launch 时,member_id 传玩家原生用户名(username,与退出游戏 /client/games/exit、后台踢人保持一致);Hub 底层会以该 username 自动注册玩家账号并创建钱包。
1. POST - 玩家获取游戏启动链接
- 路径:
/client/games/url - Content-Type:
application/json或application/x-www-form-urlencoded
请求 Header
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
Authorization | String | 是 | Bearer Token(玩家 JWT,必须已登录),格式为 Bearer <token> |
Accept-Language | String | 否 | 指定响应语言(如 zh-CN, en-US) |
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
game_id | String | 是 | Hub 游戏 ID(game_list.hub_game_id),或来自游戏列表接口的 id / hub_game_id |
platform | String | 否 | WEB / MOBILE / DESKTOP。不传则根据 User-Agent 自动判定;默认 WEB |
language | String | 否 | 语言,不传则取玩家语言偏好,默认 en-US |
return_url | String | 否 | 游戏返回地址(退出后跳转) |
currency | String | 否 | 币种(如 MYR, USD)。不传则使用代理绑定的主币种 |
响应参数
| 字段名 | 类型 | 说明 |
|---|---|---|
game_url | String | 游戏启动全路径 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)示例,英文玩家将收到英文文案。