跳到主要内容

预下单

信息

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

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

时序图

预下单 API

Post /pay/preorder/omni-app-id

提示

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

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

签名算法

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

请求参数

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

NameTypeDescriptionMust
uidString用户 IDYes
roleIdString角色 IDYes
productIdString商品 IDYes
totalAmountNumber总面额,单位分Yes
gameTradeNoString游戏订单号Yes
signString对请求参数的签名Yes
zoneIdString游戏区 IDNo
serverIdString游戏服 IDNo
roleNameString角色名称No
roleLevelString角色等级No
roleVipLevelString角色 VIP 等级No
currencyNameString国际标准货币代码,比如CNY(人民币)/USD(美元)No
productNameString商品名称No
productDescString商品描述No
productQuantityNumber商品数量No
productUnitPriceNumber商品单价,单位分No
gameCallbackUrlString支付通知回调地址No

响应参数

NameTypeDescriptionMust
codeString0 表示成功,其他值表示失败Yes
msgString描述信息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"
}