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

Posted

技术标签:

【中文标题】了解 iOS 中的收据验证和收据刷新【英文标题】:Understanding receipt validation and receipt refreshing in iOS 【发布时间】:2016-03-08 13:56:13 【问题描述】:

我们无法完全理解 ios 中的收据验证流程。

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

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

以下是一些问题/疑问:

    设备上没有收据的情况有哪些?

    当没有收据时,我们是否应该始终发出收据刷新请求?

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

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

【问题讨论】:

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

【讨论】:

我认为这是一个非常可靠的答案,谢谢。那么,如果我们不严格到启动时验证收据,那么每次购买后都这样做是一个好点吗?我们也不想遇到第 2 点。)你提到的。所以流程是:1)用户购买订阅。 2)验证收据 3)验证成功:安排本地通知到期日期(这是一种安全的方法吗?)。 4) 已触发收据到期通知 -> 重新验证或锁定高级功能。这似乎是处理这个问题的好方法吗? 我真的取决于购买的类型。如果不是订阅,则在购买后立即进行验证对我来说还可以。如果它是订阅,您必须知道它的结束,因此您呈现的流程很好,除了本地通知。假设您正在购买每月自动续订订阅,如果用户不停止自动续订机制,则每个月都会自动续订订阅。我试图了解这种情况何时发生但没有成功,可能在实际到期日期前几天。 自动意味着你不需要什么都不做。我会在本地(钥匙串)保存到期日,当我在那个日期左右时,我会再次发送收据进行验证,直到过期或更新。如果验证看到新的月份,我会更新日期,如果收据已过期,我会显示类似“您的订阅似乎已过期 $end date$ 是否要尝试刷新”的警报?您可以在不询问用户的情况下随时将收据发送到验证服务器,但不询问用户就无法刷新或恢复。 你能给我建议吗? ***.com/questions/47712225/…【参考方案2】:
    正如张所说,如果没有购买或恢复,商店将没有收据 找到收据。如果没有找到收据,则验证失败,您不应再次请求收据刷新。只有当您自己恢复流程时,您才应该重新索取收据。 这将在您尝试刷新收据时始终显示(或者您将选择在 15 分钟内不要求输入密码的设置)。 是的。

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

1.没有进行购买/恢复。 2.Nope.See 1 4.Sure.对于消耗品,记得在你的服务器上保存hash,以防重放攻击。

【讨论】:

这里我不太明白。验证收据是为了检查这是否是一个有效的交易,对吧?所以在交易状态为.Purchased 之后,我调用验证收据来验证订单。如果收据无效,请标记交易是欺诈,对吗?

以上是关于了解 iOS 中的收据验证和收据刷新的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 lambda 通过 Node.js 验证 iOS 收据

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

错误 21002:使用服务器的 IOS 收据验证

IOS收据验证错误21002

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