GameAggregator B2B 游戏聚合平台
演示站在线 · 模拟器持续产生交易

一套签名接口,
接入多家游戏厂商,
每一笔都有据可查

面向菲律宾市场的 B2B 游戏聚合平台。商户只对接一套 HMAC-SHA256 签名的 /v1 接口,平台在后面适配 JiLi、EVO(经 WhiteCliff)、SPRIBE 等厂商协议;实时钱包、转账钱包、平台代管的游戏子钱包三种组合,产生的记录都进同一条事件序列,可拉取、可推送。

3 种钱包组合:实时透传、标准转账、游戏钱包代管
10 个商户接口,另有 5 个平台调用商户的接口
20 → 1同一操作号 20 次并发重放,只记一笔分录

厂商

JiLi实时钱包回调
EVO经 WhiteCliff · 转账
SPRIBE实时钱包 · 双向签名
GameAggregator
  1. 验签 · 定位通道与钱包
  2. 幂等 · 取消屏障
  3. 按钱包模式记账或透传
  4. 统一事件序列

商户

实时钱包商户wallet/execute
转账钱包商户transfers/create
One bet, end to end

一笔下注的旅程

三种钱包组合走的是同一条主干:先认证、先幂等、再动钱,最后变成同一种记录交给商户。切换组合,看余额的权威方和"结果不明"时的处理怎么变。

动钱:钱包模式分支

平台游戏子钱包
商户实时钱包
厂商游戏钱包

交付商户

商户自选:签名游标拉取,或平台批量推送。完整 ACK 才推进,失败批次原样重发,暂停期间积压不丢。

records/query · events/receive
余额权威方
商户怎么接
结果不明时
Money-path rules

资金链路上的几条硬规矩

聚合平台夹在厂商和商户之间,任何一边超时、重送或乱序都会落到这里。这些规则写进了状态机和数据库约束,不靠人记。

01

幂等到底

操作号分商户(m_)与平台(p_)命名空间,并带业务指纹:同号重放返回第一次的结果,同号不同内容直接拒绝。

02

结果未知不冒充 0

超时、应答缺字段、金额超精度,一律记为 UNKNOWN,不当成功也不当失败;收敛后,同一事件发出新版本。

03

恢复只查证,不重发资金

定时扫描超过 1 分钟的未决单,按原操作号向商户或厂商查单。人工处置走受控恢复:ENG 申请、TR 批准。

04

通道一经使用,永久绑定

通道产生业务记录后,上游账号不能改绑。余额按厂商账号、商户、玩家、币种、环境隔离,同账号多通道不重复建账。

05

记录推送不丢

事件提交后才编号,读者不会漏掉晚提交的事务。推送按 ACK 推进,同批次复用投递号;部分确认、确认丢失、对方 401 都不丢积压。

06

三方对账

商户对账单、平台流水、厂商转账逐行比对,分出平台缺失、对方缺失、金额、币种、状态、重复六类差异;FIN 提出结论,FR 复核。

Two consoles, split duties

平台管理后台与商户后台,两套独立的后台

平台管理后台(/console/)与商户后台(/merchant/)是两套独立的应用:各自的登录、接口和会话互不相通,平台账号进不了商户后台,商户账号也进不了平台后台。平台后台按技术、运营、财务、合规、商务分角色,菜单只显示本人角色能用的页面;商户后台只看本商户的数据,由服务端强制限定。改动配置、授权、路由、通道这类事,都要一人发起、另一人批准。

平台端运营概览:未决交易、推送积压与告警
运营概览:未决交易与最老 UNKNOWN 的时长、推送积压、商户与厂商状态,一屏看清哪里要人处理。
发起、会签、批准三人分开路由、通道启停、账号退役、产品发布需 TR 会签;审批绑定申请时的对象状态,对象被改过就执行失败。
7×24 值班主、副值班排班;严重信号立即通知主值班,10 分钟未确认升级到副值班与事件负责人。
半年在线,之后归档商户可查询、补拉三个月;内部在线半年,更早的终态记录迁入归档,经审批开调阅窗口读取。
Merchant API

商户接口在同一个域名下公开

演示站的商户接口就在本域名的 /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。
Try the demo

六个演示账号,登录页一键切换

平台管理后台在 /console/,商户后台在 /merchant/,是两套独立的后台:各自的登录页只列出、也只接受自己的账号。点名字即可进入;也可以把令牌粘贴到登录框。沙箱账号不需要动态码。

MAKER · CHECKER
  1. 用平台技术 · 张工(持有 OPS)在「商户游戏授权」里为 merchant_demo 发起一项授权变更。
  2. 退出,换平台运营负责人 · 林登录,在「我的待办」里批准或驳回。
  3. 需要会签的申请(如路由、通道启停),先换技术复核与合规 · 陈给出会签结论。

审批必须是另一个人:发起人不能审批自己的申请,会签人也不能再做批准人。

演示环境说明:厂商一侧和商户的钱包、推送接收端都由本机模拟器扮演,所以交易会持续产生;平台只允许调用这个模拟器。所有商户、玩家和金额都是虚构的,数据每天北京时间 04:00 重置。共享账号不能绑定验证器、更换令牌、停用或改角色;生产环境要求令牌加动态码登录。