You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Storekit在[Environment: Xcode]环境下订阅成功却无法获取原始交易ID求助

解决Xcode中StoreKit订阅成功后无法获取原始交易ID的问题
  • 先明确原始交易ID的正确获取路径:自动续订订阅的原始交易ID(original transaction ID) 存储在交易对象的originalTransaction属性中,而非当前交易的transactionIdentifier。

  • 检查你的交易处理逻辑:
    在SKPaymentQueue的交易回调方法里,针对不同交易状态正确提取原始ID:

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchased, .restored:
                // 获取原始交易ID,首次订阅时originalTransaction即为当前交易
                let originalTxID = transaction.originalTransaction?.transactionIdentifier ?? transaction.transactionIdentifier
                print("原始交易ID:\(originalTxID ?? "未获取到")")
                // 务必完成交易收尾
                queue.finishTransaction(transaction)
            case .failed, .deferred, .purchasing:
                // 处理其他状态逻辑
                break
            @unknown default:
                break
            }
        }
    }
    
  • 不要遗漏恢复订阅的逻辑:
    如果用户通过恢复操作获取订阅,必须主动调用SKPaymentQueue.default().restoreCompletedTransactions(),恢复后的交易同样会进入上述回调,此时originalTransaction会指向首次订阅的交易记录。

  • 若使用StoreKit 2,API有所不同:
    StoreKit 2中使用Transaction类型,直接访问originalID属性即可:

    Task {
        for await result in Transaction.currentEntitlements {
            guard case .verified(let transaction) = result else { continue }
            if let originalID = transaction.originalID {
                print("原始交易ID:\(originalID)")
            }
        }
    }
    
  • 测试环境注意事项:
    Sandbox测试环境下的原始交易ID是有效的,不要将测试ID与生产环境混淆,上线前切换到正式环境验证即可。

内容的提问来源于stack exchange,提问作者puja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:22:21