Общие сведения о проверке квитанций и обновлении квитанций в iOS

У нас есть проблемы с полным пониманием процесса проверки квитанций в iOS.

Вот что мы сейчас делаем (в разработке):

В applicationDidFinishLaunching и в applicationWillEnterForeground мы проверяем квитанцию ​​​​на стороне сервера, если квитанции нет или квитанция недействительна, мы пытаемся обновить квитанцию ​​​​и перепроверить ее.

Вот некоторые проблемы/вопросы:

  1. В каких случаях на устройстве нет чека?

  2. Должны ли мы всегда выдавать запрос на обновление квитанции, если квитанции нет?

  3. Почему это окно предупреждения иногда отображается при запуске? Я так понимаю, это отображается в запросе на обновление квитанции?

Требуется авторизация?

  1. Когда должна происходить проверка квитанции? В настоящее время мы делаем это всякий раз, когда совершается покупка, чтобы подтвердить покупку. Это правильное использование?

person the_critic    schedule 03.12.2015    source источник


Ответы (4)


  1. В производстве чек всегда доступен на устройстве. В тесте после первой установки нет. Поэтому, если вы хотите провести правильный тест, вы должны восстановить покупку, даже если она не существует для этого пользователя в тестовой среде. Это почему? Приложение, загруженное из магазина приложений, всегда поставляется с квитанцией, даже если оно бесплатное.
  2. Зависит от бизнес-логики, которую вы хотите применить. Если вы проверяете квитанцию ​​на сервере каждый раз, когда запускаете приложение, конечно, вам нужна квитанция. Если он отсутствует (но в производстве всегда) или недействителен, вы можете запросить обновление или восстановление, но, насколько я помню, вы всегда должны сначала спросить пользователя, хочет ли он это сделать (может быть причина отказа). Восстановление и обновление — это не одно и то же.
  3. Обычно это появляется при покупке/восстановлении/обновлении. Но также, если в учетной записи есть ожидающие запросы из-за сбоя приложения или вы каким-то образом прервали отладку до завершения запроса, вам многое из этого надоест. Невозможно сбросить их программно, просто войдите в систему, пока они не остановятся. Конечно, это не будет действительным тестом.
  4. Это зависит от вас и о виде покупки. Если это автоматически продлеваемая подписка, вы можете проверить квитанцию ​​на сервере, затем сохранить «дату окончания» на клиенте и выполнить еще одну проверку после истечения даты. Обратите внимание, что квитанции могут быть довольно большими, потому что они также имеют все значения истории.
person Andrea    schedule 08.12.2015
comment
Я думаю, что это довольно солидный ответ, спасибо. Итак, если мы не настолько строги, чтобы проверять квитанцию ​​​​при запуске, будет ли целесообразно делать это после каждой покупки? Мы также не хотим натыкаться на пункт 2.), который вы упомянули. Таким образом, поток будет следующим: 1) Пользователь покупает подписку. 2) Подтвердите получение 3) Проверка прошла успешно: запланируйте локальное уведомление об истечении срока действия (это безопасный метод?). 4) Сработало уведомление об истечении срока действия квитанции -> Подтвердить или заблокировать премиум-функции. Это кажется хорошим способом справиться с этим? - person the_critic; 08.12.2015
comment
Я действительно зависит от вида покупки. Если это не подписка, подтверждение сразу после покупки звучит нормально для меня. Если это подписка, вы должны знать ее конец, поэтому поток, который вы представили, прекрасен, за исключением локального уведомления. Предположим, вы покупаете ежемесячную подписку с автоматическим продлением. Каждый месяц, если пользователь не останавливает механизм автоматического продления, подписка автоматически продлевается. Я безуспешно пытался понять, когда это происходит, вероятно, за несколько дней до реальной даты истечения срока действия. - person Andrea; 09.12.2015
comment
Автоматически означает, что вам не нужно ничего делать. Я бы сохранил локально (связку ключей) день истечения срока действия, когда я приближаюсь к этой дате, я снова отправлю квитанцию ​​​​для проверки, пока не истечет или не обновится. Если проверка увидит новый месяц, я обновлю дату, если срок действия квитанции истек, я выставлю предупреждение о том, что срок действия вашей подписки истек $конечная дата$, вы хотите попробовать обновить? Вы можете отправлять квитанцию ​​на сервер проверки сколько угодно раз, не спрашивая пользователя, но вы не можете обновлять или восстанавливать, не спрашивая пользователя. - person Andrea; 09.12.2015
comment
Не могли бы вы дать мне предложение по этому поводу? stackoverflow.com/ вопросы/47712225/ - person Siddharth; 09.12.2017

  1. Как упомянул Чжан, если не было покупки или восстановления, в магазине не будет чека.
  2. Найдите квитанцию. Если квитанция не найдена, проверка завершится неудачно, и вам не следует снова запрашивать обновление квитанции. Только когда вы восстановите процесс самостоятельно, вы должны снова запросить квитанцию.
  3. Это будет отображаться всегда, когда вы попытаетесь обновить квитанцию ​​(или вы выберете из настроек, что вы не хотите запрашивать пароль в течение 15 минут).
  4. Да.

Для получения дополнительной информации см. здесь: https://www.objc.io/issues/17-security/receipt-validation/#about-validation

person m.aibin    schedule 08.12.2015

Если пользователь скачал приложение из App Store — да, чек всегда есть.

Однако в песочнице, если ваше приложение было установлено через Xcode или Testflight, квитанция не будет получена до тех пор, пока вы не совершите покупку или не восстановите его.

Ознакомьтесь с полным списком часто задаваемых вопросов о проверке квитанций в нашем блоге:

https://blog.apphud.com/receipt-validation/

person apphud    schedule 20.10.2019

1.Покупка/восстановление не производились.
2.Нет.См. 1
4.Конечно.Для расходных материалов не забудьте сохранить хеш на своем сервере, чтобы победить атаку воспроизведения.

person Zhang HanSheng    schedule 08.12.2015
comment
Я не очень понимаю здесь. Квитанция о проверке предназначена для проверки того, действительна ли транзакция или нет, верно? Итак, после того, как состояние транзакции .Purchased, я звоню, чтобы подтвердить квитанцию, чтобы проверить заказ. И если квитанция недействительна, отметьте, что транзакция является мошенничеством, верно? - person TomSawyer; 17.05.2016