У продуктов с одноразовой покупкой жизненный цикл проще, чем у продуктов с подпиской, но все равно есть несколько состояний и событий перехода, которые ваш бэкэнд должен уметь правильно обрабатывать.
Новые разовые покупки продукции
После того как пользователь завершит процесс оплаты, ваше приложение может увидеть информацию о новой покупке одним из следующих способов:
- Настройте
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 также доступны методы подтверждения и использования покупок, которые позволяют обрабатывать покупки в вашем приложении, но мы рекомендуем вам выполнять обработку в вашем бэкэнде, если он у вас есть, для более безопасной реализации.