苹果应用内购买的交易ID有时会发生变化

24

客户向我发送了购买凭证,经由 Apple 服务器验证后,我得到了新购买(自动订阅)的交易 ID。几天后,同一位客户又发来了新的购买凭证,经过验证后,奇怪的事情发生了:那个旧购买的交易 ID 发生了变化。

我比较了旧凭证中这次购买的数据和新凭证中的数据,唯一改变的是交易 ID 字段,原始交易 ID、购买日期、到期日期、web_order_line_item_id 及其他字段都完全相同。

于是我检查了数据库,发现大约 1% 的交易记录出现了相同的情况,并且有一个特征,他们中的大多数交易 ID 都会增加或减少 1-2。

以前我认为交易 ID 是购买的标识符。是否有人遇到过相同的问题或知道原因?


我现在也面临着同样的问题,很想知道你是如何解决这个问题的? - Sriram
由于我现在无法依赖transaction_id或web_order_line_item_id,因此我将考虑使用新的transaction_id和新的web_order_line_item_id进行购买,视为一次新的购买。 - PE Xie
2个回答

19

是的,我们也看到了这种情况发生。我们看到这是由“恢复购买”按钮点击触发的。

如果您的“恢复购买”按钮使用 restoreCompletedTransactions API,则会导致您的交易ID更改。我们已经向苹果开发者支持证实过这一点。

显然,您可以调用 SKReceiptRefreshRequest ,它只会获取最新的收据,而不是重播所有交易。我理解这不会导致交易ID更改。

从个人经验上看,我们目睹了 web_order_line_item_id 值在调用 restoreCompletedTransactions 时不会更改。然而,当我们向苹果开发者支持询问确认时,他们的回复含糊不清:

关于web_order_line_item_id字段,该值将在每次续订后更改。

只要您在接收到续订订阅事件时继续存储新值即可使用此功能。

我们认为这意味着 web_order_line_item_id 在每次续订购买时是唯一的。这既不证实也不否认它在调用 restoreCompletedTransactions 时保持不变。

此外,我发现这个关于苹果/谷歌/亚马逊循环计费的会议记录非常有帮助(尽管与此特定情况无关):

Rosa Gutierrez - The recurring nightmare. Implementing cross platform in-app subscription purchases


1
谢谢你的回答。最终,你是否使用web_order_line_item_id实现了每个交易的唯一性? - Sriram
1
@Sriram 我仍然不能百分之百确定 web_order_line_item_id 是全局唯一的。我们改用去重记录并开始使用 SKReceiptRefreshRequest - plainjimbo
1
刚刚我们在应用中测试了恢复购买功能,虽然它按照预期工作,但是没有改变收据中的任何交易标识符。 - Sriram
1
@Sriram,是的,我们也注意到了同样的问题。虽然它并不总是更改交易ID,但有时确实会发生。文档中说它“为每个可以恢复的先前完成的交易提供一个新的交易”。我不确定是什么情况和/或条件导致交易ID更改。你可以测试一件事情,我们没有测试过,那就是从执行购买的设备完全不同的设备调用restoreCompletedTransactions - plainjimbo
谢谢大家的好提醒,原始交易ID不会被更改,我是对的吗? - Hamed Nova

8

根据最新的苹果开发者文档,

web_order_line_item_id - 跨设备购买事件的唯一标识符,包括订阅续订事件。此值是标识订阅购买的主键。

transaction_id - 您可以使用此值来:

  1. 在您的帐户数据库中管理订阅者。为每个交易存储transaction_id、original_transaction_id和product_id,作为存储交易记录的最佳实践。 App Store会每次自动续订或在新设备上恢复订阅时生成一个新的transaction_id。
  2. 区分购买交易与恢复或续订交易。在购买交易中,transaction_id始终与original_transaction_id匹配。对于订阅,它表示第一笔订阅购买。对于恢复或续订,transaction_id与original_transaction_id不匹配。如果用户多次恢复或续订同一项购买,则每次恢复或续订都有不同的transaction_id。

2
那么,如果用户A购买了可续订的订阅,然后删除了应用程序/时间过去了/订阅自动续订,现在用户B使用不同的帐户登录(但仍然是相同的iTunes帐户)并恢复购买,服务器上应该持久化哪个ID?当用户B恢复购买时应该与哪个ID进行比较?(在这种情况下,我们必须确定订阅实际上属于用户A,而用户B不应该从中受益)。 - Pawel Klapuch
2
@PawelKlapuch 我使用App Store服务器通知来跟踪订阅续订事件。因此,我的数据库具有所有订阅续订信息,无论用户A是否已删除应用程序均不影响。只有当用户B使用相同的iTunes帐户并且订阅仍处于活动状态时,才能恢复购买。因此,当用户B恢复购买时,我将检查该订阅是否已经存在于数据库中,使用web_order_line_item_id作为唯一标识符。如果是,则通知用户B iTunes帐户在另一个应用程序帐户上拥有活动订阅。 - luke77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接