对于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;
}
答案 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_ms
和original_purchase_date_ms
不同。
因此:强制执行交易ID与日期相结合的唯一性
不仅存储交易ID,还存储服务器数据库中的购买日期(非原始购买日期)。对于合法的还原事务,数据库中不存在这两个值的组合,但如果收据是重播,则会与现有记录冲突。
请注意,我们正在查看验证服务器的响应,这意味着客户将无法更改日期,就像他们无法在不破坏收据有效性的情况下更改交易ID一样。< / p>