预下单
信息
为了确保同一笔订单的请求参数在游戏侧和世游侧一致,防止经过意外篡改,需要增加预下单步骤
由游戏服务器向 OmniSDK 服务器发起预下单请求,请求携带服务端签名,OmniSDK 服务器验证后将数据保存,以供 SDK 发起下单时进行校验, 校验通过后才会进行正常下单流程。如果存在恶意用户试图篡改下单请求,则在创建创建订单阶段就能发现并进行拦截。
时序图
预下单 API
Post /omni/purchase/preorder/omni-app-id
提示
此 API 支持幂等操作,确保 API 请求仅完成一次。如果原始请求成功完成,则后续重试将返回原始成功请求的结果。因此当出现 HTTP Request Timeout
等预期中的错误时可进行重试。
幂等性的处理,依赖于 gameTradeNo
字段的值,因此游戏侧需要保证 gameTradeNo
在本游戏内的的所有渠道中是全局唯一的。
签名算法
与 SDK 服务端通用签名方法一致,私钥为 SDK 分配给游戏服务端的 key。 详见文档 安全性
请求参数
可选参数,在符合游戏业务特性的情况下,请尽量提供,越全越好。
Name | Type | Description | Must |
---|---|---|---|
uid | Number | 用户 ID | Yes |
roleId | String | 角色 ID | Yes |
productId | String | 商品 ID | Yes |
gameTradeNo | String | 游戏订单号 | Yes |
sign | String | 对请求参数的签名 | Yes |
serverId | String | 游戏服 ID | No |
gameCallbackUrl | String | 支付通知回调地址 | No |
payDescription | String | CP 方透传信息 | No |
响应参数
Name | Type | Description | Must |
---|---|---|---|
code | String | 0 表示成功,其他值表示失败 | Yes |
reason | String | 描述信息 | 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"
}