Appearance
支付回调通知
支付流程
U8SDK完整支付流程如下图,。
上图中各个步骤说明:
1、游戏客户端,向游戏服务器请求充值数据.
2、如果游戏有自己的订单系统,这个时候游戏服务器比如生成一条订单数据,然后将订单号等信息返回给客户端.
3、游戏客户端调用XSDK的支付接口(Pay方法),并将需要在支付通知回调中原封不动传给游戏服务器的数据,比如上一步中的游戏订单号,放入UOrder的cpOrderID中.
4~7、XSDK请求SDK Sever下单,并返回唯一订单号等数据,紧接着SDK吊起微信/支付宝支付,让玩家支付.
8、玩家支付成功后,支付平台(微信/支付宝)会通知到SDK服务器.
9、SDK服务器在校验订单的合法性后,将SDK中的订单状态更新为【支付成功】.
10、并按【本文档协议】通知给游戏服务器.
11、游戏服务器在收到支付回调请求后,需要校验签名、商品ID、角色、金额等的合法性.
12~13、校验通过后,给玩家发放道具或游戏币,并给SDK服务器返回SUCCESS;如果校验失败,返回FAIL.
14、SDK服务器收到SUCCESS时,会将当前订单的通知状态设置为【已通知】,否则SDK服务器会定时重试,最多重试10次.
签名规则
登录认证协议中的sign字段生成规则如下:
1)除了sign字段和值为空的字段, 将其余字段按照字段key值的升序排列, 然后按照key=value&key=value.....拼接成字符串。(注意接收到字段后,需要先进行url decode,再进行签名计算);
2) 将上述生成的字符串,最后附加&secretKey={SDK Key参数}格式生成待签名字符串。 {SDK Key参数}替换为分配的【AppSecret】参数;
3)对上面得到的待签名字符串,做md5(32位大写)计算,生成对应的sign;
4) 将生成的sign和协议请求返回的sign进行比对,如果一致才给玩家发货。
协议内容
当XSDK服务端收到支付平台的支付回调,并校验成功时(失败的时候不会通知游戏服务器),我们会请求游戏服务器的发货通知地址,通知游戏服给玩家发货。
这个回调的地址, 客户端在调用支付接口的时候, 通过payNotifyUrl字段传入; 也可以在SDK后台-》游戏基础配置-》回调地址中配置:
1 请求协议
请求地址:游戏服接收请求的http地址
请求方式:POST
请求参数格式:application/x-www-form-urlencoded
参数编码: UTF-8
请求参数:
参数名称 | 参数类型 | 参数说明 |
---|---|---|
appID | String | 当前游戏的appID |
orderID | String | SDK 平台订单号 |
platformOrderID | String | 支付平台订单号 |
price | String | 下单金额,单位:分 |
realPrice | String | 如果有配置折扣,那realPrice是折扣后的实际充值金额;否则,等同于price |
currency | String | 货币单位,固定值:CNY |
cpOrderID | String | 游戏订单号 |
extra | String | 客户端调用支付接口传入extra字段的值 |
orderTime | String | 充值时间,从1970年到现在的时间戳,单位秒 |
timestamp | String | 回调通知时的时间戳,单位毫秒 |
productID | String | 商品ID |
roleID | String | 角色ID |
serverID | String | 服务器ID |
sign | String | 签名,签名算法规则见上方《签名规则》部分,这里使用的secretKey是分配的【AppSecret】参数 |
2 响应内容
游戏服务器收到支付回调请求之后, 校验签名正确后, 给聚合SDK服务端返回文本字符串:SUCCESS; 否则返回文本字符串:FAIL
3 注意事项
1) 因为SDK服务器在极端情况下,同一笔订单,有可能会重复通知给游戏服务器。 所以,建议游戏服务器做好幂等处理。
2) 游戏服务器收到回调后, 应检查当前商品金额,商品ID(商品ID和金额的匹配性),角色信息(角色和uid的匹配性)是否匹配, 只有匹配的情况下,才应给玩家发货。
3)因为SDK可能会迭代变更, 回调协议参数中可能会增加新的参数。 建议游戏方解析验证签名时,不要写死, 除了sign之外的所有参数, 按签名规则进行验证。