预下单
信息
为了确保同一笔订单的请求参数在游戏侧和世游侧一致,防止经过意外篡改,需要增加预下单步骤
由游戏服务器向 OmniSDK 服务器发起预下单请求,请求携带服务端 HMAC-SHA1
签名,OmniSDK 服务器验证后将数据保存,以供 SDK 发起下单时进行校验,
校验通过后才会进行正常下单流程。如果存在恶意用户试图篡改下单请求,则在创建创建订单阶段就能发现并进行拦截。
时序图
预下单 API
Post /pay/preorder/omni-app-id
提示
此 API 支持幂等操作,确保 API 请求仅完成一次。如果原始请求成功完成,则后续重试将返回原始成功请求的结果。因此当出现 HTTP Request Timeout
等预期中的错误时可进行重试。
幂等性的处理,依赖于 gameTradeNo
字段的值,因此游戏侧需要保证 gameTradeNo
在本游戏内的的所有渠道中是全局唯一的。
签名算法
与 SDK 服务端通用签名方法一致,使用 HMAC-SHA1 算法,私钥为 SDK 分配给游戏服务端的 key。 详见文档 安全性
请求参数
可选参数,在符合游戏业务特性的情况下,请尽量提供,越全越好。
Name | Type | Description | Must |
---|---|---|---|
uid | String | 用户 ID | Yes |
roleId | String | 角色 ID | Yes |
productId | String | 商品 ID | Yes |
totalAmount | Number | 总面额,单位分 | Yes |
gameTradeNo | String | 游戏订单号 | Yes |
sign | String | 对请求参数的签名 | Yes |
zoneId | String | 游戏区 ID | No |
serverId | String | 游戏服 ID | No |
roleName | String | 角色名称 | No |
roleLevel | String | 角色等级 | No |
roleVipLevel | String | 角色 VIP 等级 | No |
currencyName | String | 国际标准货币代码,比如CNY(人民币)/USD(美元) | No |
productName | String | 商品名称 | No |
productDesc | String | 商品描述 | No |
productQuantity | Number | 商品数量 | No |
productUnitPrice | Number | 商品单价,单位分 | No |
gameCallbackUrl | String | 支付通知回调地址 | No |
响应参数
Name | Type | Description | Must |
---|---|---|---|
code | String | 0 表示成功,其他值表示失败 | Yes |
msg | String | 描述信息 | Yes |
请求示例
POST /pay/preorder/15985 HTTP/1.1
Host: a2.xgsdk.seayoo.com
Content-Type: application/json
{
"uid": "ios_jinshanApple__ce85e2353065c13b421832__EXP_.",
"zoneId": "1922",
"serverId": "1922",
"roleId": "1005956",
"roleName": "不负韶华",
"roleLevel": "1",
"roleVipLevel": "11",
"currencyName": "CNY",
"productId": "500648",
"productName": "魔石",
"productDesc": "魔石",
"productQuantity": 1,
"productUnitPrice": 64800,
"totalAmount": 64800,
"paidAmount": 64800,
"gameTradeNo": "MY115121520230222162729142623251",
"gameCallbackUrl": "https://foobar.com/callback",
"sign": "bc627cf4028608f5523e41b9ff80c8648e118d32"
}
响应示例
{
"code": "-1",
"msg": "Signature not match"
}