Реализация Google Play Billing (расходуемые покупки) для Android

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация Google Play Billing (расходуемые покупки) для Android
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация Google Play Billing (расходуемые покупки) для Android

Consumable в Google Play Billing — это INAPP-продукт, который после покупки нужно явно «потребить» через consumeAsync(). Пока покупка не consumed, повторная покупка того же продукта невозможна: BillingClient.launchBillingFlow вернёт ITEM_ALREADY_OWNED. Это главное отличие от iOS, где consumable-логика определяется на стороне приложения, а не платформы.

Порядок consume и риск двойного начисления

Паттерн «купил → начислил → consume» работает только при стабильной сети. В реальности:

// Неправильно: consume сразу после получения покупки
billingClient.consumeAsync(params) { result, token ->
    if (result.responseCode == BillingClient.BillingResponseCode.OK) {
        addCoins(100) // краш здесь = consume прошёл, монеты не начислены
    }
}

Правильный порядок с серверной архитектурой:

  1. Получаем purchaseToken из PurchasesUpdatedListener
  2. Отправляем token на сервер — сервер через Google Play Developer API верифицирует покупку и идемпотентно начисляет валюту
  3. Только после ответа 200 OK — вызываем consumeAsync на клиенте
  4. Без шага 3 — не consume, транзакция остаётся открытой
scope.launch {
    val credited = serverApi.creditPurchase(purchase.purchaseToken)
    if (credited) {
        val consumeParams = ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.purchaseToken)
            .build()
        val result = billingClient.consumePurchase(consumeParams)
        if (result.billingResult.responseCode != BillingClient.BillingResponseCode.OK) {
            // Логируем, но не паникуем — следующий раз consume при queryPurchasesAsync
        }
    }
}

Незавершённые consume при перезапуске

При каждом запуске приложения — queryPurchasesAsync для INAPP-продуктов. Если находим покупку в PURCHASED состоянии — это незавершённая транзакция (либо consume не дошёл, либо краш). Повторяем шаги верификации и consume.

Сервер должен хранить purchaseToken как idempotency key. Повторный запрос с тем же токеном не начисляет валюту дважды — возвращает ранее созданный результат.

Pending purchases для consumables

В регионах, где доступна оплата через киоски или наложенный платёж (Индия, Бразилия, Юго-Восточная Азия), покупка может быть PENDING часами. enablePendingPurchases() с enableOneTimeProducts() обязателен с Billing Library 6. Для pending-состояния — не consume, ждём перехода в PURCHASED через PurchasesUpdatedListener или queryPurchasesAsync при следующем старте.

Сроки — 2–3 дня: интеграция с идемпотентной серверной логикой, обработка pending, тесты через лицензионных тестеров Google Play.