做内购的时候,遇到一个很棘手的掉单场景。
必先的一个丢掉场景:
当用户购买的时候,账号并未绑定银行卡/微信/支付宝的情况下,苹果会引导用户进行绑定,当用户绑定成功后,并购买成功,但是回到我们自己的APP里面,却没收到回调。导致掉单。(我试了两个不star比较多的内购第三方,都有这个问题)
分析发生上面问题的原因
发生上面情况的根本原因是:
苹果在发现用户未绑定银行卡/微信/支付宝的时候,返回了失败通知,当用户绑定完并支付完成后,又返回了成功的通知。
这时候就出问题了,正常的第三方封装block回调的逻辑是:收到结果回调后,就不再监听新的结果了。所以,导致后面支付完成的回调,就无法监听到了。。。。。导致掉单。
解决办法:
在 AppDelegate 里面添加: (内购的发起方法可以用第三方的,自己写内购监听的回调方法,避免上面的情况,监听不到。)
/// 添加内购监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
// 自己添加内购监听,不销毁,保证一直能收到购买的回调。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
// 请求自己后台的购买逻辑。
break;
case SKPaymentTransactionStateFailed:
[self payError:transaction];
break;
case SKPaymentTransactionStateRestored:
default:
break;
}
}
}
}
需要注意的是:
// 意味着本地票据里面就删除了appStoreReceiptURL 里面就会去掉了。
// 苹果返回购买失败的时候调用。并且自己后台返回成功的时候调用。
if ([SKPaymentQueue defaultQueue]) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
对我帮助比较大的一个内购掉单文章:
https://www.jianshu.com/p/c4e24d4eebd9
非常感谢作者。
网友评论