使用 in_app 或 latest_receipt_info 获取自动续期 iOS 7 风格交易的最新收据?

Use in_app or latest_receipt_info for getting latest receipt for auto-renewable iOS 7 style transactions?

提问人:Chris 提问时间:9/10/2014 最后编辑:ljkChris 更新时间:10/17/2022 访问量:19244

问:

我正在尝试验证自动续期的应用内购买是否未过期服务器端(不在设备上)。

我正在使用 Apple 的 Grand Unified Receipt(iOS 7 样式的交易)。Apple 返回的响应包含 和 元素以及一系列收据。JSON 元素包含的收据少于 。我原以为这两个元素都包含相同的数字或收据。in_applatest_receipt_infoin_applatest_receipt_info

此外,我预计该元素将包含所有收据。但是,它似乎实际上包含所有收据。Apple 文档似乎建议用于查找最新收据。in_applatest_receipt_infoin_app

我很惊讶地看到,因为 Apple 的文档指出此元素是“仅针对自动续期订阅的 iOS 6 样式交易收据返回”(不是 iOS 7+)。latest_receipt_info

我应该迭代哪个 JSON 元素来查找自动续期 iOS 7 样式交易的最新收据:或 ?in_applatest_receipt_info

iOS 应用内购买 服务器端 应用内 订阅

评论

2赞 Chris 10/2/2014
不,我从未找到答案或确认我应该遍历哪个 JSON 元素以查找最新收据。我最终使用了“latest_receipt_info”,因为它似乎包含所有收据。
3赞 Chris 10/3/2014
@Cmag,是的,我一直看到苹果回归和.我用来检查自动续订是否已续订(或过期)。而且,我存储以备后用。下次我检查续订时,我会将存储的内容发送给 Apple。latest_receipt_infolatest_receiptlatest_receipt_infolatest_receiptlatest_receipt
4赞 Chris 10/3/2014
@Cmag,是的,我第一次购买时从设备发送收据(字符串)(我的数据库中还没有最新的收据)。如果验证成功,Apple 将返回 .我会存储.然后,当发生自动续订时(对我来说,订阅是 1 个月),我会将我存储的收据发送给 Apple,看看是否发生了自动续订。我的想法是,我想始终尝试将我所知道的最新收据发送给Apple,并希望通过这样做,Apple将始终将最新的收据发回给我。latest_receiptlatest_receiptlatest_receipt_info
1赞 Cmag 10/3/2014
现在,每次重新启动/关闭/置于后台应用程序时,手机都会向 NodeJS API 发送收据字符串。这个字符串每次都是一样的(我刚刚验证过)。因此,发送此字符串后,我从苹果那里得到的响应总是不同的。当试图理解苹果的JSON响应时,我差点崩溃了。文档几乎不存在:(我不明白的是,为什么苹果JSON响应中的字符串总是不同?更大的问题是......如何验证收据是否有效。可怕的经历。latest_receipt
1赞 Chris 10/4/2014
您向 Apple 发送收据的频率由您决定。对我来说,我只需要每个月检查续订。在沙盒中进行测试时,Apple 会经常自动续订,所以也许这就是latest_receipt不同的原因(?Apple 将返回一个状态代码,可以帮助您判断它是否有效。

答:

-1赞 Taher Saeed 2/4/2015 #1

收据字段(Apple Docs)

上面的文档非常清楚地使用了 . 请注意文档中的“下面未记录的密钥保留供 Apple 使用,必须由你的应用忽略”行。 因此,即使解码的收据有,我们也应该忽略它。in_applatest_receipt_info

但我同意,文档非常缺乏,这让我很紧张。 让我知道您在生产中使用 iOS 7 样式收据验证的体验如何。

评论

8赞 Alexp 8/14/2015
我认为这是不正确的 - 如果latest_receipt_info在那里,它包含其他任何地方都没有提到的续订。重要的是,它们似乎是在in_app提到的那些之后发生的。所以有点吓人!
2赞 Brian 11/20/2015
他们告诉您使用的信息不适用于续订订阅,并且人们必须使用“未记录”字段才能获得此信息,这意味着 Apple 可以(并且将)更改它们,恕不另行通知。
17赞 Samir Uppaluru 4/10/2015 #2

只是想明确指出,只有该字段返回最新的续订收据。这是基于我们从苹果公司实际得到的回报。latest_receipt_info

相关文档位于第 21 页

尽管它声明 and 字段是“仅针对自动续订的 iOS 6 样式交易收据返回 订阅“,我们发现它们在我们的 iOS 7 收据中被退回。对象中的字段也会返回几乎相同的数据,但不包含最新的收据信息,这是您在自动续订的情况下关心的信息。latest_receiptlatest_receipt_infoin_appreceipt

评论

0赞 Babken Vardanyan 3/23/2018
但情况并非总是如此。 有时在我的 PROD 应用程序中丢失。latest_receipt_info
1赞 stevex 5/14/2019
现在这是一个死链接。
16赞 jox 8/10/2017 #3

若要验证自动续订订阅是否未过期,请选中该元素。latest_receipt_info

这是目前 (2017-08-09) 官方记录的 和 元素:in_applatest_receipt_info

in_app

在 JSON 文件中,此键的值是一个数组,其中包含 基于 App 内购买交易的 App 内购买收据 存在于输入 base-64 收据数据中。对于包含以下内容的收据 自动续期订阅,请检查 latest_receipt_info获取最近续订状态的关键。

()

latest_receipt_info

仅针对包含自动续期订阅的收据退回。 对于 iOS 6 样式的交易收据,这是 JSON 表示形式 最近一次续订的收据。对于 iOS 7 风格的应用程序 receipts,此键的值是一个包含所有应用内的数组 购买交易。这不包括消耗品的交易 已被您的应用标记为已完成的产品。

()

评论

7赞 Babken Vardanyan 3/23/2018
但情况并非总是如此。latest_receipt_info有时在我的 prod 应用程序中丢失。
1赞 Karl Taylor 12/19/2019
latest_receipt_info@BabkenVardanyan,我的 Testflight 收据回复中也缺少了。不知道如何处理这种情况?
0赞 Boris Mitioglov 2/8/2023
@KarlTaylor你是如何处理这种情况的呢?
3赞 Kevin King 3/21/2019 #4

Babken Vardanyan 在多个回答线程中提到,latest_receipt_info有时会丢失。我在这个线程 https://forums.developer.apple.com/thread/92200 的收据中看到的一件有趣的事情是latest_receipt_info与in_app的差异。在做差异时,我注意到链中的第一个收据丢失了(包含 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 涵盖了一些边缘情况,例如cancellation_date,这是客户服务提供的取消,如以下 Apple 开发者论坛主题所示: https://forums.developer.apple.com/thread/96670

0赞 zangw 10/17/2022 #5

我想链接最新的文档 App Store 收据

  • latest_receipt_info

包含所有应用内购买交易的数组。这不包括您的应用标记为已完成的易耗品的交易。这返回包含自动续期订阅的收据。

一个数组,包含所有应用内购买交易的应用内购买收据字段。

由于包含所有收据,我更喜欢迭代它并找到自动续订订阅的最新收据。in_app