Когда идентификатор транзакции меняется в квитанции на получение iOS7?
Для iOS 6.1 или ранее идентификатор транзакции покупки внутри приложения, полученный после покупки или восстановления, уникален каждый раз, а исходный идентификатор транзакции никогда не изменяется даже после восстановления.
Однако для iOS7 идентификатор транзакции и оригинальный идентификатор транзакции всегда одинаковы! Я даже пытался обновить квитанцию, удалить приложение с устройства и вернуть его обратно. Оба поля всегда одинаковы.
Кто-нибудь знает, в каких случаях идентификатор транзакции изменится? Моя логика сервера полагалась на уникальный идентификатор транзакции из самой квитанции, которая в настоящее время не работает в случае 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
Даты транзакций обновляются правильно
Мы можем использовать наблюдение, что даты транзакций обновляются правильно (даже в среде Sanbox и, конечно же, в Production):
"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
отличаются.
Поэтому: обеспечить уникальность комбинации идентификатора транскодирования и даты
Не только сохранить идентификатор транзакции, но и дату покупки (не оригинальную дату покупки) в базе данных вашего сервера. Комбинация этих двух значений не будет существовать в вашей базе данных для законной транзакции восстановления, но столкнется с существующей записью, если квитанция будет воспроизведением.
Обратите внимание, что мы смотрим ответ с сервера проверки, а это значит, что клиенты не смогут изменять дату, так же как они не могут изменять идентификатор транзакции, не нарушая действительность квитанции.