Apple, In-App покупки транзакция_id одной покупки иногда меняется
Как только я получаю квитанцию от клиента и проверяю ее на сервере Apple, я получаю идентификатор транзакции для новой покупки (это покупка с автоматической подпиской) в этой квитанции. Через несколько дней я получаю новую квитанцию от того же клиента и проверяю ее, происходят странные вещи: идентификатор транзакции этой старой покупки изменяется.
Я сравниваю данные этой покупки в старой квитанции с данными в новой квитанции, единственное, что изменяется, это поле транзакции_id, оригинал_транзакции_дата, дата_закупки, expires_date, web_order_line_item_id и другие поля точно такие же.
После проверки базы данных я обнаружил, что примерно 1% записей транзакций имеют такую же ситуацию. И есть особенность: большинство их идентификаторов транзакций были увеличены или уменьшены на 1-2.
Раньше я думал, что идентификатор транзакции является идентификатором покупки. Кто-нибудь встречает ту же проблему или знает причину?
1 ответ
Да, мы видим, что это также происходит. Мы видим, что это вызвано нажатием кнопки "Восстановить покупку".
Если ваша кнопка "Восстановить покупку" использует restoreCompletedTransactions
API, то это приведет к изменению идентификаторов вашей транзакции. Мы подтвердили это при поддержке разработчиков Apple.
Видимо можно позвонить SKReceiptRefreshRequest
вместо этого, который будет просто получать последнюю квитанцию, а не воспроизводить все транзакции. Насколько я понимаю, это не приведет к изменению идентификаторов транзакций.
Мы, как это ни странно, были свидетелями того, что web_order_line_item_id
значения не меняются при обращении к restoreCompletedTransactions
, Однако, в лучшем случае, мы получили неоднозначный ответ от поддержки разработчиков Apple, когда мы запросили подтверждение:
Что касается поля web_order_line_item_id, значение будет меняться при каждом последующем обновлении.
Вы можете использовать это до тех пор, пока вы продолжаете сохранять новое значение по мере поступления событий продления подписки.
Мы считаем, что это означает, что web_order_line_item_id
уникален для продления покупки. Что ни подтверждает, ни опровергает, что оно остается постоянным при обращении restoreCompletedTransactions
Кроме того, я нашел эту запись конференции на регулярных счетах Apple/Google/Amazon очень полезной (хотя, не для этого конкретного случая):
Роза Гутьеррес - повторяющийся кошмар. Реализация межплатформенных внутриигровых покупок по подписке
На основе последней документации для разработчиков Apple,
web_order_line_item_id - уникальный идентификатор событий покупки на разных устройствах, включая события продления подписки. Это значение является первичным ключом для идентификации покупок подписки.
transaction_id - это значение можно использовать для:
- Управляйте подписчиками в базе данных вашей учетной записи. Сохраните transaction_id, original_transaction_id и product_id для каждой транзакции, чтобы лучше всего хранить записи транзакций для каждого клиента. App Store генерирует новое значение для transaction_id каждый раз, когда подписка автоматически обновляется или восстанавливается на новом устройстве.
- Отличите транзакцию покупки от транзакции восстановления или продления. В транзакции покупки transaction_id всегда совпадает с original_transaction_id. Для подписок он указывает на первую покупку подписки. Для восстановления или обновления transaction_id не соответствует original_transaction_id. Если пользователь восстанавливает или обновляет одну и ту же покупку несколько раз, каждое восстановление или обновление будет иметь свой идентификатор транзакции.