【问题标题】:How to detect and verify a renewal for an auto-renewable subscription?如何检测和验证自动续订订阅的续订?
【发布时间】:2023-03-10 20:21:02
【问题描述】:

所以我为我的应用设置了一个自动续订订阅,为期 1 个月,相当于沙盒中的 5 分钟左右。在我订阅的客户端应用程序中,将收据发送到我的服务器,它得到验证,然后我在我的数据库中记录了该用户已订阅的记录。

我的问题是如何检查此订阅是否已续订?我已经阅读了文档,但不知道我该怎么做。

这是我目前所处的位置:

  1. 发送到我的服务器的初始收据经过验证,状态为0,太好了。我还收到了latest_receipt,我在我的数据库中用最旧的收据替换了它。
  2. 6 分钟后,当我尝试验证 latest_receipt 时,我得到状态 21006(已过期的收据),并且:
   { receipt: 
       { original_purchase_date_pst: '2013-08-06 11:58:04 America/Los_Angeles',
         unique_identifier: '------------',
         original_transaction_id: '----------',
         expires_date: '1376129825000',
         transaction_id: '------------',
         quantity: '1',
         product_id: 'subscription',
         item_id: '--------',
         bid: 'com.--------',
         unique_vendor_identifier: '---------',
         web_order_line_item_id: '---------',
         bvrs: '2.0',
         expires_date_formatted: '2013-08-10 10:17:05 Etc/GMT',
         purchase_date: '2013-08-10 10:12:05 Etc/GMT',
         purchase_date_ms: '1376129525000',
         expires_date_formatted_pst: '2013-08-10 03:17:05 America/Los_Angeles',
         purchase_date_pst: '2013-08-10 03:12:05 America/Los_Angeles',
         original_purchase_date: '2013-08-06 18:58:04 Etc/GMT',
         original_purchase_date_ms: '1375815484000' },
      latest_expired_receipt_info: 
       { original_purchase_date_pst: '2013-08-06 11:58:04 America/Los_Angeles',
         unique_identifier: '-------',
         original_transaction_id: '-',
         expires_date: '1376129825000',
         transaction_id: '-',
         quantity: '1',
         product_id: 'subscription',
         item_id: '-',
         bid: 'com.-',
         unique_vendor_identifier: '--',
         web_order_line_item_id: '-',
         bvrs: '2.0',
         expires_date_formatted: '2013-08-10 10:17:05 Etc/GMT',
         purchase_date: '2013-08-10 10:12:05 Etc/GMT',
         purchase_date_ms: '1376129525000',
         expires_date_formatted_pst: '2013-08-10 03:17:05 America/Los_Angeles',
         purchase_date_pst: '2013-08-10 03:12:05 America/Los_Angeles',
         original_purchase_date: '2013-08-06 18:58:04 Etc/GMT',
         original_purchase_date_ms: '1375815484000' },
      status: 21006 }

数组中的第二个元素以前是latest_receipt_info,但现在是latest_EXPIRED_receipt_info。这是文档所说的:

除了receipt_data字段,响应还可能包括 两个新领域。 如果用户的订阅处于活动状态并且 通过在收到您的 服务器发送到 App Store,latest_receipt 字段包括 此订阅的最后一次续订的 base-64 编码收据此新收据的解码数据也在 latest_expired_receipt_info 字段。您的服务器可以使用这个新的 收据以保存最近续订的记录。

因此,如果我的服务器上次检查后订阅已更新,则更新的解码收据应位于 latest_expired_receipt_info。在该对象中,expires_date 与原始收据的expires_date 相同。

什么鬼?我只想检查子是否处于活动状态。谁能用简单的话解释一下我该怎么做?

谢谢!

【问题讨论】:

    标签: ios app-store in-app-purchase app-store-connect storekit


    【解决方案1】:

    我的经验。假设,我们总是将初始收据发送到 Apple 的服务器。

    无论如何,您将获得至少包含两个字段的 JSON:status(无 cmets)和 receipt(有关您已发送的收据的信息)。

    除此之外:

    1) 如果订阅仍然有效,您还将获得latest_receipt(base64 编码的字符串)和latest_receipt_info(有关收据的信息)。

    2) 如果订阅已经过期,您将额外获得latest_expired_receipt_info(有关上次续订收据的信息)。是的,你只得到关于它的信息,没有 base64 编码的字符串。

    是的,AFAIK,这在任何地方都没有记录。希望对您有所帮助。

    【讨论】:

    • 还有一个直接的问题 - 为什么沙盒不自动更新订阅?或者我如何自己更新?现在收据在 5 分钟后过期,仅此而已。我需要以某种方式测试我的代码。
    • 在沙盒中,您正在使用测试帐户。您不能使用测试帐户登录 iTunes 并禁用订阅的自动续订。为了让您测试这种情况,当您的自动续订订阅过期且不活动时,Apple 在沙盒中仅执行 5 次续订(即您有初始交易,之后有 5 次续订 -> 总订阅队列的长度是您订阅的 6 倍长度)。这将在 8 小时后刷新。或者您可以使用其他测试帐户。
    • 基本上,我只需要验证初始收据即可。这回答了我的问题。
    • @AlexandrPaliy 我有一个疑问,当他取消并再次激活订阅时,主收据会发生什么?是否会生成新收据或会发生什么?
    • 令人难以置信的是,Apple 如何将简单的订阅服务转变为面向开发人员的火箭科学!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多