17

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

当客户的

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

被调用,并且transactionStateSKPaymentTransactionStatePurchased,客户端将收据发送到我们的服务器,我们的服务器验证它。

服务端回执验证成功后,客户端明显调用finishTransaction,没问题。

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

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

这会导致无效交易永远存在于队列中吗?就像在这个问题中所说:iPhone应用内购买:收据验证

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

但是如果我们这样做finishTransaction了,我们宝贵的用户就会被这张收据收费(我们未能验证),对吧?

或者验证失败的交易是否会在某个时间段内过期?

这是否记录在苹果文档的某个地方?我在http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html中找不到任何内容

4

2 回答 2

3

是的,你必须完成交易。

如果你给用户他们想要的东西,这取决于你。在某些情况下,最好给用户他们想要的东西,即使收据无效或伪造(使用越狱)。尤其是当它不花钱的时候。

于 2013-09-26T07:46:20.960 回答
3

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

如果验证因技术原因(例如 Apple 的服务器关闭)而失败,那将会很尴尬,但我认为没有其他方法可以防止有人窃取您的内容。好消息是,如果 Apple 的服务器出现故障,您可以在弹出窗口中通知用户,他们应该稍后再试一次,最重要的是不会再次向他们收费。

于 2016-02-29T14:46:05.473 回答