iOS购买收据服务器验证通常如下所示:
用户在iPhone上购买
您的应用已将购买收件人发送到服务器
服务器收到收件人并将其发送给Apple进行验证
服务器从Apple获取验证结果.
服务器将验证结果发送给应用程序
但是如果只有第1步成功怎么办?例如,应用程序无法在步骤2中向服务器发送请求,或者应用程序无法在步骤5中从服务器获取响应.问题是用户已经付款.处理这个问题的最佳方法是什么?
小智 7
如果您使用SKPaymentQueue,那么很容易.您需要做的就是将事务保留在SKPaymentQueue中,直到您从服务器获得成功/失败验证结果的" 步骤5 ".
如果在步骤1到5之间出现任何问题,您的应用仍然可以访问SKPaymentQueue中的交易并可以" 重新处理 "它.
不完整交易的重新处理可以在您的应用程序开始时(或您喜欢的某个时间间隔)启动.
只需检查SKPaymentQueue即可获得待处理/未完成的交易并将其发送到您的服务器(就像" 第2步 "一样).如果您的服务器仍然无法访问,显然您将无法进入步骤5,因此您不会从队列中删除该事务,并且每次在下一个应用程序启动时(或下一个队列检查时间间隔)都会再次发生此重新处理直到被满足.
实现也很简单,你需要有一个SKPaymentTransactionObserver的' 事务观察者类 ' .
在app start创建一个'transaction observer class'的实例,它应该通过调用注册自己:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
Run Code Online (Sandbox Code Playgroud)
然后'transaction observer class'获取方法中的事务:
(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
Run Code Online (Sandbox Code Playgroud)
您可以使用此方法处理和重新处理所有未完成的事务.
请注意,您的服务器必须是幂等的(即,如果已经处理过,则能够处理重复的事务)
一旦服务器处理并完成步骤2到4,那么它将成为具有成功/失败结果的应用程序,这是您希望的唯一时间通过调用以下命令从队列中删除该事务:
[[SKPaymentQueue defaultQueue] finishTransaction: transaction]
Run Code Online (Sandbox Code Playgroud)
最后,为您的用户提供他们此时购买的高级功能.