Когда идентификатор транзакции меняется в квитанции на получение 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 отличаются.

Поэтому: обеспечить уникальность комбинации идентификатора транскодирования и даты

Не только сохранить идентификатор транзакции, но и дату покупки (не оригинальную дату покупки) в базе данных вашего сервера. Комбинация этих двух значений не будет существовать в вашей базе данных для законной транзакции восстановления, но столкнется с существующей записью, если квитанция будет воспроизведением.

Обратите внимание, что мы смотрим ответ с сервера проверки, а это значит, что клиенты не смогут изменять дату, так же как они не могут изменять идентификатор транзакции, не нарушая действительность квитанции.