У продуктов с одноразовой покупкой жизненный цикл проще, чем у продуктов с подпиской, но все равно есть несколько состояний и событий перехода, которые ваш бэкэнд должен уметь правильно обрабатывать.
Новые разовые покупки продукции
После того как пользователь завершит процесс оплаты, ваше приложение может увидеть информацию о новой покупке одним из следующих способов:
- Настройте
Real-time developer notificationsи включитеGet all notifications for subscriptions and one-time productsчтобы быть в курсе обновлений о статусе покупок. - Реализуйте интерфейс
PurchasesUpdatedListenerизBillingClientдля автоматического получения обновлений о покупках. - Вызовите метод
BillingClient.queryPurchasesAsync().
После получения новой покупки используйте метод getPurchaseState или purchases.productsv2.getproductpurchasev2 in Play Developer API
для определения состояния оплаты новой покупки.
Уведомления разработчиков в режиме реального времени
Когда пользователь совершает или отменяет покупку разового товара, Google Play отправляет сообщение OneTimeProductNotification . Чтобы обновить состояние покупки, используйте токен покупки, предоставленный в объекте OneTimeProductNotification , для вызова метода purchases.productsv2.getproductpurchasev2 . Этот метод возвращает последний статус покупки и использования товара по токену покупки.
Когда предварительный заказ выполнен и его статус покупки меняется на «КУПЛЕНО», вашему клиенту отправляется RTDN. После получения RTDN обработайте покупку предзаказа, как описано в разделе «Обработка разовых покупок товаров в вашем бэкэнде» .
Обрабатывать RTDN, связанные с транзакциями, следует в защищенном бэкэнде.
Обработка завершенных транзакций
Когда пользователь совершает разовую покупку продукта, Google Play отправляет сообщение OneTimeProductNotification с типом ONE_TIME_PRODUCT_PURCHASED . Получив это RTDN, обработайте покупку, как описано в разделе Обработка разовых покупок продуктов в бэкэнде .
Обработка отмененных транзакций
При отмене разовой покупки продукта Google Play отправляет сообщение OneTimeProductNotification с типом ONE_TIME_PRODUCT_CANCELED , если вы настроили получение уведомлений от разработчика в режиме реального времени. Например, это может произойти, если пользователь не завершит оплату в установленные сроки или покупка будет отменена разработчиком или по запросу клиента. Когда ваш внутренний сервер получит это уведомление, вызовите метод purchases.productsv2.getproductpurchasev2 , чтобы получить актуальное состояние покупки, а затем соответствующим образом обновите свой внутренний сервер, включая права пользователя.
Если единовременная покупка товара в состоянии Purchased будет возвращена, вы также будете уведомлены об этом с помощью API аннулированных покупок .
Обрабатывайте разовые покупки продуктов в своем бэкэнде
Независимо от того, обнаружили ли вы новую покупку с помощью RTDN ONE_TIME_PRODUCT_PURCHASED , получили ли вы уведомление в приложении через PurchasesUpdatedListener или вручную извлекли данные о покупках в методе onResume() вашего приложения, вам необходимо обработать новую покупку. Для повышения безопасности мы рекомендуем обрабатывать покупку в бэкенде.
Чтобы оформить новую разовую покупку, выполните следующие действия:
- Запросите конечную точку
purchases.productsv2.getproductpurchasev2, чтобы получить последний статус единовременной покупки товара. Для вызова этого метода вам потребуется соответствующийpurchaseTokenиз вашего приложения или из RTDNONE_TIME_PRODUCT_PURCHASED. - Вызовите
getPurchaseState()и убедитесь, что состояние покупки —PURCHASED. - Подтвердите покупку .
- Предоставьте пользователю доступ к контенту. Учётную запись пользователя, связанную с покупкой, можно определить по полю
obfuscatedExternalAccountIdиз методаpurchases.productsv2.getproductpurchasev2, если оно было задано с помощьюsetObfuscatedAccountId()при совершении покупки.- Для покупок товаров, не подлежащих потреблению, подтвердите доставку контента, вызвав метод
purchases.products.acknowledge. Убедитесь, что покупка не была ранее подтверждена, проверив полеacknowledgementState. - Если товар можно использовать, отметьте его как использованный, вызвав метод
purchases.products.consume, чтобы пользователь мог купить товар снова после его использования. Этот метод также подтверждает покупку.
- Для покупок товаров, не подлежащих потреблению, подтвердите доставку контента, вызвав метод
В библиотеке Play Billing Library также доступны методы подтверждения и использования покупок, которые позволяют обрабатывать покупки в вашем приложении, но мы рекомендуем вам выполнять обработку в вашем бэкэнде, если он у вас есть, для более безопасной реализации.