Ios 当服务器端收据验证失败时,我是否应该调用finishTransaction?

Ios 当服务器端收据验证失败时,我是否应该调用finishTransaction?,ios,storekit,Ios,Storekit,我使用服务器端收据验证 当客户的 -(void)paymentQueue:(SKPaymentQueue*)队列 更新的交易:(NSArray*)交易 调用,并且transactionState是SKPaymentTransactionState, 客户端将收据发送到我们的服务器, 我们的服务器会验证它 当服务器端收据验证成功时, 客户端显然调用了finishTransaction,没有问题 当服务器端收据验证失败时, 因为apple临时返回了非json,或者客户端发送了无效的回执,或者什么的,

我使用服务器端收据验证

当客户的

-(void)paymentQueue:(SKPaymentQueue*)队列
更新的交易:(NSArray*)交易

调用,并且
transactionState
SKPaymentTransactionState
, 客户端将收据发送到我们的服务器, 我们的服务器会验证它

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

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

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

这会导致队列中永远存在无效事务吗? 正如在这个问题上所说:

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

但是,如果我们完成交易,我们的宝贵用户将从这张收据(我们未能验证)中收取费用,对吗

或者验证失败的事务是否在某个时间段内过期

这在苹果的文档中有记录吗?
我在

中找不到。是的,您必须完成交易


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

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


如果验证因技术原因而失败,比如苹果服务器停机,那将很尴尬,但我看不到其他方法可以防止有人窃取你的内容。好消息是,如果苹果的服务器关闭,你可以在弹出窗口中告诉用户,他们应该稍后再试,最重要的是,他们不会再次充电。

使用耗材时,你需要注意应用程序阵列中是否有空的应用程序阵列。如果in_应用程序为空,您可以使用SKReceiptRefreshRequest获取收据的另一份副本,以检查购买是否在其中,但如果是耗材,则不会。来自Apple:“消费品的信息在付款时添加到收据中,并保留在收据中,直到您完成交易。完成交易后,此信息在下次更新收据时被删除。因此,如果您的应用程序仅销售消费品,则会导致应用程序阵列中出现空信息”我经常看到这样的评论,即如果收据失败,就只提供内容。如果你打算这样做,为什么还要费劲验证收据呢?我只是好奇你对此的看法。@Scooter一个原因可能是为了识别有问题的用户,例如,你可以跟踪数据库中每个用户的失败收据数量。这样你就可以发现可疑行为并采取必要的行动。或者至少监控你的用户群有多“腐败”。也许我们不得不承认,总有一小部分不诚实的人,并权衡这是否对我们的收入流造成了严重影响。