21

一旦我从客户端获得收据并通过苹果服务器进行验证,我就会在此收据中获得新购买的交易 ID(它是自动订阅购买)。几天后,我从同一个客户那里得到一张新收据并验证它,奇怪的事情发生了:旧购买的交易 id 发生了变化。

我将这次购买的数据在旧收据中与新收据中的数据进行比较,唯一变化的是transaction_id字段,original_transaction_id、purchase_date、expires_date、web_order_line_item_id等字段完全相同。

比我查数据库,我发现大约1%的交易记录有同样的情况。并且有一个特点,他们的大部分交易 id 都增加或减少了 1-2

我曾经认为交易ID是购买的标识符。有没有人遇到同样的问题或知道原因?

4

2 回答 2

18

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

如果您的“恢复购买”按钮使用restoreCompletedTransactionsAPI,那么这将导致您的交易 ID 发生变化。我们已经在 Apple 开发者支持下确认了这一点。

显然你可以打电话SKReceiptRefreshRequest来代替它只会获取最新的收据而不是重播所有交易。据我了解,这不会导致交易 ID 发生变化。

有趣的是,我们见证了这些web_order_line_item_id值在调用restoreCompletedTransactions. 然而,当我们要求确认时,我们最多只收到了来自 Apple 开发人员支持的模棱两可的回复:

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

只要在续订订阅事件到来时继续存储新值,就可以使用它。

我们认为这意味着web_order_line_item_id每次续订购买都是独一无二的。它既不确认也不否认它在调用过程中保持不变restoreCompletedTransactions

此外,我发现 Apple/Google/Amazon 经常性计费上的此会议记录非常有帮助(尽管不适用于这种特殊情况):

Rosa Gutierrez - 反复出现的噩梦。实施跨平台应用内订阅购买

于 2017-03-08T22:32:07.723 回答
7

基于最新的 Apple 开发者文档,

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。
于 2020-10-08T13:56:37.013 回答