iOS StoreKit Transaction Identifier 与 Receipt 不匹配

Posted

技术标签:

【中文标题】iOS StoreKit Transaction Identifier 与 Receipt 不匹配【英文标题】:iOS StoreKit Transaction Identifier does not match Receipt 【发布时间】:2018-01-24 02:17:40 【问题描述】:

在收到SKPaymentTransactionStatePurchased 通知后,我正在使用收据来验证购买,除此之外,还可以获取用户刚刚购买的订阅的到期日期。

为了正确识别收据中刚刚发生的交易,我使用transaction.transactionIdentifiertransaction_id 进行匹配。我遇到的问题是交易标识符永远不会匹配。

我已经能够通过手动检查purchase_dateproduct_id 来识别收据中的正确交易,但transaction_id 与交易完全不同。

我还查看了transaction.originalTransaction.transactionIdentifieroriginal_transaction_id,但这四个值似乎在任何时候都不匹配。

这里发生了什么?在沙盒中测试时有人遇到过类似的问题吗?文档明确指出transaction_id 应与事务的transactionIdentifier 属性匹配。这可能是一个错误吗?

编辑 1: 这是单次购买订阅(之前已过期)的不同交易标识符

transaction.transactionIdentifier = 1000000325087359
transaction.originalTransaction.transactionIdentifier = 1000000297785006
transaction_id = 1000000325087377
original_transaction_id = 1000000297785006

似乎原始交易标识符匹配(为什么会匹配,这是新购买?),但其他两个不匹配。它们来自哪里,它们匹配什么?我不明白两者之间的关系及其意义。

【问题讨论】:

我遇到了同样的问题:***.com/questions/68165228/… 【参考方案1】:

SKPaymentTransaction.transactionIdentifier 的文档说明:

此值与交易中的transaction_id 格式相同 收据;但是,这些值可能不一样。

还有transaction_id 的文档说明:

此值与交易的格式相同 transactionIdentifier财产;但是,这些值可能不是 一样。

您可以将此值用于:

• 管理您帐户中的订阅者 数据库。存储transaction_idoriginal_transaction_idproduct_id 用于每笔交易,作为存储的最佳实践 每个客户的交易记录。 App Store 产生新价值 transaction_id 每次订阅自动续订或 已在新设备上恢复。

• 将购买交易与 恢复或续订交易。在购买交易中, transaction_id 始终与 original_transaction_id 匹配。为了 订阅,它表示第一次订阅购买。为一个 恢复或续订,transaction_id 不匹配 original_transaction_id。如果用户恢复或更新相同 多次购买,每次恢复或续订都有不同的 transaction_id.

我还会注意到Receipt Validation Programming Guide(来自文档存档)在事务标识符下的状态:

这个值对应交易的transactionIdentifier 属性。

除了记录在案的场景外,我不清楚这两个字段在什么场景下是相同或不同的。

【讨论】:

您的回答对我帮助很大,但我只是想知道交易ID是否在订阅中不匹配,如何识别交易?如何在retore工作流中匹配服务器端的事务?@Jordan H

以上是关于iOS StoreKit Transaction Identifier 与 Receipt 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AppStoreReceiptUrl 在 Xamarin.iOS 中验证 StoreKit 交易

iOS Auto Renewable Subscription 最低功能和 StoreKit 之外的免费试用

StoreKit 返回无效的产品标识符 - 仅在真正的 App Store 上,仅在 iOS7 上

IOS storekit订阅免费试用不起作用

Storekit 框架

Unity调用IOS的StoreKit实现在游戏内部的对游戏进行星级评价和评论