Работа с платежами в RuStore
Вы можете монетизировать своё приложение через покупки в RuStore. Вот 4 варианта, как это сделать:
- Продать приложение на витрине. Создайте платное приложение, загрузите его на витрину RuStore и получайте выплаты за скачивания.
Учитывайте, что продажа приложения на витрине приносит доход только один раз. Если вы хотите регулярно получать выплаты за работу своего приложения, рекомендуем рассмотреть добавление подписок и платных товаров.
- Добавить возобновляемые подписки. Подписки дают пользователям дополнительные преимущества внутри приложения или игры за фиксированную оплату в месяц.
- Добавить потребляемые товары. Это покупки, которые можно купить более одного раза, чтобы использовать в приложении. Например, бусты для здоровья, подсказки, кристаллы и монетки в играх.
- Добавить непотребляемые товары. В отличие от потребляемых, их можно купить только один раз и нельзя потратить в приложении или игре. Приобретая такие товары, пользователь становится их владельцем. Это может быть отключение рекламы, скрытый уровень или премиальная техника в играх.
Все виды платных товаров добавляются через систему RuStore Консоль.
С чего начать
Чтобы начать работу с платежами, заполните заявление на подключение монетизации в соответствии с формой регистрации бизнеса:
- Юрлица и ИП, зарегистрированные в РФ.
- Иностранные компании, незарегистрированные в РФ.
- Физические лица со статусом самозанятых.
Условия приема платежей
- Kotlin
- Java
-
Приложение загружено в RuStore Консоль.
Обратите внимание, что Billing SDK не поддерживает работу в ТВ-версии RuStore.
-
Приложение прошло модерацию (публиковать приложение необязат ельно).
Подпись тестируемой сборки (например, debug
) приложения должна совпадать c подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например, release
).
Пользователь и приложение не должны быть заблокированы в RuStore
.-
Для приложения включена возможность покупок в RuStore Консоли.
Сервис имеет некоторые ограничения на работу за пределами России.
-
Приложение з агружено в RuStore Консоль.
Обратите внимание, что Billing SDK не поддерживает работу в ТВ-версии RuStore.
-
Приложение прошло модерацию (публиковать приложение необязательно).
Подпись тестируемой сборки (например, debug
) приложения должна совпадать c подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например, release
).
Пользователь и приложение не должны быть заблокированы в RuStore
.-
Для приложения включена возможность покупок в RuStore Консоли.
Сервис имеет некоторые ограничения на работу за пределами России.
Создание платных приложений или продуктов
Добавьте приложение для продажи на витрине в RuStore Консоль, если вы выбрали этот способ монетизации.
Если вы хотите монетизировать приложение с помощью платных продуктов, создайте товары или подписки, которые будут встрое ны в ваше приложение, через систему RuStore Консоль.
Вы сможете изменить цену товаров и подписок в любой момент. После сохранения изменений, товары будут сразу продаваться по новой стоимости. В случае с подписками, понижение цены коснётся всех пользователей, в том числе тех, у кого ваша подписка активна, а повышение — только новых приобретателей подписки.
См. Как создать платный товар, Как создать подписку
Настройка SDK
Встройте в своё приложение RuStore SDK, чтобы покупатели могли приобрести товары или подписки.
Как работают платежи
На схеме ниже показан примерный алгоритм настройки и подключения платежей, на который вы можете ориентироваться. Учитывайте особенности вашего проекта в работе.
С помощью SDK можно:
- Получить информацию о созданных через RuStore Консоль продуктах.
- Настроить взаимодействие с банковскими приложениями для перенаправления пользователя напрямую на экран оплаты и обратно в ваше приложение
- Инициализировать оплату, чтобы пользователи могли купить добавленные вами товары в приложении.
- Контролировать потребление товаров, чтобы они начислились пользователям без ошибок.
Подробнее про интеграцию см. Настройка SDK платежей
Статусная модель транзакции
Статусная модель покупки потребляемых продуктов (CONSUMABLES
)
Статусная модель покупки непотребляемых продуктов (NON-CONSUMABLES
)
Статусная модель покупки подписок (SUBSCRIPTIONS
)
Обработка незавершённых платежей
Обработка незавершённых платежей производится разработчиком.
Чтобы подтвердить покупку продукта типа 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 не установлен на устройстве | Запрос авторизации появляется:
| Метод |
RuStore установлен на устройстве, но пользователь не авторизован | Запрос авторизации появляется при вызове методов SDK:
| При вызове метода |
RuStore установлен на устройстве, пользователь авторизован | Авторизация проверяется бесшовно для пользователя |
Получение уведомлений на сервер
Чтобы получать уведомления о платежах в приложении в режиме онлайн, настройте уведомления на сервер. Это упростит работу: вам не понадобится регулярно запрашивать статус платежа — RuStore сам пришлёт уведомления при любом изменении статуса платежа.
Подключение API
Использование API обезопасит ваше приложение. Его не смогут взломать, чтобы получить товары и подписки бесплатно.
Чтобы работать с RuStore API пройдите авторизацию и получите JWE-токен.
Используйте методы API для:
- Получения данных платежа, чтобы следить за покупками приложений, платных товаров и платежами подписок.
- Получения данных подписки. Вы можете использовать метод, в структуре которого подробно указаны сроки действия подписки, статусы подписки, например, активна она или приостановлена. Другой метод получения данных подписки подойдёт разработчикам, которые уже используют похожие инструменты.
- Получения статуса подписки, если не хотите отслеживать остальные параметры.
Валидация покупки на сервере
- Kotlin
- Java
Если вам необходимо произвести валидацию успешной покупки на сервере методами 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)
}
}
Если вам необходимо произвести валидацию успешной покупки на сервере методами API RuStore, вы можете использовать subscriptionToken
в PurchaseResult
, возвращаемой purchaseProduct
при успешной покупке продукта.
SubscriptionToken
состоит из invoiceId
покупки и userId
, записанных через точку: $invoiceId.$userId
.
Также можно получить subscriptionToken
в сущности Purchase
. Сущность Purchase
можно получить используя метод getPurchases
.
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.purchaseProduct(productId).addOnSuccessListener(paymentResult -> {
if (paymentResult instanceof PaymentResult.Success) {
String subscriptionToken = ((PaymentResult.Success) paymentResult).getSubscriptionToken();
yourApi.validate(subscriptionToken);
}
});
Также можно получить subscriptionToken
в сущности Purchase
. Сущность Purchase
можно получить используя метод getPurchases
.
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.getPurchases().addOnSuccessListener(purchases -> {
for (Purchase purchase : purchases) {
yourApi.validate(purchase.getSubscriptionToken());
}
});