跳到主要内容

预下单

信息

为了确保同一笔订单的请求参数在游戏侧和世游侧一致,防止经过意外篡改,需要增加预下单步骤

游戏服务器OmniSDK 服务器发起预下单请求,请求携带服务端签名,OmniSDK 服务器验证后将数据保存,以供 SDK 发起下单时进行校验, 校验通过后才会进行正常下单流程。如果存在恶意用户试图篡改下单请求,则在创建创建订单阶段就能发现并进行拦截。

时序图

预下单 API

Post /omni/purchase/preorder/omni-app-id

提示

此 API 支持幂等操作,确保 API 请求仅完成一次。如果原始请求成功完成,则后续重试将返回原始成功请求的结果。因此当出现 HTTP Request Timeout 等预期中的错误时可进行重试。

幂等性的处理,依赖于 gameTradeNo 字段的值,因此游戏侧需要保证 gameTradeNo 在本游戏内的的所有渠道中是全局唯一的。

签名算法

与 SDK 服务端通用签名方法一致,私钥为 SDK 分配给游戏服务端的 key。 详见文档 安全性

请求参数

可选参数,在符合游戏业务特性的情况下,请尽量提供,越全越好。

NameTypeDescriptionMust
uidNumber用户 IDYes
roleIdString角色 IDYes
productIdString商品 IDYes
gameTradeNoString游戏订单号Yes
signString对请求参数的签名Yes
serverIdString游戏服 IDNo
gameCallbackUrlString支付通知回调地址No
payDescriptionStringCP 方透传信息No

响应参数

NameTypeDescriptionMust
codeString0 表示成功,其他值表示失败Yes
reasonString描述信息Yes

请求示例

POST /omni/purchase/preorder/15985 HTTP/1.1
Host: api.omnisdk.com
Content-Type: application/json

{
"uid": 10086,
"serverId": "1922",
"roleId": "1005956",
"productId": "500648",
"gameTradeNo": "MY115121520230222162729142623251",
"gameCallbackUrl": "https://foobar.com/callback",
"payDescription": "10个钻石",
"sign": "4471b1388769d247ab5ac449d74c298d"
}

响应示例

{
"code": "-1",
"reason": "Signature not match"
}