我正在尝试验证自动续订的应用内购买是否已在服务器端过期(不在设备上)。
我使用的是苹果的大统一收据(iOS 7风格的交易)。苹果返回的响应包含in_app
和latest_receipt_info
元素以及一组收据。in_app
JSON元素包含的收据少于latest_receipt_info
。我希望这两个元素都包含相同的数字或收据。
此外,我期望in_app
元素将包含所有收据。然而,latest_receipt_info
似乎实际上包含了所有收据。苹果公司的文档似乎建议使用in_app
来查找最新的收据。
我很惊讶地看到latest_receipt_info
,因为苹果的文档中指出这个元素"仅返回iOS 6风格的自动续订订阅交易收据。"(非iOS 7+)。
我应该迭代哪个JSON元素来查找自动续订iOS 7风格事务的最新收据:in_app
还是latest_receipt_info
?
只是想明确只有latest_receipt_info
字段返回最新续订的收据。这是基于我们从苹果公司得到的实际回报。
相关文档位于第21页。
尽管声明CCD_ 12和CCD_;仅返回iOS 6风格的自动续订交易收据订阅";,我们发现它们在我们的iOS 7收据中被退回。receipt
对象中的in_app
字段也返回了几乎相同的数据,但不包含最新的收据信息,这是您在自动续订时关心的信息。
要验证自动续订是否未过期,请检查latest_receipt_info
元素。
这是目前(2017-08-09)正式记录在in_app
和latest_receipt_info
元素上的内容:
in_app
在JSON文件中,该键的值是一个数组,包含基于应用内购买交易的应用内购买收据存在于输入的基于64的接收数据中。对于包含以下内容的收据自动续订,请检查latest_receipt_info键以获取最近续订的状态。
(来源)
latest_receipt_info
仅针对包含自动续订订阅的收据返回。对于iOS 6风格的交易收据,这是JSON表示最近续订的收据的。适用于iOS 7风格的应用程序receives,该键的值是一个包含应用程序中所有内容的数组采购交易。这不包括消耗品的交易您的应用程序已标记为已完成的产品。
(来源)
Babken Vardanyan在多个应答线程中提到,latest_receipt_info有时会丢失。我在这个帖子的收据中看到了一件有趣的事情https://forums.developer.apple.com/thread/92200是latest_receipt_info与in_app的差异。当进行diff时,我注意到链中的第一个收据不见了(包含is_trial_period=true)。它没有生成应用内收据。
如文档中所链接:https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW4表示,使用latest_receipt_info作为"对于iOS 7风格的应用程序收据,此密钥的值是一个包含所有应用程序内购买交易的数组。"
对于订阅,不应使用In_app,而应仅使用latest_receipt_info。
https://www.revenuecat.com/2018/09/24/apple-subscription-notifications-are-almost-useless涵盖了边缘情况,如cancell_date,其中是客户服务提供的取消,如本苹果开发者论坛帖子中所示:https://forums.developer.apple.com/thread/96670
我想链接最新的文档应用商店收据
latest_receipt_info
包含所有应用内购买交易的数组。这不包括应用程序标记为已完成的消耗品的交易。此仅返回包含自动续订订阅的收据。
in_app
位于Receipt.in_app
一个数组,包含所有应用内购买交易的应用内购买收据字段。
由于in_app
包含所有收据,我更喜欢迭代它并找到自动续订订阅的最新收据。
收据字段(苹果文档)
上面的文档非常清楚地说明了使用in_app
。请注意文档中的行"以下未记录的密钥仅供苹果使用,您的应用程序必须忽略"。因此,即使解码的收据具有latest_receipt_info
,我们也应该忽略它。
但我同意,文件非常缺乏,这让我很紧张。让我知道你在生产中使用iOS 7风格的收据验证的体验如何。