Перейти к основному содержимому

Работа с платежами в RuStore

Вы можете монетизировать своё приложение через покупки в RuStore. Вот 4 варианта, как это сделать:

  • Продать приложение на витрине. Создайте платное приложение, загрузите его на витрину RuStore и получайте выплаты за скачивания.
подсказка

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

  • Добавить возобновляемые подписки. Подписки дают пользователям дополнительные преимущества внутри приложения или игры за фиксированную оплату в месяц.
  • Добавить потребляемые товары. Это покупки, которые можно купить более одного раза, чтобы использовать в приложении. Например, бусты для здоровья, подсказки, кристаллы и монетки в играх.
  • Добавить непотребляемые товары. В отличие от потребляемых, их можно купить только один раз и нельзя потратить в приложении или игре. Приобретая такие товары, пользователь становится их владельцем. Это может быть отключение рекламы, скрытый уровень или премиальная техника в играх.

Все виды платных товаров добавляются через систему RuStore Консоль.

С чего начать

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

Условия приема платежей

Важно

Обратите внимание, что Billing SDK не поддерживает работу в ТВ-версии RuStore.

  • Приложение прошло модерацию (публиковать приложение необязательно).

Важно

Подпись тестируемой сборки (например, debug) приложения должна совпадать c подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например, release).

  • Пользователь и приложение не должны быть заблокированы в RuStore.
  • Для приложения включена возможность покупок в RuStore Консоли.

предупреждение

Сервис имеет некоторые ограничения на работу за пределами России.

Создание платных приложений или продуктов

Добавьте приложение для продажи на витрине в RuStore Консоль, если вы выбрали этот способ монетизации.

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

к сведению

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

См. Как создать платный товар, Как создать подписку

Настройка SDK

Встройте в своё приложение RuStore SDK, чтобы покупатели могли приобрести товары или подписки.

Как работают платежи

предупреждение

На схеме ниже показан примерный алгоритм настройки и подключения платежей, на который вы можете ориентироваться. Учитывайте особенности вашего проекта в работе.

Инициализ�ация SDKПокупка товараЗавершение покупки и выдача товараПолучение списка товаровВаше приложениеВаше приложениеПокупательПокупательВаш серверВаш серверRuStore Billing ClientRuStore Billing ClientRuStore СерверRuStore СерверПриложение банкаПриложение банкаRuStoreBillingClientFactory.create()getProducts()onNewIntent()purchaseProduct()Входит в ваше приложениеПоказ списка доступных товаровВыбрал товар, нажал купитьRuStoreBillingClientСписок продуктов вашего приложенияРезультат оплатыОтображение шторки с результатом оплатыОтображает ВСЕ способы оплаты и связки*Ввод email для получения чекаАвторизация по VK IDОтображает все способы оплаты без возможности создания связки*Отображает ВСЕ способы оплаты и связки*Результат проведения платежаВозврат в приложениеРезультат проведения платежаШторка с предложением авторизации[Пользователь авторизован в RuStore][Выбрал для оплаты: Карту\Телефон[Без сервера]Обработка deeplink при оплате в приложении банкаСерверная валидация платежаТолько для потребляемого(consumable) товара[Оплата без авторизации по VK ID][Пользователь не авторизован в RuStore][Оплата с авторизацией по VK ID]*Привязка способа оплаты к пользователю для дальнейшей оплаты в одно касаниеВыбрал для оплаты: Карту\ТелефонВыбрал для оплаты: СБП\SberPay\T-PayОплата покупкиВыполняется сценарий оплатыВыполняется сценарий оплатыПереход в приложение банка для оплаты
Выбрал для оплаты: СБП\SberPay\T-Pay[При наличии сервера]ОбязательноВажноРекомендовано28.Проверка результата оплаты по API27. Сallback о платеже29. Информация о покупке30. Проверки/выдача товара покупателю
Выдать товар покупателю
32.confirmPurchase33. Результат подтверждения34. Начислить товар покупателю
38. Выдать товар покупателю39. Сохранить информацию о покупке35. Сохранить информацию о покупке
36. Результат начисления (покупки) товара37. Результат подтверждения40. Результат начисления (покупки) товара40. Результат начисления (покупки) товараIAP платеж для авторизованного в RuStore пользователя

С помощью SDK можно:

Подробнее про интеграцию см. Настройка SDK платежей

Статусная модель транзакции

Статусная модель покупки потребляемых продуктов (CONSUMABLES)

Покупка создана, но счёт на оплату ещё не созданОплаты еще не было. Можно игнорировать такую покупку.У пользователя есть незавершенная покупка. Счёт создан, но не оплачен. Необходимо предупредить пользователя.Покупка отмененаДля продуктов типа consumable. Покупка оплачена, но не потреблена. Апу Арр должен немедленно отправить запрос на приобретение покупки.Для продуктов типа consumable. Потребление покупки было подтверждено.CREATEDINVOICE_CREATEDСANCELLEDСчёт созданСчёт оплаченПотреблениеPAIDCONSUMEDСчёт отменёнВозврат по счётуПокупка отменена / не потреблена в течение 72 часовПокупка отменена

Статусная модель покупки непотребляемых продуктов (NON-CONSUMABLES)

Покупка создана, но счёт на оплату еще не создан. Оплаты еще не было. Можно игнорировать такую покупку.У пользователя есть незавершенная покупка. Счёт создан, но не оплачен. Необходимо предупредить пользователя.Покупка отмененаСтатус завершения покупки для продуктов типа non-consumable или subscription. Означает, что товар уже приобретен, повторная попытка покупки приведет к ошибке.CREATEDINVOICE_CREATEDСANCELLEDСоздание счётаПокупка подтвержденаCONFIRMEDСчёт отменёнВозврат по счётуОтмена покупки

Статусная модель покупки подписок (SUBSCRIPTIONS)

Покупка создана, но счёт на оплату еще не создан. Оплаты еще не было. Можно игнорировать такую покупку.Подписка в HOLD периоде. Повторная попытка покупки приведёт к ошибке.У пользователя есть незавершенная покупка. Счёт создан, но не оплачен. Необходимо предупредить пользователя.Покупка отмененаПодписка активна или в GRACE периоде. Повторная попытка покупки приведёт к ошибке.Срок действия подписки истёк. Доступна повторная �покупка.CREATEDINVOICE_CREATEDСANCELLEDPAUSEDСоздание счётаПокупка подтвержденаПодписка закрытаCONFIRMEDTERMINATEDСчёт отменёнОшибка оплаты очередногоплатежа по подпискеПодписка оплаченаПодписка закрытаОтмена покупки

Обработка незавершённых платежей

Обработка незавершённых платежей производится разработчиком.

Чтобы подтвердить покупку продукта типа CONSUMABLE и в статусе PAID вызовите метод подтверждения (потребления) покупки (см. Получение сведений о покупке).

В случае с отменой покупки при использовании методов обработки платежей учитывайте свой внутренний процесс. У некоторых разработчиков он предусматривает проверки перед подтверждением (потреблением) или отменой покупки. В этом случае запросите отдельно статус такой покупки.

подсказка

Например, если пользователь оплатил товар, который вы по каким-то причинам не можете ему поставить, вызовите метод отмены покупки в статусе PAID, чтобы отменить покупку.

В случаях, когда метод получения списка покупок возвращает покупку со статусом INVOICE_CREATED, перед вызовом метода отмены покупки рекомендуется дополнительно проверить статус покупки, используя метод получения сведений о покупке. Это поможет убедиться, что по данной покупке паблишер не начислил и не будет начислять средства. Если вы не хотите видеть покупки с таким статусом в списке покупок, можете выполнить отмену самостоятельно, но это не обязательно, так как RuStore обрабатывает отмену таких покупок на своей стороне.

к сведению

Иногда после оплаты через приложение банка (СБП, SberPay, T-Pay и др.) и при последующем возврате обратно в приложение статус покупки остаётся INVOICE_CREATED, при этом статус платежа — неуспешная покупка. Это связано с временем обработки покупки на стороне банка. Поэтому разработчику необходимо правильно связать логику получения списка покупок с жизненным циклом экрана.

Альтернативное решение — отмена покупки в статусе INVOICE_CREATED только через взаимодействие пользователя с приложением. Например, вы можете вынести эту логику в отдельную кнопку.

Приём платежей в других магазинах

Теперь пользователи смогут оплачивать покупки и подписки в вашем приложении, даже если на их устройствах не установлен RuStore. При оплате подписок им нужно будет авторизоваться по VK ID, а при оплате покупок внутри приложения достаточно указать e-mail для отправки чека.

Преимущества

Вы сможете увеличить объём выручки и привлечь лояльную аудиторию, поскольку теперь:

  • пользователи могут оплачивать покупки, даже если они пока не установили RuStore;
  • вы можете продолжать принимать платежи, публикуя приложения на разных площадках.

Особенности покупок без авторизации

  • Оплата без авторизации по VK ID доступна только для покупки потребляемых и непотребляемых товаров внутри приложения. Оплата подписки без авторизации недоступна.
  • Покупателю нужно указать e-mail для отправки чека.
  • Способы оплаты не сохраняются, поэтому при каждой покупке необходимо заново указывать данные для оплаты. Чтобы способы оплаты сохранялись и были доступны при оплате, покупателю нужно быть авторизованным по VK ID.
  • Приложение не должно запрашивать список покупок, поскольку это невозможно сделать для неавторизованного пользователя. Чтобы исключить вызов этого метода SDK, cм. рекомендации по доработке перед использованием SDK.
  • Вернуть платёж неавторизованному покупателю можно только по чеку, который он получил на e-mail, указанный при покупке. См. возврат платежа неавторизованному пользователю.

Особенности покупок c авторизацией

  • Авторизация по VK ID обязательна при оплате подписки. При желании покупатель может авторизоваться и при оплате товаров внутри приложения.
  • Пользователю необходимо авторизоваться по VK ID, когда SDK платежей получает запрос списка покупок (метод getPurchases). Чтобы сократить количество запросов на авторизацию, см. рекомендации по доработке перед использованием SDK.

Перед использованием SDK

Рекомендуем выполнить следующие доработки перед переходом на SDK платежей актуальной версии версии.

  • Сократите количество запросов на авторизацию

    Ваше приложение может запрашивать у SDK список покупок. Например, когда нужно показать пользователю игровой баланс, версию подписки или проверить, покупал ли он PRO-версию приложения.

    При таких запросах пользователю почти каждый раз нужно будет авторизоваться по VK ID. Это неудобно и может не понравиться пользователям.

    Чтобы сократить количество запросов на авторизацию, замените обращения к SDK платежей (метод getPurchases) на обращения к внутренней логике приложения. Вы можете сохранить списки покупок внутри приложения или на сервере, и обновлять эти данные с помощью RuStore API.

    Также мотивируйте пользователя использовать учетную запись (например, Google Play) для сохранения игрового прогресса и покупок.

    Если исключить указанные обращения к SDK, пользователю нужно будет авторизоваться только при оплате покупок.

  • Настройте аналитику

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

Особенности запросов на авторизацию

В таблице описано, при каких условиях и как часто пользователь получает запрос на авторизацию.

УсловияЗапрос авторизацииОсобенности
RuStore не установлен на устройстве

Запрос авторизации появляется:

  • в каждой сессии работы с приложением при вызове методов SDK:
    • getPurchases
    • purchaseProduct
  • если в течение одной сессии работы с приложение прошло более 900 секунд после предыдущего вызова методов SDK:
    • getPurchases
    • purchaseProduct

Метод getPurchases всегда требует авторизации по VK ID от пользователя. Чтобы проверить наличие RuStore на устройстве, воспользуйтесь методом isRuStoreInstalled из набора утилит RuStoreUtils. Данный метод вернет true или false в зависимости от наличия RuStore на устройстве пользователя.

RuStore установлен на устройстве, но пользователь не авторизован

Запрос авторизации появляется при вызове методов SDK:

  • getPurchases
  • purchaseProduct

При вызове метода purchaseProduct внутренняя логика платежной SDK позволит пользователю купить товар, авторизовавшись по VK ID или указав email для чека на шторке оплат. При вызове метода getPurchases пользователю будет необходимо авторизоваться по VK ID на шторке оплат. Запрос авторизации также появится вновь, если прошло более 900 секунд после предыдущего вызова методов SDK. Если работа вашего приложения не предусматривает покупку без авторизации, после проверки наличия RuStore на устройстве обратитесь к методу проверки авторизации пользователя getAuthorizationStatus. Используйте метод RuStoreUtils.openRuStoreAuthorization(context: Context) чтобы открыть экран авторизации в RuStore. После успешной авторизации пользователь автоматически вернется в Ваше приложение. Повторная авторизация не потребуется до тех пор, пока пользователь не выйдет из профиля в приложении RuStore.

RuStore установлен на устройстве, пользователь авторизован

Авторизация проверяется бесшовно для пользователя

Получение уведомлений на сервер

Чтобы получать уведомления о платежах в приложении в режиме онлайн, настройте уведомления на сервер. Это упростит работу: вам не понадобится регулярно запрашивать статус платежа — RuStore сам пришлёт уведомления при любом изменении статуса платежа.

Подключение API

Использование API обезопасит ваше приложение. Его не смогут взломать, чтобы получить товары и подписки бесплатно.

Чтобы работать с RuStore API пройдите авторизацию и получите JWE-токен.

Используйте методы API для:

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

См. Подключение API платежей

Валидация покупки на сервере

Если вам необходимо произвести валидацию успешной покупки на сервере методами API RuStore, вы можете использовать subscriptionToken в PurchaseResult, возвращаемой purchaseProduct при успешной покупке продукта.

SubscriptionToken состоит из invoiceId покупки и userId, записанных через точку: $invoiceId.$userId.

Также можно получить subscriptionToken в сущности Purchase. Сущность Purchase можно получить используя метод getPurchases.

val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.purchaseProduct(productId).addOnSuccessListener { paymentResult ->
if (paymentResult is PaymentResult.Success) {
val subscriptionToken = paymentResult.subscriptionToken
yourApi.validate(subscriptionToken)
}
}

Также можно получить subscriptionToken в сущности Purchase. Сущность Purchase можно получить используя метод getPurchases.

val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.getPurchases().addOnSuccessListener { purchases ->
purchases.forEach { purchase ->
yourApi.validate(purchase.subscriptionToken)
}
}

Тестирование платежей

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

Управление платежами

Как только у вас появятся первые платежи, вы можете управлять ими в системе RuStore Консоль.

Остались вопросы?