iOS 自动更新订阅:收据验证流程

Posted

技术标签:

【中文标题】iOS 自动更新订阅:收据验证流程【英文标题】:iOS auto-renewable subscriptions: receipt validation flows 【发布时间】:2014-11-10 02:22:24 【问题描述】:

我正在实现一个自动续订订阅方案,其中收据验证将由我的服务器端代码处理。按照 Apple 的documentation,我将从NSBundle 获取收据数据,并将该数据传递到我的服务器,服务器将联系Apple 验证收据并通知应用程序结果。

现在我的问题与收据验证相关的必要流程有关:

    如果用户购买了订阅,我的收据是否会自动更新为购买的信息?如果是这样,是否有必要在购买后立即验证收据,还是应该立即“解锁”应用?

    在什么情况下NSBundle 会丢失我的收据?如果发生这种情况,我想我应该使用SKReceiptRefreshRequest 刷新收据,并将其发送到服务器进行验证。

    如果用户在不同的设备上安装应用程序并恢复他的购买restoreCompletedTransactions,我是否会同时自动获得收据?我想我需要在恢复后验证收据以确保订阅有效,对吗?

    当我的服务器尝试验证收据并且该收据无效时,应用程序端会发生什么?刷新收据(这将要求用户提供凭据)并再次将其传递给服务器以进行新的重新验证?

【问题讨论】:

瑞,你已经弄清楚这其中的来龙去脉了吗?如果您(或其他人)可以提供这个问题的答案,那就太好了。 您也可以查看此关于收据验证的常见问题解答:blog.apphud.com/receipt-validation 【参考方案1】:

如果用户购买了订阅,我的收据会自动更新为购买的信息吗?

是的,收据本质上是存储在设备上的文件,购买后收据文件会更新并附加最新交易。

如果是这样,是否有必要在购买后立即验证收据,还是我应该立即“解锁”应用程序?

这取决于您对欺诈的关注程度。有许多工具可用于破解越狱设备上的应用内购买,并且不验证可以让用户免费访问您的内容。如果这是一个问题,请在解锁内容之前验证您的收据。

在什么情况下我的收据会从 NSBundle 中丢失?

如果用户在购买过程中断开连接,收据数据可能无法完全下载,从而导致您收到不完整的收据。我怀疑还有其他情况,但我自己还没有遇到过。

如果发生这种情况,我想我应该使用 SKReceiptRefreshRequest 刷新收据,并将其发送到服务器进行验证。

是的,但请记住,这只会更新收据文件,然后您需要再次致电 appStoreReceiptURL 以从文件中检索收据。

如果用户在不同的设备上安装应用程序并恢复他的购买 restoreCompletedTransactions 我是否会同时自动获得收据?

收据文件将被更新,但您需要致电appStoreReceiptURL 获取收据。

我想我需要在恢复后验证收据以确保订阅有效,对吗?

是的,好主意。

当我的服务器尝试验证收据并且该收据无效时,应用程序端会发生什么?刷新收据(这将要求用户提供凭据)并再次将其传递给服务器以进行新的重新验证?

我会告诉用户您不相信收据是有效的,并提供重试选项。致电SKReceiptRefreshRequest,再次将收据发送到您的服务器。如果随后失败,请再次显示该选项。

如果用户进行了欺诈性购买,我怀疑他们会向您或 Apple 投诉。

【讨论】:

以上是关于iOS 自动更新订阅:收据验证流程的主要内容,如果未能解决你的问题,请参考以下文章

自动更新 IAP 订阅用户流和刷新收据

从验证收据中检查自动续订订阅到期日期

iOS收据验证 - 自动续订订阅

我是不是必须验证每个 SKPaymentTransaction 订阅的收据?

如何为 iOS 应用实现 iOS 自动续订订阅收据验证

自动更新订阅