如何查看订阅是否已取消?

时间:2019-06-04 08:40:20

标签: ios in-app-purchase

我已要求我自己的应用每月订阅退款。苹果给了我退款。但是我的订阅仍然有效,可以使用高级功能。

我的应用每次使用收据时都会检查收据的有效性,这证明收据的有效期限一直有效。

这就是我检查的方式。尽管它是在服务器上的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

基本上,我正在检查每个收据的“ expires_date”的“ latest_receipt_info”集合中。如果将来至少要设置其中之一,则保费支票有效。

但就我而言,即使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 个答案:

答案 0 :(得分:1)

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

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

  

对已取消的收据进行处理,就像从未进行过购买一样   制成。