Appearance
支付回调通知
支付流程
U8SDK完整支付流程如下图,。
上图中各个步骤说明:
1、游戏客户端,向游戏服务器请求充值数据.
2、如果游戏有自己的订单系统,这个时候游戏服务器比如生成一条订单数据,然后将订单号等信息返回给客户端.
3、游戏客户端调用U8SDK的支付接口(Pay方法),并将需要在支付通知回调中原封不动传给游戏服务器的数据,比如上一步中的游戏订单号,放入PayParams的extension中.
4、U8SDK框架请求U8Sever充值.
5、U8Server会在订单系统中生成一条订单记录,并将订单状态设置为“支付中”.
6、U8Server返回生成的唯一订单号给客户端.
7、U8SDK调用渠道SDK的支付接口,客户端会打开SDK的支付界面,玩家在SDK支付界面上完成支付操作.
8、玩家完成支付操作之后,SDK服务器端会异步通知给U8Server.
9、U8Server收到充值回调,根据当前渠道SDK的要求,验证合法,并将之前U8Server生成的订单状态改为“处理成功”.
10、U8Server验证成功,给渠道SDK服务器返回一个成功(SUCCESS)或者失败(FAIL)的状态.
11、然后U8Server会异步通知给游戏服务器。 回调通知的地址,优先使用游戏客户端调用U8SDK支付接口传入的payNotifyUrl;如果没传,则使用U8Server后台——>游戏管理中配置的支付回调地址.
12、游戏服务器收到U8Server支付回调时,从回调数据的extension字段中取出之前存放的自定义数据,并校验U8Server返回的商品ID,金额等信息.
13、游戏服务器收到回调,验证成功与否,立马返回给U8Server一个成功或者失败的信息.
14、然后游戏服务器给玩家对应的角色账户中,增加对应的游戏币,并通知给游戏客户端.
签名规则
登录认证协议中的sign字段生成规则如下:
1)除了sign字段和值为空的字段, 将其余字段按照字段key值的升序排列, 然后按照key=value&key=value.....拼接成字符串。(注意接收到字段后,需要先进行url decode,再进行签名计算);
2) 将上述生成的字符串,最后附加&secretKey={SDK Key参数}格式生成待签名字符串。 {SDK Key参数}替换为分配的AppSecret参数;
3)对上面得到的待签名字符串,做md5(32位大写)计算,生成对应的sign;
4) 如果是支付回调协议,将生成的sign和协议请求返回的sign进行比对,如果一致才给玩家发货。
协议内容
当U8聚合SDK服务端收到渠道平台的支付回调,并处理成功时(失败的时候不会通知游戏服务器),我们会请求游戏服务器的发货通知地址,通知游戏服给玩家发货。
这个回调的地址, 客户端在调用支付接口的时候, 通过payNotifyUrl字段传入; 也可以在U8SDK后台-》游戏管理中配置。
1 请求协议
请求地址:游戏服接收请求的http地址
请求方式:POST
请求参数格式:application/x-www-form-urlencoded
参数编码: UTF-8
请求参数:
参数名称 | 参数类型 | 参数说明 |
---|---|---|
appID | String | 当前游戏的appID |
orderID | String | SDK 平台订单号 |
userID | String | SDK 平台用户唯一ID |
price | String | 充值金额,单位:分 |
currency | String | 货币单位,固定值:CNY |
cpOrderID | String | 游戏订单号 |
channelOrderID | String | 渠道平台的订单号 |
extra | String | 客户端调用支付接口传入extension字段的值 |
orderTime | String | 充值时间,从1970年到现在的时间戳,单位秒 |
timestamp | String | 回调通知时的时间戳,单位毫秒 |
productID | String | 商品ID |
roleID | String | 角色ID |
serverID | String | 服务器ID |
testStatus | String | 是否是测试订单 1: 测试订单; 0:正式订单 |
sign | String | 签名,签名算法规则见下方《签名规则》部分,这里使用的secretKey是分配的AppSecret参数 |
2 响应内容
游戏服务器收到支付回调请求之后, 校验签名正确后, 给聚合SDK服务端返回文本字符串:SUCCESS; 否则返回文本字符串:FAIL
3 注意事项
1) 因为SDK服务器在极端情况下,同一笔订单,有可能会重复通知给游戏服务器。 所以,建议游戏服务器对同一笔订单,如果已经给玩家发货,应该对该订单做好发货标记,当再次受到该订单的发货通知时,应直接忽略,并给SDK服务器返回SUCCESS响应
2) 游戏服务器收到回调后, 应检查当前商品金额,商品ID,角色信息是否匹配, 只有匹配的情况下,才应给玩家发货。