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

时间:2012-07-02 02:59:56

标签: ios

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

  1. 在iPhone上购买用户

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

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

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

  5. 服务器将验证结果发送到应用

  6. 但是如果只有第1步成功怎么办?例如,应用程序无法在步骤2中向服务器发送请求,或者应用程序无法在步骤5中从服务器获取响应。 问题是用户已经付款。处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:7)

如果您使用的是 SKPaymentQueue ,那就很简单了。您所要做的就是保持 SKPaymentQueue中的交易,直到' 第5步'当您从服务器获得成功/失败验证结果时。

如果在步骤1到5之间出现任何问题,您的应用仍然可以访问SKPaymentQueue中的交易,并且可以重新处理'不完整交易的重新处理可以在你的应用程序开始(或你喜欢的某个时间间隔)开始。
只需检查SKPaymentQueue即可获得待定/不完整的交易并将其发送到您的服务器(就像' 第2步')。如果您的服务器仍然无法访问,显然您无法进入第5步,因此您无法从队列中删除该事务,并且每次在此处重复处理一次又一次下一个应用开始(或下一个队列检查时间间隔)直到 已完成

实施

实施也很简单,您需要拥有一个' 交易观察员类' SKPaymentTransactionObserver
在应用开始时,创建一个'事务观察者类的实例'这应该通过以下方式注册:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]

然后'交易观察员班'获取方法中的事务:

(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

您可以使用此方法处理和重新处理所有未完成的交易。

请注意,您的服务器必须幂等(即,如果已经处理,则能够处理重复的交易)
一旦服务器处理并完成步骤2到4 ,那么它将成为具有成功/失败结果的应用程序,并且唯一的时间当您想要通过调用:

从队列中删除该事务
[[SKPaymentQueue defaultQueue] finishTransaction: transaction]

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