苹果支付的流程一般是这样的:
1. 客户端支付成功,拿到receipt
2. 客户端将receipt传到服务端
3. 服务端去apple验证receipt 如果验证成功 就发放receipt中的商品
但是如果因为网络原因1、2步骤出问题(客户端没收到来自苹果服务器的receipt,或客户端没能成功将receipt发送到服务端),服务端未收到receipt的情况下自然就不会发放商品,甚至都没有该条订单记录,出现丢单的问题。
请问这种问题有好的解决办法吗?
为什么苹果支付没有类似支付宝和微信支付的服务端异步通知功能,来确保不丢单呢。。。
1、2:我的做法是在得知支付成功结果时立即将receipt保存下来,此外还有userId和productId等信息存储,然后再向服务端发起验证请求
3:与服务端约定了几种返回的状态:
1)成功,删除本地缓存,关闭订单
2)失败,删除本地缓存,关闭订单
3)服务器失败或者超时,允许重试,可以通过恢复内购购买
4)商品信息为空,可能因为苹果数据同步问题服务端尚未查到指定productId的问题,等待下次重试(实际这个做法还抓到了一台越狱设备的充值行为)
如果不确认订单确实是完成了或者是失败了,不要轻易关闭订单;
应用启动时去遍历历史订单,如果存在则依次递归重发;
这个方案解决了99%的充值问题,剩下的就是提供反馈渠道,用户可凭单据信息然后我们去后台查询充值情况,就再也没有为此事操过心