当iOS7应用收据中的交易ID发生变化时?

时间:2014-02-24 09:42:45

标签: ios ios7 in-app-purchase

对于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;
}

1 个答案:

答案 0 :(得分:5)

交易日期正确更新

我们可以利用事务日期正确更新的观察结果(即使在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一样。< / p>