我已经建立了一个服务器端点来验证用户的收据。我的用户在iOS设备上,可以从AppStore购买订阅。
今天,我在日志中注意到某些用户的JSON收据缺少latest_receipt_info
:
{
'receipt': {
'receipt_type': 'Production',
'adam_id': 13052xxxx,
'app_item_id': 13052xxxx,
'bundle_id': 'com.xxx.xxx.vpn',
'application_version': '2',
'download_id': 7504221xxxx,
'version_external_identifier': 8303xxxx,
'receipt_creation_date': '2019-02-20 05:27:15 Etc/GMT',
'receipt_creation_date_ms': '1550640435000',
'receipt_creation_date_pst': '2019-02-19 21:27:15 America/Los_Angeles',
'request_date': '2019-02-20 06:53:53 Etc/GMT',
'request_date_ms': '1550645633891',
'request_date_pst': '2019-02-19 22:53:53 America/Los_Angeles',
'original_purchase_date': '2019-02-11 09:03:16 Etc/GMT',
'original_purchase_date_ms': '1549875796000',
'original_purchase_date_pst': '2019-02-11 01:03:16 America/Los_Angeles',
'original_application_version': '2',
'in_app': []
},
'status': 0,
'environment': 'Production'
}
在我的服务器端点中,我拒绝任何没有latest_receipt_info
的收据:
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
但是似乎我可能会误认为我的方法,因为文档中说明了有关状态的信息:
状态:如果收据有效,则为0,或者为错误代码之一 在表2-1中列出。
换句话说,状态为0,表示有效。但是我没有看到任何expiry_date或可以验证收据的过期日期的任何内容。
我在文档中找不到任何内容。我该怎么办?我应该自动信任状态为0的收据吗?
文档还对latest_receipt_info
说了这一点,我不清楚:
latest_receipt_info:仅返回包含以下内容的收据 自动续订的订阅。
但是,除非用户明确取消订阅,否则应用商店上的每个订阅都会自动更新。是什么使这些收据没有latest_receipt_info
?这是否意味着他们已取消它,并且处于最后周期?谢谢您的建议。