Нужно ли обновлять квитанцию, если вы используете проверку квитанции на стороне сервера?

Я создал приложение с автоматически возобновляемыми подписками.

Ниже приводится логика, которую я использую, чтобы узнать, есть ли у пользователя активная подписка.

  • Каждый раз, когда вызывается paymentQueue(_:updatedTransactions:) из SKPaymentQueue, я пытаюсь выполнить проверку квитанции, выполнив следующие действия.
  • Проверяю, есть ли местная квитанция. Если его нет, я использую SKReceiptRefreshRequest, чтобы обновить квитанцию.
  • Я отправляю информацию о квитанции на verifyReceipt конечную точку сервера App Store.
  • Сервер возвращает ответ, содержащий информацию о дате окончания подписки.
  • Я сохраняю дату истечения срока действия в приложении и представляю соответствующий пользовательский интерфейс в зависимости от того, есть ли у пользователя активная подписка или нет.

Обзор App Store несколько раз отклонял мое приложение из-за ошибок SKReceiptRefreshRequest. Я не могу воспроизвести ошибку, с которой столкнулась комиссия по обзору App Store.

Во время поиска в Интернете, чтобы решить эту проблему, я узнал следующие факты о местной квитанции:

  • Местный чек всегда присутствует в производственном режиме. Локальная квитанция может отсутствовать, если приложение установлено с помощью Testflight или во время тестирования. (ссылка)
  • Сервер App Store вернет последнюю информацию о подписке, даже если он отправил старую локальную квитанцию ​​(ссылка )

Из двух приведенных выше сведений я сделал вывод, что нет необходимости когда-либо вызывать SKReceiptRefreshRequest в производственной среде, потому что сервер App Store предоставит самые свежие данные, даже если локальная квитанция устарела, а локальная квитанция всегда присутствует в производственной среде.


Чтобы мое приложение прошло проверку в App Store, я решил удалить SKReceiptRefreshRequest, поскольку он дает ошибки в сборках Testflight и не требуется в производственной среде.

Может ли кто-нибудь подтвердить, что я прав?


person Community    schedule 08.04.2020    source источник


Ответы (2)


В вашей логике есть несколько недостатков:

1) paymentQueue(_:updatedTransactions:) вызывается в фоновом режиме и (насколько мне известно) обновляет уже локальную квитанцию. Также приложение, загруженное из App Store, всегда содержит квитанцию. Таким образом, в этом методе нет необходимости вызывать SKReceiptRefreshRequest.

2) SKReceiptRefreshRequest требует, чтобы пользователи вводили его пароль, чтобы разрешить обновление квитанции. Поскольку вы запустили метод в paymentQueue(_:updatedTransactions:), который был вызван в фоновом режиме, я считаю, что это проблема, из-за которой запрос на обновление не удался, и Apple отклонила ваше приложение. Тем не менее, у этого метода есть причина: в производственной среде он нужен, чтобы пользователи могли восстанавливать покупки после переустановки приложения или на других устройствах, а для отладки и сборок TestFlight он нужен вам, чтобы получить последнюю квитанцию.

3) Вы не должны отправлять квитанцию ​​из своего приложения на конечную точку Apple.

Предупреждение

Не вызывайте конечную точку verifyReceipt сервера App Store из своего приложения. Вы не можете установить доверительное соединение между устройством пользователя и App Store напрямую, потому что вы не контролируете ни один из концов этого соединения, что делает его уязвимым для атаки типа «злоумышленник посередине».

Источник

Как продолжить?

Я бы порекомендовал сделать следующее:

1) Не запускать SKReceiptRefreshRequest в paymentQueue(_:updatedTransactions:)

2) Если это еще не сделано, предоставьте в приложении кнопку «восстановить покупки» (которая вызывает SKReceiptRefreshRequest).

3) Реализуйте local или межсерверная проверка квитанции

person Paul Schröder    schedule 09.04.2020

Я использовал следующий способ для создания квитанции и отправки полученной квитанции на сервер для проверки:

https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store

person khush    schedule 09.04.2020
comment
Ответы только по ссылкам обычно попадают в очередь на просмотр и обычно удаляются. - person Jason Aller; 09.04.2020
comment
Во фрагменте кода на этой странице вы можете видеть, что если квитанция отсутствует, ничего не делается. В моем приложении, если квитанция отсутствует, я пытаюсь обновить квитанцию. У обозревателей Apple возникли ошибки при обновлении квитанции. - person ; 09.04.2020