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_ms
和original_purchase_date_ms
不同。
因此:强制交易 ID 和日期组合的唯一性
在您的服务器数据库中不仅要存储交易 ID,还要存储购买日期(不是原始购买日期)。对于合法的恢复事务,这两个值的组合不会存在于您的数据库中,但如果收据是重播,则会与现有记录发生冲突。
请注意,我们正在查看来自验证服务器的响应,这意味着客户端将无法更改日期,就像他们无法在不破坏收据有效性的情况下更改交易 ID 一样。
【讨论】:
这听起来像是一个很好的解决方法,但必须有更多关于如何让 transaction_id 实际更新以上是关于iOS7应用收据中的交易ID何时更改?的主要内容,如果未能解决你的问题,请参考以下文章