【问题标题】:Is it ever necessary to refresh receipt if you are using doing server-side receipt validation?如果您正在使用服务器端收据验证,是否有必要刷新收据?
【发布时间】:2020-04-08 06:25:14
【问题描述】:

我创建了一个具有自动续订订阅的应用。

以下是我用来知道用户是否有活动订阅的逻辑。

  • 每当调用SKPaymentQueuepaymentQueue(_:updatedTransactions:) 时,我都会尝试使用以下步骤执行收据验证
  • 我检查本地收据是否存在。如果不存在,我使用SKReceiptRefreshRequest 刷新收据。
  • 我将收据信息发送到 App Store 服务器的verifyReceipt 端点。
  • 服务器返回响应,其中包含有关订阅到期日期的信息。
  • 我将到期日期存储在应用程序中,并根据用户是否有有效订阅来显示相应的 UI。

App Store 审核多次拒绝我的应用,因为 SKReceiptRefreshRequest 出错。我无法重现 App Store 审查委员会面临的错误。

在网上搜索解决问题时,我了解到以下有关本地收据的事实-

  • 本地收据始终存在于生产模式中。如果使用 Testflight 或在测试期间安装应用程序,本地收据可能不会出现。 (link)
  • App Store 服务器会返回最新的订阅信息,即使它发送了旧的本地收据 (link)

从以上 2 条信息,我推断在生产中无需调用SKReceiptRefreshRequest,因为即使本地收据旧且本地收据始终存在,App Store 服务器也会提供最新的详细信息正在生产中。


为了让我的应用通过 App Store 审核,我决定删除 SKReceiptRefreshRequest,因为它会在 Testflight 构建中产生错误,并且在生产中不需要。

谁能确认我这样做是否正确?

【问题讨论】:

    标签: ios in-app-purchase receipt-validation


    【解决方案1】:

    你的逻辑有很多缺陷:

    1) paymentQueue(_:updatedTransactions:) 在后台被调用并且(据我所知)已经更新了本地收据。此外,从 App Store 下载的应用程序始终包含收据。所以不需要在那个方法中调用SKReceiptRefreshRequest

    2) SKReceiptRefreshRequest 要求用户输入他的密码以允许刷新收据。由于您在paymentQueue(_:updatedTransactions:) 中触发了在后台调用的方法,我认为这就是刷新请求失败并且Apple 拒绝您的应用程序的问题。然而,这种方法有其存在的原因:在生产中,您需要它来允许用户在重新安装应用程序或在其他设备上恢复购买,而对于调试和 TestFlight 构建,您需要它来获取最新的收据。

    3) 您不应将收据从您的应用发送到 Apple 的端点

    警告

    不要从您的应用调用 App Store 服务器 verifyReceipt 端点。您无法直接在用户设备和 App Store 之间建立受信任的连接,因为您无法控制该连接的任何一端,这使其容易受到中间人攻击。

    Source

    如何进行?

    我建议做以下事情:

    1) 不要在paymentQueue(_:updatedTransactions:) 中触发SKReceiptRefreshRequest

    2) 如果尚未完成,请在您的应用中提供“恢复购买”按钮(调用 SKReceiptRefreshRequest

    3) 实施localserver-to-server 收据验证

    【讨论】:

      【解决方案2】:

      我已经使用以下方式生成收据并将生成的收据发送到服务器进行验证:

      https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store

      【讨论】:

      • 仅链接的答案往往会出现在审核队列中并且通常会被删除。
      • 在该页面的代码sn-p中,可以看到如果收据不存在,则什么都不做。在我的应用程序中,如果收据不存在,我会尝试刷新收据。刷新收据时,来自 Apple 的审阅者出现错误。
      猜你喜欢
      • 2017-02-14
      • 2014-05-22
      • 2013-12-26
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      相关资源
      最近更新 更多