Покупка в приложении iOS: проверка квитанции на стороне сервера для расходных материалов

Я хочу реализовать покупку расходных материалов из приложения для разрабатываемого мной приложения для iOS. Я хочу проверить квитанцию ​​на стороне сервера, как указано в документация:

  1. Приложение запускает транзакцию с запросом в Apple Store
  2. Квитанция о возврате Apple Store в приложение
  3. Приложение отправляет квитанцию ​​на доверенный сервер
  4. Доверенный сервер отправляет квитанцию ​​(в формате base 64) в Apple Store через HTTP POST
  5. Apple Store отвечает на HTTP POST с проверкой
  6. Если ответ проверки в порядке, покупка может быть активирована

Меня беспокоит следующая ситуация: пользователь покупает продукт, и Apple Store отправляет квитанцию ​​обратно в приложение (шаги 1,2). Затем, когда приложение пытается отправить квитанцию ​​на доверенный сервер (шаг 3), соединение разрывается. В этом случае необходимо повторить проверку квитанции во второй раз, однако у меня есть следующие вопросы:

а) в этом случае, оплатил ли пользователь продукт уже?
б) С момента получения расходных продуктов сравнивать только во время покупки, как следует ли управлять повторной попыткой проверки? Следует ли сохранять квитанцию ​​локально, чтобы повторно отправить ее в будущем? Могу я просто не пометить транзакцию как «завершенную»? Насколько я понимаю, читая документацию, в этом случае StoreKit должен снова вызвать наблюдателя очереди транзакций (снова передать квитанцию?), Пока транзакция не будет помечена как «завершенная», это правильно?

заранее спасибо


person Andrea Gorrieri    schedule 21.06.2018    source источник


Ответы (1)


а) в этом случае пользователь уже заплатил за продукт?

Наблюдатель PaymentTransaction сообщит вам, в каком состоянии находится покупка пользователя: .Purchased, .Purchasing, .Failed. так далее.

Таким образом, исходя из вашего вопроса, мы можем предположить, что состояние пользователя - .Purchased, и вы получили бы платеж. Теперь, когда у них есть квитанция, и мы надеемся, что это реальная покупка, они будут ждать, пока вы подтвердите на своем сервере и разблокируете покупку, потому что они получили квитанцию, содержащую данные об их покупке.

б) Поскольку квитанции на расходные материалы сравниваются только на момент покупки, как следует управлять повторной попыткой проверки? Следует ли сохранять квитанцию ​​локально, чтобы повторно отправить ее в будущем? Могу я просто не пометить транзакцию как завершенную? Насколько я понимаю, читая документацию, в этом случае StoreKit должен снова вызвать наблюдателя очереди транзакций (снова передать квитанцию?), Пока транзакция не будет отмечена как завершенная, это правильно?

Вам не нужно хранить его локально, информация о покупке сохраняется в квитанции. Он сохраняется до тех пор, пока ваш paymentObserver не завершит транзакцию или пока квитанция не обновится / не обновится снова. Ваше приложение будет продолжать попытки проверки на вашем сервере, пока не получит ответ о квитанции, как правило, когда пользователь снова запускает приложение. На этом этапе, если мы предполагаем, что он действителен, вы включаете свой продукт, а затем после этого завершаете транзакцию в SKPaymentQueue. .

В документации сказано:

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

https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1

Также: «Например, рассмотрим случай, когда пользователь покупает что-то в вашем приложении прямо перед тем, как войти в туннель. Ваше приложение не может доставить купленный контент из-за отсутствия сетевого подключения. В следующий раз, когда ваше приложение будет запущено, StoreKit снова вызовет ваш наблюдатель очереди транзакций и в это время доставит купленный контент. Точно так же, если ваше приложение не может пометить транзакцию как завершенную, StoreKit вызывает наблюдателя каждый раз, когда ваше приложение запускается, пока транзакция не будет завершена должным образом ».

Я надеюсь, что это поможет, и я надеюсь, что он ответил на ваши вопросы.

person sdIos    schedule 07.07.2018