如果iOS购买收据验证失败怎么办?

巫妖王*_*巫妖王 8 ios

iOS购买收据服务器验证通常如下所示:

  1. 用户在iPhone上购买

  2. 您的应用已将购买收件人发送到服务器

  3. 服务器收到收件人并将其发送给Apple进行验证

  4. 服务器从Apple获取验证结果.

  5. 服务器将验证结果发送给应用程序

但是如果只有第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)

最后,为您的用户提供他们此时购买的高级功能.