在iOS中理解收据验证和收据刷新

19

我们在理解iOS中的收据验证流程方面存在问题。

以下是我们目前的做法(在开发中):

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

以下是一些问题/疑问:

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

  2. 是否应该总是在没有收据时发出收据刷新请求?

  3. 为什么有时会在启动时显示此警报框?我知道这是在进行收据刷新请求时显示的。

需要登录吗?

  1. 何时应执行收据验证?我们当前在进行购买以验证购买时执行它,这是正确的用法吗?
4个回答

13
  1. 在生产环境中,设备上始终有购买收据。但在测试环境中,第一次安装后没有收据。因此,如果您想进行正确的测试,即使在测试环境中该用户没有购买记录,也必须恢复购买。为什么?从应用商店下载的应用即使是免费的,也始终带有收据。
  2. 这取决于您要应用的业务逻辑。如果您每次启动应用都会将收据与服务器验证,那么当然需要收据。如果它不存在(但在生产环境中始终存在)或无效,则可以要求刷新或还原,但据我所记,您应该始终先询问用户是否想要这样做(可能是被拒绝的原因)。还原和刷新不是同一件事。
  3. 这通常出现在购买/还原/刷新中。但如果账户有一些待处理请求,因为应用程序崩溃或者在请求结束之前中断了调试,你会被很多次这类提示打扰。没有办法以编程方式清空它们,只能登录直到它们停止。当然这并不是一个有效的测试。
  4. 这取决于您和购买的种类。如果是自动续订订阅,您可以对收据进行验证,然后在客户端上存储“结束日期”,并在日期过期后进行另一次检查。请注意,收据可能会相当大,因为它们还包括所有历史值。

1
我认为这是一个相当不错的答案,谢谢。那么,如果我们不像在启动时验证收据那样严格,每次购买后进行验证是否是个好点呢?我们也不想遇到你提到的第二点。所以流程应该是:1)用户购买订阅。2)验证收据。3)验证成功:为到期日期安排本地通知(这是一种安全的方法吗?)。4)收据到期通知触发->重新验证或锁定高级功能。这样处理看起来合适吗? - the_critic
1
我真的取决于购买的类型。如果不是订阅,购买后立即进行验证对我来说听起来还可以。如果是订阅,您必须知道它的结束时间,因此您提供的流程很好,除了本地通知之外。假设您正在购买每月自动续订的订阅,每个月如果用户不停止自动续订机制,则会自动续订订阅。我尝试理解何时会发生这种情况,但没有成功,可能是在实际到期日期前几天。 - Andrea
自动化意味着您无需做任何事情。我会在本地保存(钥匙串)过期日,当接近该日期时,我会再次发送收据进行验证,直到它过期或更新。如果验证看到一个新的月份,我会更新日期;如果收据已过期,我会弹出警告,如“您的订阅似乎已过期$结束日期$,您是否要尝试刷新”?您可以在不询问用户的情况下将收据发送到验证服务器,但您不能在未经用户同意的情况下刷新或恢复。 - Andrea
你能否给我关于这个问题的建议?https://stackoverflow.com/questions/47712225/auto-renewable-subscription-wrong-time-response-sandbox-mode - Siddharth

2
  1. 正如张所述,如果没有发生购买或恢复操作,商店中就不会有收据。
  2. 找到收据。如果找不到收据,则验证失败,您不应再次请求刷新收据。只有在您自己进行恢复过程时,才应再次请求收据。
  3. 每当您尝试刷新收据(或从设置中选择您不想要15分钟内再次输入密码)时,都会显示此信息。
  4. 是的。

更多信息,请参见: https://www.objc.io/issues/17-security/receipt-validation/#about-validation


1

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

然而,在沙盒中,如果您的应用程序是通过Xcode或Testflight安装的,则在进行购买或恢复之前不会有收据。

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

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


0

1. 没有购买/恢复发生。
2. 不是的。参见1
4. 当然。对于可消耗产品,请记得在您的服务器上保存哈希值,以防止重放攻击。


我在这里并不完全理解。验证收据是用来检查交易是否有效的,对吗?所以在交易状态为.Purchased之后,我调用验证收据来验证订单。如果收据无效,则标记该交易为欺诈,对吗? - TomSawyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接