因为用户网络情况、苹果服务器稳定情况、以及其他不确定因素,内购不可避免的总是出现掉单情况,这是非常影响用户体验的,所以防掉单机制是非常有必要的。
内购的基本流程
1.客户端下单,下单成功后获取的订单号
2.获取到订单号后,开始内购
- 监听购买流程
- 根据productID获取到具体product对象
- 构建购买对象SKMutablePayment(SKMutablePayment区别与SKPayment可以设置applicationUsername,通过该字段存储订单号,用来处理掉单时候关联订单业务)
- 开始购买
- 处理购买的回调结果,然后结束购买事务[[SKPaymentQueue defaultQueue] finishTransaction: transaction]
3.如果购买成功可以拿到一个购买凭证
4.将购买凭证发送给服务器,服务器跟苹果服务器通信以验证凭证的有效性
5.服务器将验证结果返回给客户端,客户端根据验证结果处理业务
以上为内购基本流程
掉单的场景
1.用户付款中或者付款后,客户端因为某种原因进程结束
2.APP客户端和自己服务器通信失败
3.自己的服务器和苹果的服务器通信失败
客户端工作
客户端需要在APP启动时候,添加[[SKPaymentQueue defaultQueue] addTransactionObserver:manager]监听操作,当还有未完成购买事务(未完成是购买事务并不会因为客户端的卸载重装丢失),将会启动- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions代理方法,我们遍历处理transactions
服务器工作
服务器在和苹果服务器通信中,如果失败应该设置重启验证的措施。同时服务器应该在验证购买凭证之前,先通过订单号,判断该订单是否已经生效,如果没有生效再执行验证操作,验证通过后写入数据库使订单生效,防止一个订单被重复的验证生效。
三方验证
做好以上措施,可以很大程度降低掉单的发生率,但是完全避免还是无法做到,所以我们有时候还是需要通过运营帮忙,拿到用户的购买凭证信息、苹果开发者平台中该APP的内购收入信息,以及我们自己服务器的订单信息,三方核对。
如果有认识不全面或者错误的地方,欢迎大家评论指出