之前写了一篇关于内购的博客iOS开发-2017苹果内购最新教程
,上线审核很顺利,但是上线后很多问题暴露出来.用户购买了虚拟产品扣费了,但是却没有充值成功.所以单独写一篇博客来总结怎么处理丢单情况的.
-
为什么会丢单
1.客户端监听购买结果回调后- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
后在交易成功的情况下,要拿到transactionReceipt凭证,APP在上传凭证给服务器时发生了网络或各种原因,造成了凭证的丢失,产生了掉单2.在ApplePay付款成功后由于网络或各种原因没有返 Transaction(SKPaymentTransaction),从而不能得到凭证去Apple服务器验证订单的正确性
3.用户操作不当,在购买过程中主动退出....
- 如何解决丢单问题
1.APP在上传凭证给服务器时发生了网络或各种原因,造成了凭证的丢失,产生了掉单
- 解决方案一:
当监听购买结果的回调后,保存交易凭据,等服务器验证成功之后删除交易凭据.每次进入内购的控制器的时候,先去本地拿取交易凭据,如果交易凭据存在,则再去服务器验证.
存在问题:用户丢单后重复购买又丢单,那么上次的交易凭据会被覆盖
解决方案二:
在支付之前需要通过自己的服务器创建订单,在交易成功回调之后,立马将该订单和本次交易凭证存储到数据库中。在用户下次登录的时候,要首先验证该数据库中的交易凭证是否都经过后台验证过并成功给用户商品。
2.不能得到凭证去Apple服务器验证订单的正确性
[SKPaymentQueue defaultQueue]这个队列里面存着所有的已支付,未支付的订单,而且需要手动移除,而APP每次启动的时候都会去判断这个队列里面是否为空,如果不为空的话会调用<SKPaymentTransactionObserver>代理的
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果
, 在验证成功之后移除队列[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
3.在购买过程中加上蒙版,让用户不能进行其他操作
参考资料: