要想处理丢单,就要搞清楚哪些环节会出现丢单的情况。
首先来理一下支付流程:
1.调用IAP接口发起支付
2.支付成功,获取App Receipt票据,调用充值接口验证
3.验证通过,给用户充值虚拟货币并回调给 App
在IAP支付的机制中,每次支付行为或每笔交易被认为是一个SKPaymentTransation,只有当SKPaymentTransation被finishTransaction:,这次支付(交易)行为才算是正常结束了。即使这次支付途中被中断,其实也并没有丢失。假设支付没有完成 App 就退出了(比如崩溃),那么当下次 App 重启之后,只要设置了监听addTransactionObserver:,之前被中断的支付就会接着进行。
1.第一步,客户端发起支付之后,苹果那边正在处理支付,客户端由于某种原因被kill了,支付结果并不能返回到客户端,但是苹果那边确实扣款成功。
2.第二步,客户端拿到支付结果和支付凭证之后,向服务端发送App Receipt票据之前,客户端被kill,也会导致扣款成功,服务端订单状态没有修改。
针对第一种情况,可以在 App 一启动就设置监听,如果有未完成的支付,则会回调- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;这个方法,在这个方法里调用接口充值。
针对第二种情况,客户端可以在收到苹果返回支付成功,获取支付凭证App Receipt票据之后,将订单号,App Receipt票据缓存到本地,待发起验证订单请求,服务端返回正确结果之后,将该缓存结果删除,结束本次交易。每次app启动之后,就检查是否有未删除的订单,如果有,就向服务端重试验证支付结果,服务端返回正确结果之后,将该缓存结果删除,结束本次交易。
网友评论