10

iOS 购买收据服务器验证通常是这样工作的:

  1. 用户在 iPhone 上购买

  2. 您的应用程序将购买收据发送到服务器

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

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

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

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

4

1 回答 1

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]

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

于 2014-04-24T02:10:03.970 回答