【问题标题】:Restore purchase vs. receipt validation恢复购买与收据验证
【发布时间】:2020-04-30 03:11:54
【问题描述】:

我有一个具有自动续订订阅的 macOS 应用程序。我正在阅读文档,无法完全理解这个概念。根据文档,我必须在支付队列中添加和观察者。如果重新安装了应用程序,我必须提供恢复功能来恢复购买。我的观察者正在监听队列,一旦我调用 SKPaymentQueue.default().restoreCompletedTransactions() 方法,它就会恢复交易。但是,我看不到订阅是否过期或不只是使用观察者。我在支付队列中收到的交易对象只有一些抽象的交易 ID。

文档建议验证收据。我将 base64 编码的收据发送到我的服务器,然后将其发送到 verifyReceipt 端点。即使我发送旧收据,Apple 也会以包含 latest_receipt_info 的 JSON 响应,我可以在其中看到订阅的当前状态及其到期日期。如果到期日期早于当前日期,我可以假设订阅无效。

问题是为什么我必须调用 SKPaymentQueue.default().restoreCompletedTransactions() 方法来恢复购买,如果我可以刷新收据(如果它丢失)并将其发送到我的服务器并获取最近的信息?在我看来,这是多余的。所以我的用法是:

  • 收听支付队列
  • 当我看到具有特定 productId 且到期日期晚于当前日期的交易时,在我获得购买状态的交易后立即执行收据验证并解锁付费功能
  • 如果我看到具有特定 productId 且到期日期晚于当前日期的交易,则在用户单击恢复按钮时执行收据验证并解锁付费功能
  • 在每次启动应用程序时执行收据验证以检查订阅状态
  • 如果应用未关闭但订阅已过期,则每 12 或 24 小时执行一次收据验证以禁用付费功能

我是否清楚地理解了这个概念,或者我在这里遗漏了什么,因为我没有看到调用 SKPaymentQueue.default().restoreCompletedTransactions() 方法的好处?

【问题讨论】:

    标签: macos in-app-purchase app-store


    【解决方案1】:

    你的理解是正确的。 restoreCompletedTransactions() 方法将使您不必在每次启动应用程序时执行收据验证,这最终可能会变得昂贵,并且只有在用户明确触发它时才这样做。在收据刷新期间也存在一些情况,可能会提示用户输入他们的 Apple 登录信息,如果以编程方式触发,这可能是一种令人困惑的体验。

    理想情况下,您将整个收据文件保存在您的服务器上,并按照您提到的那样每 12-24 小时在服务器端执行一次收据验证。无论用户是否打开应用程序,这都可以让您保持订阅状态为最新。然后在每次应用程序启动时,您可以对后端进行轻量级调用以检查订阅状态,而不是每次启动时都发出完整的收据验证请求。

    【讨论】:

    • 是否有任何机制可以仅根据用户的应用商店收据来识别用户?似乎唯一的选择是提示用户在我的服务中注册?这对我的应用程序来说太过分了。我想保留后端仅用于验证来自苹果的收据。
    • 收据中没有用户标识符。您可以做的是生成一个 UUID 并将其缓存在用户默认值中。如果用户重新安装应用程序并恢复购买,您只需要一些逻辑(基于事务 ID)来合并 UUID。如果学习构建订阅跟踪系统不是您的目标,您可以研究托管解决方案,例如 -> github.com/RevenueCat/purchases-ios
    • 有服务器到服务器的通知可以异步关注订阅状态developer.apple.com/documentation/storekit/in-app_purchase/…
    猜你喜欢
    • 2011-10-12
    • 2011-08-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多