苹果支付丢单问题如何解决?

苹果支付的流程一般是这样的:

1. 客户端支付成功,拿到receipt
2. 客户端将receipt传到服务端 
3. 服务端去apple验证receipt 如果验证成功 就发放receipt中的商品

但是如果因为网络原因1、2步骤出问题(客户端没收到来自苹果服务器的receipt,或客户端没能成功将receipt发送到服务端),服务端未收到receipt的情况下自然就不会发放商品,甚至都没有该条订单记录,出现丢单的问题。

请问这种问题有好的解决办法吗?

为什么苹果支付没有类似支付宝和微信支付的服务端异步通知功能,来确保不丢单呢。。。

阅读 6k
2 个回答

1、2:我的做法是在得知支付成功结果时立即将receipt保存下来,此外还有userId和productId等信息存储,然后再向服务端发起验证请求
3:与服务端约定了几种返回的状态:
1)成功,删除本地缓存,关闭订单
2)失败,删除本地缓存,关闭订单
3)服务器失败或者超时,允许重试,可以通过恢复内购购买
4)商品信息为空,可能因为苹果数据同步问题服务端尚未查到指定productId的问题,等待下次重试(实际这个做法还抓到了一台越狱设备的充值行为)

如果不确认订单确实是完成了或者是失败了,不要轻易关闭订单;
应用启动时去遍历历史订单,如果存在则依次递归重发;

这个方案解决了99%的充值问题,剩下的就是提供反馈渠道,用户可凭单据信息然后我们去后台查询充值情况,就再也没有为此事操过心

因为苹果比较霸道,人家就这么干,你也没办法。
客户端没拿到结果的时候,好像只要监听不关闭,你还是能拿到的,哪怕机器重启,但是没试过。这种如果真处理不好,不是还有客服么。
客户端拿到结果到服务端去验证时候,这时候,客户端最好本地先用队列保存一份,只有服务器明确给成功、失败时候在删除,其他结果均保留,服务器自己也存下来,客户端过来时候同步请求验证吧,另一方面做个定时任务去扫描未知状态的列表。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题