Жизненный цикл разовой покупки

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

Этапы жизненного цикла и события перехода для разовых покупок.
Рисунок 1. Статусы жизненного цикла и события перехода для разовых покупок.

Новые однократные покупки контента

После того как пользователь завершит оплату, ваше приложение может получить информацию о новой покупке одним из следующих способов:

  • Настройте 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. Этот метод позволяет получить актуальный статус покупки и потребления по токену покупки.

Когда предзаказ будет выполнен и его статус изменится на PURCHASED, вашему клиенту будет отправлено уведомление в режиме реального времени. После получения уведомления RTDN обработайте покупку по предзаказу, как описано в разделе Обработка разовых покупок товаров на сервере.

Обрабатывать RTDN, связанные с транзакциями, следует в защищенной серверной части.

Обработка завершенных транзакций

Когда пользователь совершает однократную покупку, Google Play отправляет сообщение OneTimeProductNotification с типом ONE_TIME_PRODUCT_PURCHASED. Получив такое RTDN, обработайте покупку, как описано в разделе Обработка контента для однократных покупок в бэкенде.

Как обрабатывать отмененные транзакции

Если вы настроили получение уведомлений для разработчиков в режиме реального времени, то при отмене покупки контента для однократных покупок Google Play отправит сообщение OneTimeProductNotification с типом ONE_TIME_PRODUCT_CANCELED. Например, это может произойти, если пользователь не завершил оплату в течение требуемого периода времени или если покупка была отменена разработчиком или по запросу клиента. Когда бэкенд-сервер получит это уведомление, вызовите метод purchases.productsv2.getproductpurchasev2, чтобы узнать текущий статус покупки, и обновите бэкенд, в том числе права пользователя.

Если за покупку контента, оплачиваемого однократно, в состоянии Purchased возвращаются средства, вы также узнаете об этом с помощью Voided Purchases API.

Как обрабатывать разовые покупки товаров на сервере

ONE_TIME_PRODUCT_PURCHASED RTDN или вы узнали о ней в приложении через PurchasesUpdatedListener или вручную получили покупки в методе onResume() приложения, вы должны обработать новую покупку. Для повышения безопасности рекомендуем обрабатывать покупки на сервере.

Чтобы обработать новую разовую покупку, выполните следующие действия:

  1. Отправьте запрос к конечной точке purchases.productsv2.getproductpurchasev2, чтобы получить актуальный статус контента для однократных покупок. Чтобы вызвать этот метод для покупки, вам понадобится соответствующий параметр purchaseToken из приложения или уведомления ONE_TIME_PRODUCT_PURCHASED.
  2. Позвоните по номеру getPurchaseState() и убедитесь, что статус покупки – PURCHASED.
  3. Подтвердите покупку.
  4. Предоставьте пользователю доступ к контенту. Аккаунт пользователя, связанный с покупкой, можно определить по полю obfuscatedExternalAccountId из purchases.productsv2.getproductpurchasev2, если оно было задано с помощью setObfuscatedAccountId() при совершении покупки.
    1. Для покупок нерасходуемых товаров подтвердите доставку контента, вызвав метод purchases.products.acknowledge. Убедитесь, что покупка не была подтверждена ранее, проверив поле acknowledgementState.
    2. Если товар является расходуемым, пометьте его как израсходованный, вызвав метод purchases.products.consume. Это позволит пользователю снова купить товар после того, как он его израсходует. Этот метод также подтверждает покупку.

В библиотеке Play Платежей также есть методы подтверждения и использования покупок, которые позволяют обрабатывать покупки из приложения. Однако если у вас есть серверная часть, мы рекомендуем обрабатывать покупки в ней, чтобы обеспечить более высокий уровень безопасности.