2013-03-20 83 views
11

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

当客户的

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

被调用,transactionStateSKPaymentTransactionStatePurchased, 客户发送收据到我们的服务器, 和我们的服务器进行验证。

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

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

接下来,我们的客户应该做什么? 我们应该叫finishTransaction

这导致无效的交易永远在队列中生活? 喜欢在这个问题上说:iPhone in-app purchase: receipt verification

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

但是,如果我们这样做finishTransaction,我们宝贵的用户是通过此收据收取(我们未能验证)对?

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

这是记录在苹果文档的某处吗? 我找不到任何http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html

回答

0

是的,你必须完成交易。

如果你给用户他们想要的东西,那就取决于你。在某些情况下,最好给用户提供他们想要的东西,即使收据无效或假(使用越狱)。特别是当它花费你什么都没有。

+0

我经常看到这个评论,关于只要提供的内容无论如何,如果收据失败。如果你打算这么做,为什么要经历验证收据的麻烦?只是好奇你的意见。 – Scooter 2017-03-05 01:17:48

0

我完成了事务将其从队列中清除,但如果验证失败则不提供额外的内容。如果是无效收据,那么他们不会被Apple收费。如果事实证明,苹果的验证服务器暂时关闭,那么他们将被收费,当他们试图恢复购买(或再次添加)时,他们不会再次收取费用,并且您的应用将获得验证收据的另一个镜头。

如果由于技术原因(如Apple的服务器停机)而导致验证失败,将会非常尴尬,但是我没有其他办法可以阻止某人窃取您的内容。好消息是,如果Apple的服务器出现故障,您可以在弹出窗口中告知用户,并且他们应该稍后重试,最重要的是,他们不会再次收费。

+0

使用易损耗产品时,您需要注意空的in_app阵列。如果in_app为空,您可以使用SKReceiptRefreshRequest来获取收据的另一个副本,以检查购买是否在那里,但如果它是消费品,则不会。来自Apple的消息:“消费品的信息会在收据付款时添加到收据中,并保留在收据中,直到您完成交易。完成交易后,下次收到更新时删除该信息,从而导致一个空的in_app数组,如果你的应用程序只销售消费品“ – Scooter 2017-03-05 01:13:48

相关问题