在服务器端收据验证失败时,我应该调用finishTransaction吗?

时间:2013-03-20 14:19:57

标签: ios storekit

我使用服务器端收据验证。

当客户的

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

调用

transactionStateSKPaymentTransactionStatePurchased, 客户将收据发送到我们的服务器, 我们的服务器验证它。

当服务器端收据验证成功时, 客户显然会调用finishTransaction,没问题。

当服务器端收据验证失败时, 因为苹果临时退回非json,或者客户发送了无效收据,或者其他什么, 服务器将该信息返回给客户端。

接下来,我们的客户应该怎么做? 我们应该致电finishTransaction吗?

这导致无效的交易永远存在于队列中? 就像在这个问题中说的那样:iPhone in-app purchase: receipt verification

  

但如果您发现收据无效,则应完成关联交易。如果没有,您可能会在事务队列中永久存在额外的事务。这意味着每次您的应用运行时,每个事务都会调用一次paymentQueue:updatedTransaction:...

但如果我们finishTransaction,我们的宝贵用户会收到此收据(我们无法验证),对吗?

或者验证失败的交易在某段时间内到期了吗?

这是在Apple的文档中的某处记录的吗? 我在http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html

中找不到任何内容

2 个答案:

答案 0 :(得分:2)

我完成了交易以从队列中清除它,但如果验证失败则不提供额外的内容。如果收据无效,则Apple不会向他们收取费用。如果结果是其他东西,例如Apple的验证服务器暂时关闭,那么他们将被收费,当他们尝试恢复购买(或再次添加)时,他们又不会再收费,您的应用程序将获得验证收据的另一个镜头。

如果由于技术原因(如Apple的服务器停机)验证失败,则会很尴尬,但我无法通过其他方式阻止某人窃取您的内容。好消息是,如果Apple服务器出现故障,您可以通过弹出窗口让用户知道他们应该稍后再试,最重要的是他们不会再次收费。

答案 1 :(得分:1)

是的,你必须完成交易。

如果你给用户他们想要的东西,这取决于你。在某些情况下,最好给用户提供他们想要的东西,即使收据无效或是假的(使用越狱)。特别是当它没有任何成本时。