Использовать in_app или latest_receipt_info для получения последней квитанции об автоматически возобновляемых транзакциях в стиле iOS 7?

Я пытаюсь проверить, что срок действия автоматически возобновляемой покупки в приложении не истек на стороне сервера (не на устройстве).

Я использую Apple Grand Unified Receipt (транзакции в стиле iOS 7). Ответ, возвращаемый Apple, содержит элементы in_app и latest_receipt_info с массивом квитанций. Элемент in_app JSON содержит МЕНЬШЕ квитанций, чем latest_receipt_info. Я ожидал, что оба элемента будут содержать один и тот же номер или квитанции.

Кроме того, я ожидал, что элемент in_app будет содержать ВСЕ квитанции. Однако похоже, что latest_receipt_info фактически содержит все квитанции. В документации Apple предлагается использовать in_app для поиска последней квитанции.

Я удивлен, увидев latest_receipt_info, потому что в документации Apple указано, что этот элемент «возвращается только для квитанций о транзакциях в стиле iOS 6 для автоматически возобновляемых подписок». (не для iOS 7+).

Какой элемент JSON мне следует перебрать, чтобы найти последнюю квитанцию ​​для автоматически возобновляемых транзакций в стиле iOS 7: in_app или latest_receipt_info?


person Chris    schedule 09.09.2014    source источник
comment
ты нашел ответы на свою проблему?   -  person Cmag    schedule 01.10.2014
comment
Нет, я так и не нашел ответа или подтверждения, какой элемент JSON мне следует перебрать, чтобы найти последнюю квитанцию. В конечном итоге я использовал latest_receipt_info, потому что он, кажется, содержит все квитанции.   -  person Chris    schedule 02.10.2014
comment
Крис, я думаю, вы правы насчет использования latest_receipt_info. Большое спасибо за ответ! Потратил много времени на отладку этого и до сих пор в недоумении :) Всегда ли Apple отправляет вам latest_receipt_info? Вот что я всегда получаю от их услуг: gist.github.com/vasiliyb/23b5ac1fb36c6fd50006   -  person Cmag    schedule 02.10.2014
comment
@Cmag, да, я постоянно видел, как Apple возвращала latest_receipt_info и latest_receipt. Я использую latest_receipt_info, чтобы проверить, возобновилось ли автоматическое продление (или срок его действия истек). И я храню latest_receipt для дальнейшего использования. Я отправлю сохраненный latest_receipt в Apple, когда в следующий раз проверю возможность продления.   -  person Chris    schedule 02.10.2014
comment
Крис, отличная информация! Спасибо! Значит, вы не просто пересылаете строки, полученные от телефонов, в Apple, вы на самом деле храните latest_receipt от Apple? Не думаю, что я очень хорошо понимаю процесс :( Итак, если это первая покупка, и у вас нет latest_receipt, скажем, mongo, тогда пересылайте строку, которую вы получили с телефона, в противном случае отправьте сохраненный latest_receipt и проверьте с помощью строка, которую вам отправили?   -  person Cmag    schedule 02.10.2014
comment
@Cmag, да, при первой покупке отправляю квитанцию ​​(строку) с устройства (последней квитанции в моей базе пока нет). Если проверка прошла успешно, Apple вернет ответ с latest_receipt. Я буду хранить latest_receipt. Затем, когда происходит автоматическое продление (для меня подписка составляет 1 месяц), я отправляю свою сохраненную квитанцию ​​в Apple, чтобы узнать, произошло ли автоматическое продление. Я думаю, что я хотел всегда стараться отправлять в Apple самую последнюю квитанцию, о которой я знаю, и, надеюсь, тем самым Apple всегда будет отправлять мне самую последнюю latest_receipt_info.   -  person Chris    schedule 02.10.2014
comment
Прямо сейчас телефон отправляет NodeJS API строку квитанции каждый раз, когда приложение перезапускается / закрывается / переводится в фоновый режим. Эта строка каждый раз одна и та же (я только что проверил). Таким образом, ответ, который я получаю от Apple после отправки этой строки, всегда отличается. Пытаясь понять ответ Apple в формате JSON, я чуть не сломал себе мозг. Документов почти не существует :( Я не понимаю, почему строка latest_receipt всегда отличается в ответе Apple JSON? Большой вопрос ... как мне проверить, действительна ли квитанция. Ужасный опыт.   -  person Cmag    schedule 03.10.2014
comment
Итак, вы не всегда отправляете Apple попытку проверки квитанции только через месяц после даты первой покупки в вашей базе данных?   -  person Cmag    schedule 03.10.2014
comment
Как часто вы будете отправлять квитанцию ​​в Apple, зависит от вас. Мне просто нужно проверять обновления каждый месяц. При тестировании в песочнице Apple будет часто автоматически обновляться, поэтому, возможно, именно поэтому latest_receipt отличается (?). Apple вернет код статуса, может помочь вы скажете, действительно это или нет.   -  person Chris    schedule 03.10.2014
comment
У меня все еще ужасный опыт. Телефон присылает мне квитанцию, отправляю в apple. ответ latest_receipt от Apple отличается от того, что мне прислал телефон. Совершенно новая покупка в песочнице ... как, черт возьми, я могу заставить это работать :(   -  person Cmag    schedule 07.10.2014


Ответы (4)


Просто хотел прояснить, что только поле latest_receipt_info возвращает последнюю обновленную квитанцию. Это основано на том, что мы на самом деле получаем от Apple.

Соответствующая документация находится здесь, на стр. 21.

Хотя в нем указано, что поля latest_receipt и latest_receipt_info возвращаются только для квитанций транзакций в стиле iOS 6 для автоматически возобновляемых подписок, мы обнаружили, что они возвращаются в наших квитанциях iOS 7. Поле in_app в объекте receipt также возвращается с почти идентичными данными, но не содержит последней информации о квитанции, которая важна для вас в случае автоматического продления.

person Samir Uppaluru    schedule 09.04.2015
comment
Это не всегда так. latest_receipt_info иногда отсутствует в моем приложении. - person Babken Vardanyan; 23.03.2018
comment
Теперь это мертвая ссылка. - person stevex; 14.05.2019

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

Это то, что в настоящее время (2017-08-09) официально задокументировано для элементов in_app и latest_receipt_info:

in_app

В файле JSON значение этого ключа представляет собой массив, содержащий все квитанции о покупках в приложении, основанные на транзакциях покупок в приложении, присутствующих во входных данных квитанции base-64. Для квитанций, содержащих автоматически возобновляемые подписки, проверьте значение ключа latest_receipt_info, чтобы получить статус последнего продления.

(источник)

latest_receipt_info

Возвращается только для квитанций, содержащих автоматически возобновляемые подписки. Для квитанций транзакций в стиле iOS 6 это JSON-представление квитанции о самом последнем продлении. Для квитанций приложений в стиле iOS 7 значение этого ключа представляет собой массив, содержащий все транзакции покупок в приложении. Это исключает транзакции для потребляемого продукта, которые были помечены вашим приложением как завершенные.

(источник)

person jox    schedule 09.08.2017
comment
Это не всегда так. latest_receipt_info иногда отсутствует в моем приложении prod. - person Babken Vardanyan; 23.03.2018
comment
latest_receipt_info тоже отсутствовал в моем ответе на получение Testflight @BabkenVardanyan. Не знаете, как справиться с этой ситуацией? - person Karl Taylor; 19.12.2019

Бабкен Варданян в нескольких ветках ответов упоминал, что иногда latest_receipt_info отсутствует. Одна интересная вещь, которую я видел в квитанциях в этой теме https://forums.developer.apple.com/thread/92200 - разница между latest_receipt_info и in_app. При проведении сравнения я заметил, что отсутствует первая квитанция в цепочке (содержащая is_trial_period = true). Он не генерировал эквивалент квитанции в приложении.

Как указано в документации: https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SWW > говорит об использовании latest_receipt_info как «для квитанций приложений в стиле iOS 7, значение этого ключа представляет собой массив, содержащий все транзакции покупок в приложении».

Что касается подписок, вы не должны использовать in_app и использовать только latest_receipt_info.

https://www.revenuecat.com/2018/09/24/apple-subscription-notifications-are-almost-useless охватывает крайние случаи, такие как cancellation_date, когда это отмена, предоставляемая службой поддержки клиентов, как показано в этой ветке форума разработчиков Apple: https://forums.developer.apple.com/thread/96670

person Kevin King    schedule 21.03.2019

Поля квитанции (Apple Docs)

Приведенная выше документация довольно ясно дает понять, как использовать in_app. Обратите внимание на строку «Ключи, не задокументированные ниже, зарезервированы для использования Apple и должны игнорироваться вашим приложением» в документации. Таким образом, даже если в декодированной квитанции указано latest_receipt_info, мы должны игнорировать это.

Но я согласен, документации очень не хватает, и это заставляет меня нервничать. Дайте мне знать, каково ваше впечатление от использования проверки квитанции в стиле iOS 7 в производственной среде.

person Taher Saeed    schedule 03.02.2015
comment
Я считаю, что это неверно - если есть latest_receipt_info, он содержит обновления, не упомянутые где-либо еще. Важно отметить, что они, похоже, произошли после упомянутых в in_app. Так немного страшно! - person Alexp; 14.08.2015
comment
Довольно сомнительно, что информация, которую они говорят вам использовать, не применима для продления подписки, и что люди должны использовать «недокументированные» поля, чтобы получить это, что означает, что Apple может (и будет) изменять их без предварительного уведомления. - person Brian; 19.11.2015