跳转到内容

核心概念

玩家余额只存在于你的系统中,Star Game 从不托管玩家资金:玩家投注时,平台请求你的钱包扣款(debit);一局派奖时,请求你加款(credit);扣款结果不确定时,请求你冲正(rollback)。金额是以十进制字符串表示的最小单位整数("1500"),配合你在「商户控制台 → 接入」配置的币种和小数位。永远不使用浮点数。

玩家每次打开游戏时,你的 App 向你的后端申请一个启动码,并通过宿主桥(getConfig → code)交给游戏页面。平台通过 POST /players/authenticate 兑换它,且只兑换一次,从不保存。

  • 不透明、随机、一次性。
  • 有效期要短:≤ 5 分钟。
  • 在你的系统里绑定到一名玩家;不要把 App 自己的访问令牌放进网址或 getConfig。

可重复使用的启动码(例如为了页面刷新后仍可进入)也能工作,但自测工具会把「一次性」作为建议项给出警告。

authenticate 返回一个由你定义的 session_id。平台会在每一笔扣款中原样带回,你可以据此在玩家登出、被封禁或超出限额后拒绝新的投注(session_invalid、player_blocked、limit_exceeded)。

规则:

  • 加款和冲正永远不校验会话。 已经进行的对局必须能结算,即使玩家在此期间登出或被封禁。
  • 扣款或查余额请求带有会话时,请延长该会话。对仍在游戏中的玩家,平台至少每 20 分钟调用一次 balance,所以只看不下注的玩家会话也不会过期。

每笔交易都带有全局唯一的 transaction_id(≤ 128 字符)。

  • 重复的 transaction_id 必须返回首次处理的结果(包括 insufficient_funds 这样的失败结果),并且绝不重复记账。
  • 同一 transaction_id 但 type、player_id、amount、currency 或 reference_transaction_id 不同时,返回 duplicate_mismatch,不记账。
  • 交易记录至少保留 180 天用于对账。

rollback 冲正 reference_transaction_id 指向的扣款:

你这边的情况 处理 返回
扣款已记账且未冲正 退款 ok
扣款已冲正,或当时就失败未记账 不动 ok
从未收到该扣款 为该交易号记录一条墓碑 ok
带墓碑的扣款之后才到达 不记账 rolled_back

对每一笔结果未知的扣款(超时、连接重置、5xx),平台都会发送冲正并持续重试,直到收到 ok。有了墓碑,双方一定会收敛一致,不需要翻对账单。

引用的扣款从未记账或已被冲正的 credit,返回 reference_not_found。

分段扣款(同一玩家一局多笔扣款)

Section titled “分段扣款(同一玩家一局多笔扣款)”

下注期内,平台每隔几秒把新下的注合并扣一次,所以同一玩家在同一局里可能有多笔扣款:

lantern:59666:p_123:bet 第一段投注
lantern:59666:p_123:bet:1 几秒后新下的注
lantern:59666:p_123:bet:2 ...
  • 不要按局或「一人一局一笔」去重或拒绝。
  • 每笔扣款各自独立:其中一笔可能被拒(insufficient_funds)或被冲正,其余照常有效。
  • 派彩 credit 引用该玩家本局第一笔已记账的扣款,金额是本局全部已记账投注的合计派彩。
  • round_id 把一局的所有交易归在一起,可用于你的客服工具。

POST /transactions 携带 1–500 笔交易(不会超过你配置的单批最大笔数)。

  • 各项相互独立、不是原子的,你可以并行处理。
  • 同一玩家的多项必须按数组顺序处理。
  • 只有当每一项都有结果时才返回 HTTP 200;某一项失败不会让整批失败。
  • 结果按请求顺序逐项返回。
  • 平台对 HTTP 408、429、5xx 和超时使用相同的交易号重试,并遵守 Retry-After。
  • 状态为 retry(暂时失败、未记账)的项会以同一交易号重发。
  • 每次 HTTP 尝试都带新的 webhook-id 和新签名;资金幂等键是 transaction_id,不是 webhook-id。
  • 平台的并行请求数不会超过你设置的最大并发请求数。