如果 iOS 购买收据验证失败怎么办?

Posted

技术标签:

【中文标题】如果 iOS 购买收据验证失败怎么办?【英文标题】:What if iOS purchase receipt verification failed? 【发布时间】:2012-07-02 02:59:56 【问题描述】:

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

    用户在 iPhone 上购买

    您的应用将购买收据发送到服务器

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

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

    服务器将验证结果发送给应用

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

【问题讨论】:

我不允许在没有互联网连接的情况下购买。当然,信号可能会在交易完成后和联系服务器之前“死亡”......风险的小窗口。 我不知道事情是如何运作的,但从描述来看,我认为购买只有在第 3 步之后才有效(付款)。至于第 5 步,您的应用可以与服务器同步到从不活动状态恢复购买,或者如果您没有收到任何购买验证,则在有 Internet 连接时继续重试。 @ranReloaded 正确。所以如果发生这种情况,用户肯定会抱怨,因为他们付了钱却一无所获 无论何时交易完成(在与 Apple 验证收据之前或之后 - 我相信它之前。收据验证是开发人员确保交易有效的安全奖励),只要产品是非消耗品,您始终可以使用 -[SKPaymentQueue restoreCompletedTransactions] 免费恢复它(需要用户认证) 这个不是,但其他的是:) 【参考方案1】:

如果您使用的是 SKPaymentQueue,那么这很容易。您所要做的就是保留 SKPaymentQueue 中的transaction 直到'step 5' 当您从服务器获得成功/失败验证结果时.

如果在第 1 步到第 5 步之间出现任何问题,您的应用仍然可以访问 SKPaymentQueue 中的交易并且可以“重新处理”它。重新处理不完整的交易可能会在您的应用启动(或您喜欢的某个时间间隔)开始。只需检查 SKPaymentQueue 以获取待处理/未完成的交易并发送将它们发送到您的服务器(就像“第 2 步”一样​​)。如果您的服务器显然仍然无法访问,您将无法进入第 5 步,因此您不会从队列中删除事务,并且此重新处理会一次又一次在下一次应用启动时发生(或下一个队列检查时间间隔)直到满足

实施

实现也很简单,你需要有一个SKPaymentTransactionObserver的'交易观察类'。 在应用启动时创建一个“事务观察器类”的实例,它应该通过调用来注册自己:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]

然后'事务观察类'在方法中获取事务:

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

您可以在此方法中处理和重新处理所有未完成的交易。

请注意,您的服务器必须是幂等的(即,如果重复事务已被处理,则能够处理它们) 一旦服务器处理并完成步骤 2 到 4,那么应用程序就会出现成功/失败结果,这是唯一一次您要删除 strong> 该事务从队列中调用到:

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]

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

【讨论】:

SKPaymentQueue 是否保留交易直到我们完成它,比如 UserDefault ?如果用户删除应用怎么办? 请注意,如果您有待处理的自动续订交易,您将无法再次购买该订阅。

以上是关于如果 iOS 购买收据验证失败怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

IOS应用内购买验证或数据检索

Google Play 购买中签名验证失败

iOS 7:应用内购买收据验证和验证

iOS - 如何延迟显示消息“购买成功”以等待验证收据完成

iOS:React Native:应用内购买:收据验证

iOS 7 本地(设备上)收据验证和应用内购买检查