昨天游戏玩家反映 支付2笔订单后 没有收到东西,查询了服务器发现了问题。。。
玩家2笔充值记录 相差10s钟
后台下单数据
客户端 把订单id和iap支付票据 搞叉了。。。。app每次到应用服务器下完单之后,应用服务器给app的订单号 app只保存在内存中 而且是覆盖保存,所以会出现先付款的票据 + 后下单的orderid,解决方案其实也很简单,app把订单id 做队列记录。。。。
比如说 orderid:xxxx---->商品名称:com.kx880.devilhunter.1010011----->票据:xxxxxxxx,下单了A商品 支付成功了还没有收到票据的话,就不让接着买A商品了这是最保险的。。当然也可以让它记着买,先回来的票据就和队列里边先下单的orderid匹配
一个map里边存放购买该队列的所有oriderid,下单一次就队列里边push一个orderid,票据回来一个 就从队列里边取一个orderid 匹配。。。。
伪代码:
m["com.kx880.devilhunter.1010011"] = [1001,1005]
m["com.kx880.devilhunter.1010012"] = [1002,1003]
m["com.kx880.devilhunter.1010013"] = [1004,1005]
回来了一个 com.kx880.devilhunter.1010012 类型商品的票据 那么就让它去和1002 匹配 发给服务器就好了。。。。。。。
具体的 有人已经封装好了客户端的sdk https://juejin.cn/post/6844903538259132430 。。。。。
服务器其实也是可以做这些东西的,client 省略了不少工作
客户端下单的时候,服务器记录 以1001001这个玩家为例,下单之后 就把orderid 加入到队列,如果客户端取消支付了也通知服务器,就把最后一个orderid给删除了。。。。。
支付过后 收到票据发给服务器,服务器去校验,如果校验正常 就告诉客户端,客户端可以去消单了,如果有异常就把当前的消息保存下来(异常可能是自己服务器的网络,也有可能是IAP服务器的问题等等),后台有个定时任务去校验这些第一次校验有异常的订单