内购支付(必接)
回调接口说明
- 当玩家在SDK中支付成功时,SDK Server 会异步通知给游戏服务器。游戏服务器收到回调之后, 对参数进行签名验证,同时对金额,商品ID,角色等信息做必要的验证, 验证成功后,给玩家下发道具。
- 异步通知的回调地址, 客户端在调用支付接口的时候, 可以通过payNotifyUrl字段传入。
注意: SDK使用客户端传入的payNotifyUrl地址。
交互流程

回调地址
研发提供服务端接口
参数
form-data格式
| 参数 | 类型 | 是否可为空 | 说明 |
|---|---|---|---|
| appID | String | 否 | 游戏appID |
| orderID | String | 否 | SDK平台的订单号 |
| price | String | 否 | 金额, 分 |
| currency | String | 否 | 货币,默认是USD |
| cpOrderID | String | 否 | 游戏订单号 |
| extra | String | 否 | 扩展数据,客户端调用支付接口传入的extra(若无内容则写1) |
| orderTime | String | 否 | 支付时间戳,1970年开始的秒数 |
| timestamp | String | 否 | 时间戳 |
| productID | String | 否 | 商品ID |
| roleID | String | 否 | 角色ID |
| serverID | String | 否 | 服务器ID |
| sign | String | 否 | 注意:秘钥使用分配的secretKey |
自测示例

签名示例
签名代码可参考签名
appID=10001&cpOrderID=11111¤cy=CNY&extra=1&orderID=1111111111111&orderTime=1111111111&price=1&productID=1&roleID=1&serverID=1×tamp=1111111111&secretKey=AppSecret 6C2D6F001804229616000FDF574406F5
代码示例
@RequestMapping(value = "/orderCallbackDemo", method = RequestMethod.POST)
@ResponseBody
public String orderCallbackDemo(HttpServletRequest request){
Map<String, String> params = new HashMap<>();
//从body form-data中获取参数
Map<String, String[]> paramMap = request.getParameterMap();
for (String key : paramMap.keySet()) {
String[] vals = paramMap.get(key);
if (vals == null || vals.length == 0) {
continue;
}
params.put(key, vals[0]);
}
String sign = request.getParameter("sign");
String serverSign = SignUtils.sign(params, "AppSecret");
if (sign.equals(serverSign)){
//todo 保存订单,异步发货
}
return "SUCCESS";
}
返回值
- 说明
游戏服务器收到支付回调请求之后, 校验签名正确, 给SDK Server返回文本字符串:SUCCESS;否则返回文本字符串:FAIL
注意:离线回调机制,验证通过就返回SUCCESS,道具下发逻辑异步执行,需要支持离线状态,上线领取。游戏才能监控到有效进入退出游戏的状态,更及时的发放物品道具。
支付结果以服务器支付回调通知优先级最高。成功订单可以覆盖失败订单,已成功订单锁死排重不处理。Google支付服务器有低概率出现验证订单票据异常,SDK不会调用支付回调接口。直到重试请求成功或者人工确认订单有效,再补发通知。
示例
SUCCESS