如何查看订阅是不是被取消?

Posted

技术标签:

【中文标题】如何查看订阅是不是被取消?【英文标题】:How to check if a subscription has been cancelled?如何查看订阅是否被取消? 【发布时间】:2019-06-04 08:40:20 【问题描述】:

我已申请对我自己应用的月度订阅进行退款。苹果给了我退款。但我的订阅仍然有效,我可以使用高级功能。

我的应用程序每次使用时都会检查收据的有效性,这证明收据的有效期仍然有效。

这就是我检查它的方式。虽然是我服务器上的 Python,但我希望代码足够清晰,任何人都能理解:

def verify_receipt(receipt):
    r = requests.post(config.APPLE_STORE_URL, json=Subscription.produce_receipt_with_credentials(receipt))
    now = datetime.utcnow()
    if 'latest_receipt_info' in r.json():
        for item in r.json()['latest_receipt_info']:
            dt, tz = item['expires_date'].rsplit(maxsplit=1)
            expires_date = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.timezone(tz))
            expires_date = expires_date.astimezone(pytz.utc)
            expires_date = expires_date.replace(tzinfo=None)
            if expires_date > now:
                return True, expires_date, r.json()['latest_receipt'], item
    else:
        current_app.logger.info('latest_receipt_info not found: %s', r.json())
    return False, None, None, None

基本上,我在“latest_receipt_info”集合中检查每张收据的“expires_date”。如果将来至少设置了其中一项,则高级支票有效。

但就我而言,即使 Apple 已退还订阅费用,他们仍将其保持激活状态,直到下一次续订。

那么定期检查收据有什么意义呢?要是我们 无法赶上提前取消?

对于现有用户而言,将到期日期保存在 UserDefaults 中并在到期日期到期时在本地检查并然后检查下一张收据的有效性,难道不是更高效、更快捷吗?

SWIFT:

UserDefaults.standard.set(expiryDate, forKey: Constants.expiryDate)

更新:

所以根据我收到的答案,我想cancellation_reasoncancellation_date 将在最新收据中的这些字段旁边?

"latest_receipt_info": [
    
      "quantity": "1",
      "product_id": "com.x.sub.weekly",
      "transaction_id": "100000053x",
      "original_transaction_id": "100000053x",
      "purchase_date": "2019-06-03 19:52:05 Etc/GMT",
      "purchase_date_ms": "1559591525000",
      "purchase_date_pst": "2019-06-03 12:52:05 America/Los_Angeles",
      "original_purchase_date": "2019-06-03 19:52:06 Etc/GMT",
      "original_purchase_date_ms": "1559591526000",
      "original_purchase_date_pst": "2019-06-03 12:52:06 America/Los_Angeles",
      "expires_date": "2019-06-03 19:55:05 Etc/GMT",
      "expires_date_ms": "1559591705000",
      "expires_date_pst": "2019-06-03 12:55:05 America/Los_Angeles",
      "web_order_line_item_id": "10000000x",
      "is_trial_period": "false",
      "is_in_intro_offer_period": "false"
      "cancellation_reason": "0", 
      "cancellation_date" "2019-06-03 21:55:05 Etc/GMT"
    ,

我希望有一种方法可以模仿这一点。我如何根据docs 对此进行编码并在无法真正测试的情况下投入生产?

【问题讨论】:

【参考方案1】:

对于退款,您需要检查 cancellation_reason 字段,这将表明客户支持已向用户退款。还有一个cancellation_date 将指示取消发生的时间。

如果该字段存在,那么您的保费支票应该是无效的:

将取消的收据视为从未购买过的收据 制作。

【讨论】:

这是一个很好的答案,谢谢。所以 cancellation_reason 将是“0”或“1”,如果它被取消,但如果它没有被取消,则为零?然后再检查cancellation_date。因为如果用户升级 sub,后者仍然可能发生,这并不意味着它实际上被取消了。有没有办法模仿这个?否则,我必须根据文档对此进行编码并投入生产。这很冒险:(谢谢 哦,顺便说一句,我已经更新了问题以说明我的意思。谢谢 升级不适用于沙盒,因此您将无法测试 cancellation_date :/ 如果您的产品日志中有完整的有效负载,您可以模拟它。 cancellation_reason 应该只在退款时出现。 谢谢,我可以尝试在我的产品中注入检查以保存我的用户名的有效负载并从那里获取。 :-)。太老套了。我不敢相信这个 Apple 没有提供更好的测试方法。

以上是关于如何查看订阅是不是被取消?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone如何取消自动续费

如何检查 PayPal 订阅没有被取消?

如何确定用户是不是取消了 Google Play 订阅?

如何在模拟中验证事件已被取消订阅

取消订阅服务内部的 Observables?

如何查看你的Office 365 账号的订阅