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

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

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

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

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

  • Настройте Real-time developer notifications и включите Get all notifications for subscriptions and one-time products чтобы получать обновления о статусе покупок.
  • Реализуйте интерфейс PurchasesUpdatedListener из BillingClient для автоматического получения обновлений о покупках.
  • Вызовите метод BillingClient.queryPurchasesAsync() .

После получения новой покупки используйте метод getPurchaseState или purchases.products.get in Play Developer API чтобы определить состояние оплаты новой покупки.

Уведомления разработчиков в режиме реального времени

Когда пользователь покупает или отменяет покупку одноразового продукта, Google Play отправляет сообщение OneTimeProductNotification . Чтобы обновить состояние внутренней покупки, используйте токен покупки, предоставленный в объекте OneTimeProductNotification для вызова метода purchases.products.get . Этот метод предоставляет последнюю информацию о статусе покупки и потребления с учетом токена покупки.

Вы должны обрабатывать RTDN, связанные с транзакциями, в своем защищенном бэкэнде.

Обрабатывать завершенные транзакции

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

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

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

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

Обрабатывайте разовые покупки продуктов в своем бэкэнде

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

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

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

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