【发布时间】:2017-12-13 19:49:24
【问题描述】:
关于应用内订阅购买,我不太明白一件事。
我在 iOS 客户端上这样获取收据:
private func loadReceipt() -> Data? {
guard let url = Bundle.main.appStoreReceiptURL else {
return nil
}
do {
let receipt = try Data(contentsOf: url)
return receipt
} catch {
print("Error loading receipt data: \(error.localizedDescription)")
return nil
}
}
并将其发送到我的服务器进行验证(用 Python 编写)。
def verify_receipt(self, receipt):
r = requests.post(config.APPLE_STORE_URL, json=receipt)
request_date_ms = DateUtils.generate_ms_from_current_time()
for item in r.json()['latest_receipt_info']:
expires_date_ms = int(item['expires_date_ms'])
if expires_date_ms > request_date_ms:
return True
return False
我不确定这是否是验证订阅是否仍然有效的正确方法。
我从latest_receipt_info 获得expires_date_ms,如果它大于当前时间(以毫秒为单位),则订阅仍视为有效。
但是我注意到,单独的latest_receipt 应该等于我刚刚发送的那个,实际上每次调用 API 时都会发生变化。但为什么?我还没有订阅任何新的东西,为什么最新的收据会改变?
根据文档:
最新收据
仅返回包含自动续订订阅的收据。 对于 iOS 6 风格的交易收据,这是 base-64 编码的 最近续订的收据。对于 iOS 7 风格的应用收据, 这是最新的 base-64 编码应用收据。
【问题讨论】:
-
我在 PROD 中遇到了这个问题,而不是在沙盒中。我在月度和年度订阅中遇到了这个问题。
标签: ios in-app-purchase in-app-subscription