Apple In-app Purchase transaction_id одной покупки иногда меняется

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

Я сравниваю данные этой покупки в старой квитанции с данными в новой квитанции, единственное, что меняется, это поле transaction_id , original_transaction_id, Purcha_date, expires_date, web_order_line_item_id и другие поля точно такие же.

Проверяя базу данных, я обнаружил, что примерно 1% записей транзакций имеют такую ​​же ситуацию. И есть особенность: большая часть их идентификаторов транзакций была увеличена или уменьшена на 1-2.

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


person PE Xie    schedule 18.02.2017    source источник
comment
Сейчас я столкнулся с той же проблемой, и мне интересно узнать, как вы ее решили?   -  person Sriram    schedule 23.05.2017
comment
Поскольку сейчас я не могу полагаться на transaction_id или web_order_line_item_id, я рассматриваю покупку с новым transaction_id и новым web_order_line_item_id как новую покупку.   -  person PE Xie    schedule 25.05.2017


Ответы (2)


Да, мы тоже видим, как это происходит. Мы видим, что это происходит при нажатии кнопки «Восстановить покупку».

Если ваша кнопка «Восстановить покупку» использует API restoreCompletedTransactions, тогда это приведет к идентификатор вашей транзакции, который нужно изменить. Мы подтвердили это при поддержке разработчиков Apple.

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

Мы, как ни странно, засвидетельствовали, что значения web_order_line_item_id не меняются при вызове restoreCompletedTransactions. Однако мы получили только неоднозначный, в лучшем случае, ответ от службы поддержки разработчиков Apple, когда запросили подтверждение:

Что касается поля web_order_line_item_id, значение будет изменяться при каждом последующем обновлении.

Вы можете использовать это, пока вы продолжаете сохранять новое значение по мере поступления событий продления подписки.

Мы считаем, что это означает, что web_order_line_item_id является уникальным для каждой продленной покупки. Что не подтверждает и не отрицает, что оно остается постоянным при вызовах restoreCompletedTransactions

Кроме того, я обнаружил, что эта запись конференции о повторяющихся счетах Apple / Google / Amazon очень полезна (хотя и не в этом конкретном случае):

Роза Гутьеррес - повторяющийся кошмар. Внедрение межплатформенных покупок подписок из приложений

person plainjimbo    schedule 08.03.2017
comment
Спасибо за ответ. В конце концов, удалось ли добиться уникальности каждой транзакции с помощью web_order_line_item_id? - person Sriram; 23.05.2017
comment
@Sriram Я все еще не уверен на 100%, что web_order_line_item_id уникален в глобальном масштабе. Мы перешли на использование де-дублированных записей и вместо этого начали использовать SKReceiptRefreshRequest. - person plainjimbo; 23.05.2017
comment
Только что мы протестировали функцию «Восстановить покупку» в нашем приложении, хотя она работала должным образом, но не изменила идентификатор транзакции в квитанции. - person Sriram; 23.05.2017
comment
@ Шрирам, да, мы тоже заметили то же самое. Хотя он не всегда менял идентификаторы транзакций, в некоторых случаях это происходит. В документации говорится, что он доставляет [s] новую транзакцию для каждой ранее завершенной транзакции, которая может быть восстановлена. Я не уверен, какие обстоятельства и / или условия вызывают изменение идентификатора транзакции. Одна вещь, которую вы могли проверить, чего мы не сделали, - это вызов restoreCompletedTransactions с совершенно другого устройства, нежели то, на котором была совершена покупка. - person plainjimbo; 12.06.2017
comment
Спасибо, ребята, за приятное уведомление, original_transaction_id все равно не будет меняться, я прав? - person Hamed Nova; 09.02.2020

На основе последней документации для разработчиков Apple,

web_order_line_item_id - уникальный идентификатор событий покупки. на разных устройствах, включая мероприятия по продлению подписки. Это значение является первичным ключом для идентификации покупки подписки.

transaction_id. Это значение можно использовать для:

  1. Управляйте подписчиками в базе данных вашей учетной записи. Сохраните transaction_id, original_transaction_id и product_id для каждой транзакции, чтобы лучше всего хранить записи транзакций для каждого клиента. App Store генерирует новое значение для transaction_id каждый раз, когда подписка автоматически продлевается или восстанавливается на новом устройстве.
  2. Отделите транзакцию покупки от транзакции восстановления или продления. В транзакции покупки transaction_id всегда совпадает с original_transaction_id. Для подписок он указывает на первую покупку подписки. Для восстановления или продления transaction_id не совпадает с original_transaction_id. Если пользователь восстанавливает или продлевает одну и ту же покупку несколько раз, каждое восстановление или продление будет иметь свой идентификатор транзакции.
person luke    schedule 08.10.2020
comment
Итак, как вы поступили с возобновляемой подпиской, купленной пользователем A - ›который затем удаляет приложение / время проходит / подписка обновляется автоматически -› теперь пользователь B входит в систему с другой учетной записью (но все еще с той же учетной записью iTunes) и восстанавливает покупки - ›какой идентификатор должен сохраняться на сервере и с чем его сравнивать, когда userB восстанавливает покупки? (в этом случае мы должны выяснить, что подписка действительно принадлежит пользователю A, и пользователь B не должен получать от нее выгоду). - person Pawel Klapuch; 01.12.2020
comment
@PawelKlapuch Я использую уведомления сервера App Store, чтобы отслеживать событие продления подписки. Итак, в моей базе данных есть вся информация о продлении подписки, не имеет значения, удалил приложение userA или нет. UserB сможет восстановить покупку только в том случае, если он использует ту же учетную запись iTunes, а подписка все еще активна. Поэтому, когда пользователь B восстановит покупку, я проверю, существует ли эта подписка в базе данных, используя web_order_line_item_id, поскольку это уникальный идентификатор. Если да, то сообщите пользователю B, что у учетной записи iTunes есть активная подписка на другую учетную запись приложения. - person luke; 02.12.2020