iOS7应用收据中的交易ID何时更改?

Posted

技术标签:

【中文标题】iOS7应用收据中的交易ID何时更改?【英文标题】:When transaction ID is changing in iOS7 app receipt? 【发布时间】:2014-02-24 09:42:44 【问题描述】:

对于 ios 6.1 或更早版本,购买或恢复后收到的应用内购买交易 ID 每次都是唯一的,原始交易 ID 永远不会改变,即使在恢复后也是如此。

但是,对于 iOS7,事务 id 和原始事务 id 总是相同的!我什至尝试刷新收据,从设备中删除应用程序并重新放回去。两个字段始终相同。

有谁知道在哪些情况下交易 ID 会改变?我的服务器逻辑依赖于收据本身的唯一交易 ID,这在 iOS7 的情况下目前不起作用。

以下是 Apple 服务器解密的应用收据。如果我在本地解密,结果相同。


    environment = Sandbox;
    receipt =     
        "adam_id" = 0;
        "application_version" = "1.0";
        "bundle_id" = "com.###";
        "download_id" = 0;
        "in_app" =         (
                        
                "is_trial_period" = false;
                "original_purchase_date" = "2014-02-18 14:23:40 Etc/GMT";
                "original_purchase_date_ms" = 1392733420000;
                "original_purchase_date_pst" = "2014-02-18 06:23:40 America/Los_Angeles";
                "original_transaction_id" = 1000000101860870;
                "product_id" = "com.###";
                "purchase_date" = "2014-02-24 09:12:21 Etc/GMT";
                "purchase_date_ms" = 1393233141000;
                "purchase_date_pst" = "2014-02-24 01:12:21 America/Los_Angeles";
                quantity = 1;
                "transaction_id" = 1000000101860870;
            
        );
        "original_application_version" = "1.0";
        "original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
        "original_purchase_date_ms" = 1375340400000;
        "original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
        "receipt_type" = ProductionSandbox;
        "request_date" = "2014-02-24 09:12:56 Etc/GMT";
        "request_date_ms" = 1393233176903;
        "request_date_pst" = "2014-02-24 01:12:56 America/Los_Angeles";
    ;
    status = 0;

【问题讨论】:

你是如何解密收据的?? 我遇到了同样的问题。当我恢复以前的购买时,SKPaymentTransaction transactionIdentifier 和 originalTransaction->transactionIdentifier 与我预期的不匹配。但是,当我从捆绑包中读取收据并根据应用商店验证它时,transaction_id 和 original_transaction_id 在苹果返回的 json 中是相同的。为什么? 【参考方案1】:

交易日期已正确更新

我们可以利用交易日期正确更新的观察结果(即使在 Sanbox 环境中,肯定在生产环境中):

"in_app":["quantity":"1", "product_id":"###",
    "transaction_id":"1000000122762089",
    "original_transaction_id":"1000000122762089",
    "purchase_date":"2014-09-07 16:15:13 Etc/GMT",
    "purchase_date_ms": "1410106513000",
    "purchase_date_pst":"2014-09-07 09:15:13 America/Los_Angeles",
    "original_purchase_date":"2014-09-07 05:35:16 Etc/GMT",
    "original_purchase_date_ms":"1410068116000",
    "original_purchase_date_pst":"2014-09-06 22:35:16 America/Los_Angeles",
    "is_trial_period":"false"]

您可以看到purchase_date_msoriginal_purchase_date_ms 不同。

因此:强制交易 ID 和日期组合的唯一性

在您的服务器数据库中不仅要存储交易 ID,还要存储购买日期(不是原始购买日期)。对于合法的恢复事务,这两个值的组合不会存在于您的数据库中,但如果收据是重播,则会与现有记录发生冲突。

请注意,我们正在查看来自验证服务器的响应,这意味着客户端将无法更改日期,就像他们无法在不破坏收据有效性的情况下更改交易 ID 一样。

【讨论】:

这听起来像是一个很好的解决方法,但必须有更多关于如何让 transaction_id 实际更新

以上是关于iOS7应用收据中的交易ID何时更改?的主要内容,如果未能解决你的问题,请参考以下文章

04 ETH-交易树和收据树

区块链技术与应用肖臻老师笔记整理之------17-ETH-交易树和收据树

Django 保存对象“收据”

如何获取订阅的原始交易收据?

如何确定单个应用内购买交易的收益

在 iOS In-App-Purchases 收据验证上返回许多交易