了解 iOS 中的收据验证和收据刷新

Understanding receipt validation and receipt refreshing in iOS

我们在完全理解 iOS 中的收据验证流程时遇到了问题。

这是我们目前所做的(开发中):

applicationDidFinishLaunchingapplicationWillEnterForeground我们在服务器端验证收据,如果没有收据或收据无效,我们尝试刷新收据并重新验证。

这里有一些issues/questions:

  1. 设备上没有收据是什么情况?

  2. 我们是否应该在没有收据的情况下总是发出收据刷新请求?

  3. 为什么有时会在启动时显示此警告框?我知道这显示在收据刷新请求上?

  1. 什么时候应该进行收据验证?我们目前在每次购买时都会这样做以验证购买,这是正确的用法吗?

1.No purchase/Restore 发生了。
2.Nope.See 1
4.Sure.For消耗品,记得在服务器上保存hash,以防重放攻击。

  1. 正如小张所说,如果没有购买或恢复,商店将没有收据
  2. 找到收据。如果未找到收据,则验证失败,您不应再次请求收据刷新。只有当您要自行恢复流程时,您才需要重新索取收据。
  3. 这将在您尝试刷新收据时始终显示(或者您将从设置中选择您不想在 15 分钟内询问密码)。
  4. 是的。

有关详细信息,请查看此处: https://www.objc.io/issues/17-security/receipt-validation/#about-validation

  1. 在生产中,收据始终在设备上可用。在测试之后 第一次安装没有。所以如果你想做一个正确的测试, 您必须恢复购买,即使在测试中该用户不存在购买 环境。这是为什么?从应用程序商店下载的应用程序即使是免费的也总是带有收据。
  2. 取决于您要应用的业务逻辑。如果您在每次用户启动应用程序时都针对服务器验证收据,那么您当然需要收据。如果它不存在(但在生产中总是)或无效,你可以要求刷新或恢复,但据我所知你应该总是首先询问用户 he/she 是否想这样做(可以成为拒绝的理由)。 恢复和刷新不是一回事。
  3. 这通常出现在purchase/restor/refresh中。但如果帐户有一些待处理的请求,因为应用程序已崩溃,或者您在请求结束之前以某种方式中断了调试,那么您将对其中的很多事情感到厌烦。无法以编程方式刷新它们,只需登录直到它们停止。当然这不会是一个有效的测试。
  4. 这取决于您和购买的类型。如果它是自动续订订阅,您可以根据服务器验证收据,然后将 "end date" 存储在客户端上,并在日期过期后进行另一次检查。请注意,收据可能很大,因为它们也有所有历史值。

如果用户从 App Store 下载应用程序 – 是的,收据始终存在。

但是,在沙盒中,如果您的应用是通过 Xcode 或 Testflight 安装的,那么在您购买或恢复之前不会有收据。

查看我们博客中有关收据验证的完整常见问题解答:

https://blog.apphud.com/receipt-validation/