我正在尝试验证自动更新的In App购买是否已过期服务器端(不在设备上)。
我正在使用Apple的Grand Unified Receipt(iOS 7风格的交易)。 Apple返回的响应包含带有一系列收据的in_app
和latest_receipt_info
元素。 in_app
JSON元素包含比latest_receipt_info
更少的收据。我期待两个元素包含相同的数字或收据。
此外,我期待in_app
元素将包含所有收据。然而,似乎latest_receipt_info
实际上包含所有收据。 Apple文档似乎建议使用in_app
查找最新收据。
我很惊讶地看到latest_receipt_info
,因为Apple的文档声明这个元素是“仅针对iOS 6风格的交易收据返回自动续订订阅”。 (不是iOS 7+)。
我应该迭代哪个JSON元素来查找自动更新的iOS 7风格交易的最新收据:in_app
或latest_receipt_info
?
只想表明只有latest_receipt_info
字段才会返回最新的续订收据。这是基于我们实际从Apple获得的回报。
相关文档在page 21.上
虽然它声明latest_receipt
和latest_receipt_info
字段是“仅针对自动续订订阅的iOS 6样式交易收据返回”,但我们发现它们是在我们的iOS 7收据中返回的。 in_app
对象中的receipt
字段也返回了几乎相同的数据,但不包含最新的收据信息,这是您在自动续订时关注的信息。
要验证自动续订订阅是否已过期,请检查latest_receipt_info
元素。
这是目前(2017-08-09)正式记录在in_app
和latest_receipt_info
元素:
in_app
在JSON文件中,此键的值是一个数组,其中包含基于输入base-64收据数据中存在的应用内购买交易的所有应用内购买收据。对于包含自动续订订阅的收据,请检查latest_receipt_info密钥的值以获取最新续订的状态。
(Qazxswpoi)
仅对包含自动续订订阅的收据返回。对于iOS 6样式的交易收据,这是最近续订的收据的JSON表示。对于iOS 7样式的应用收据,此键的值是包含所有应用内购买交易的数组。这不包括已由您的应用标记为已完成的耗材产品的交易。
(Qazxswpoi)
latest_receipt_info
是关于此的最新和最清晰的讨论。希望这可以帮助。
Babken Vardanyan在多个回答帖子中提到有时会丢失latest_receipt_info。我在这个帖子source的收据中看到的一个有趣的事情是latest_receipt_info vs in_app的区别。做差异时,我注意到链中的第一个收据丢失了(包含is_trial_period = true)。它没有生成相应的应用内收据。
正如文档中所述:This表示使用latest_receipt_info作为“iOS 7样式应用收据,此键的值是包含所有应用内购买交易的数组。”
关于订阅,您不应使用in_app并仅使用latest_receipt_info。
https://forums.developer.apple.com/thread/92200涵盖了像cancellation_date这样的边缘案例,它是一个客户服务提供的取消,就像在这个苹果开发者论坛帖子中看到的那样:https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW4
https://www.revenuecat.com/2018/09/24/apple-subscription-notifications-are-almost-useless
上面的文档使用https://forums.developer.apple.com/thread/96670非常清楚。请注意文档中的“未在下面记录的密钥保留供Apple使用,必须由您的应用程序忽略”。因此即使解码的收据有Receipt Fields(Apple Docs),我们也应该忽略它。
但我同意,文档非常缺乏,这让我很紧张。让我知道您在生产中使用iOS 7样式收据验证的体验。