一套签名接口,
接入多家游戏厂商,
每一笔都有据可查
面向菲律宾市场的 B2B 游戏聚合平台。商户只对接一套 HMAC-SHA256 签名的 /v1 接口,平台在后面适配 JiLi、EVO(经 WhiteCliff)、SPRIBE 等厂商协议;实时钱包、转账钱包、平台代管的游戏子钱包三种组合,产生的记录都进同一条事件序列,可拉取、可推送。
厂商
- 验签 · 定位通道与钱包
- 幂等 · 取消屏障
- 按钱包模式记账或透传
- 统一事件序列
商户
wallet/executetransfers/create| 时间 | 类型 | 操作号 | 游戏 | 借 / 贷 | 状态 |
|---|
一笔下注的旅程
三种钱包组合走的是同一条主干:先认证、先幂等、再动钱,最后变成同一种记录交给商户。切换组合,看余额的权威方和"结果不明"时的处理怎么变。
动钱:钱包模式分支
交付商户
商户自选:签名游标拉取,或平台批量推送。完整 ACK 才推进,失败批次原样重发,暂停期间积压不丢。
records/query · events/receive资金链路上的几条硬规矩
聚合平台夹在厂商和商户之间,任何一边超时、重送或乱序都会落到这里。这些规则写进了状态机和数据库约束,不靠人记。
幂等到底
操作号分商户(m_)与平台(p_)命名空间,并带业务指纹:同号重放返回第一次的结果,同号不同内容直接拒绝。
结果未知不冒充 0
超时、应答缺字段、金额超精度,一律记为 UNKNOWN,不当成功也不当失败;收敛后,同一事件发出新版本。
恢复只查证,不重发资金
定时扫描超过 1 分钟的未决单,按原操作号向商户或厂商查单。人工处置走受控恢复:ENG 申请、TR 批准。
通道一经使用,永久绑定
通道产生业务记录后,上游账号不能改绑。余额按厂商账号、商户、玩家、币种、环境隔离,同账号多通道不重复建账。
记录推送不丢
事件提交后才编号,读者不会漏掉晚提交的事务。推送按 ACK 推进,同批次复用投递号;部分确认、确认丢失、对方 401 都不丢积压。
三方对账
商户对账单、平台流水、厂商转账逐行比对,分出平台缺失、对方缺失、金额、币种、状态、重复六类差异;FIN 提出结论,FR 复核。
平台管理后台与商户后台,两套独立的后台
平台管理后台(/console/)与商户后台(/merchant/)是两套独立的应用:各自的登录、接口和会话互不相通,平台账号进不了商户后台,商户账号也进不了平台后台。平台后台按技术、运营、财务、合规、商务分角色,菜单只显示本人角色能用的页面;商户后台只看本商户的数据,由服务端强制限定。改动配置、授权、路由、通道这类事,都要一人发起、另一人批准。




商户接口在同一个域名下公开
演示站的商户接口就在本域名的 /v1/…,用公开的沙箱密钥签名即可调用。密钥只用于演示,与生产无关。
10 个商户接口
- /v1/capabilities/query
- /v1/games/query
- /v1/wallets/resolve
- /v1/sessions/create
- /v1/balances/query
- /v1/transfers/create
- /v1/operations/query
- /v1/records/query
- /v1/records/get
- /v1/reconciliation/statements/submit
签名:HMAC-SHA256
规范串是下面七行以换行连接;时间偏差 ±300 秒,随机串(nonce)不可重复使用。签名与另外五个值放在请求头里。
# 规范串(公开测试向量,时间戳固定,仅用于离线核对) POST /v1/transfers/create merchant_demo key_demo 1792742400 nonce_vector_01 ab7f26874397642eba3e1116a1fe416e512259a97cbc8706d1e87d991a6ea90d # 方法 / 路径 / 商户号 / 密钥 ID / 时间戳 / 随机串 / 请求体 SHA-256
签名 = HMAC-SHA256(密钥, 规范串) 的十六进制:cc48d8c2…22970
公开沙箱凭据
- 商户号
- merchant_demo
- 密钥 ID
- key_demo
- 密钥
- public-test-secret-not-for-production
- 站点
- site_01
import hashlib, hmac, json, secrets, time SECRET = b"public-test-secret-not-for-production" body = json.dumps({"request_id": "req_1", "site_id": "site_01"}).encode() ts = str(int(time.time())) nonce = "n_" + secrets.token_hex(8) canonical = "\n".join([ "POST", "/v1/games/query", "merchant_demo", "key_demo", ts, nonce, hashlib.sha256(body).hexdigest()]) sig = hmac.new(SECRET, canonical.encode(), hashlib.sha256).hexdigest() # 请求头:X-Merchant-Id X-Key-Id # X-Request-Id(=req_1) X-Timestamp # X-Nonce X-Signature
点上面的按钮:页面用 WebCrypto 现场算出签名,请求发往本站的 /v1/games/query。
六个演示账号,登录页一键切换
平台管理后台在 /console/,商户后台在 /merchant/,是两套独立的后台:各自的登录页只列出、也只接受自己的账号。点名字即可进入;也可以把令牌粘贴到登录框。沙箱账号不需要动态码。
- 用平台技术 · 张工(持有 OPS)在「商户游戏授权」里为 merchant_demo 发起一项授权变更。
- 退出,换平台运营负责人 · 林登录,在「我的待办」里批准或驳回。
- 需要会签的申请(如路由、通道启停),先换技术复核与合规 · 陈给出会签结论。
审批必须是另一个人:发起人不能审批自己的申请,会签人也不能再做批准人。
演示环境说明:厂商一侧和商户的钱包、推送接收端都由本机模拟器扮演,所以交易会持续产生;平台只允许调用这个模拟器。所有商户、玩家和金额都是虚构的,数据每天北京时间 04:00 重置。共享账号不能绑定验证器、更换令牌、停用或改角色;生产环境要求令牌加动态码登录。