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

Быстрый старт

примечание

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

  • Kotlin;
  • Java.

Пример реализации

Ознакомьтесь с приложением-примером чтобы узнать, как правильно интегрировать платежи.

примечание

Методы SDK возвращают Task, асинхронную задачу, которая возвращает ошибку или значение в соответствующих callback. Имейте это ввиду при вызове callback для синхронного получения результата, их надо использовать из фонового потока.

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

Для работы проведения платежей необходимо соблюдение всех перечисленных ниже условий.

  1. На устройстве пользователя установлено приложение RuStore.
  2. Приложение RuStore поддерживает функциональность платежей.
  3. Пользователь авторизован в приложении RuStore.
  4. Пользователь и приложение не должны быть заблокированы в RuStore.
  5. Для приложения включена возможность покупок в Консоли RuStore.
предупреждение

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

Добавление репозитория

Подключите репозиторий (см. ниже).

repositories {
maven {
url = uri("https://artifactory-external.vkpartner.ru/artifactory/maven")
}
}

Подключение зависимости

Добавьте следующий код в свой конфигурационный файл для подключения зависимости.

dependencies {
implementation("ru.rustore.sdk:billingclient:5.0.0")
}

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

Инициализация библиотеки в проекте

Перед вызовом методов библиотеки необходимо выполнить ее инициализацию.

Создайте RuStoreBillingClient, используя RuStoreBillingClientFactory.create().

val billingClient: RuStoreBillingClient = RuStoreBillingClientFactory.create(
context = app,
consoleApplicationId = "111111",
deeplinkScheme = "yourappscheme",
// Опциональные параметры
themeProvider = null,
debugLogs = false,
externalPaymentLoggerFactory = null,
)
  • context — контекст Android. Может быть любым, в реализации используется applicationContext.
  • consoleApplicationId — код приложения из консоли разработчика RuStore (пример: https://console.rustore.ru/apps/111111).
  • deeplinkScheme — схема deeplink, необходимая для возврата в ваше приложение после оплаты через стороннее приложение (например, SberPay или СБП). SDK генерирует свой хост к данной схеме.
  • themeProvider — интерфейс, который предоставляет тему BillingClientTheme. Возможны 2 реализации темы BillingClientTheme: светлая (Light) и тёмная (Dark). Данный интерфейс необязательный, по умолчанию применяется светлая тема.
  • externalPaymentLoggerFactory — интерфейс, который предоставляет доступ ко внешнему логгеру. Логирование
  • debugLogs — флаг, регулирующий логирование (логи будут автоматически отключены для Release-сборок). Логирование
к сведению
  • ApplicationId, указанный в build.gradle, должен совпадать с applicationId APK-файла, который вы публиковали в системе RuStore Консоль.
  • Схема deeplink, передаваемая в deeplinkScheme, должна совпадать со схемой, указанной в AndroidManifest.xml в разделе Обработка deeplink.
  • Подпись keystore должна совпадать с подписью, которой было подписано приложение, опубликованное в Консоли RuStore. Убедитесь, что используемый buildType использует такую же подпись, что и опубликованное приложение.

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

Чтобы узнать подробности инициализации библиотеки, ознакомьтесь с информацией об инициализации.

Для возвращения в ваше приложение после оплаты через сторонние приложения (СБП, SberPay и другие) необходимо правильно реализовать обработку deeplink. Укажите в AndroidManifest.xml intent-filter с scheme вашего проекта.

<activity
android:name=".YourBillingActivity">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="yourappscheme" />
</intent-filter>

</activity>

Здесь: yourappscheme — схема вашего deeplink, может быть изменена на другую. Эта схема должна совпадать с параметром deeplinkScheme, передаваемым в init().

Также для успешного возврата в приложение нужно добавить следующий код.

class YourBillingActivity: AppCompatActivity() {

// Previously created with RuStoreBillingClientFactory.create()
private val billingClient: RuStoreBillingClient = YourDependencyInjection.getBillingClient()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
billingClient.onNewIntent(intent)
}
}

override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
billingClient.onNewIntent(intent)
}
}

Чтобы узнать подробности обработки deeplink, ознакомьтесь с информацией о deeplink.

Получение списка покупок

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

val purchasesUseCase = billingClient.purchases
val purchases = purchasesUseCase.getPurchases().await().orEmpty()
purchases.forEach { purchase ->
val purchaseId = purchase.purchaseId
if (purchaseId != null) {
when (purchase.purchaseState) {
PurchaseState.CREATED, PurchaseState.INVOICE_CREATED -> {
purchasesUsecase.deletePurchase(purchaseId).await() }
PurchaseState.PAID -> {
purchasesUsecase.confirmPurchase(purchaseId).await()
}
else -> Unit
}
}
}
предупреждение

В некоторых случаях после оплаты через приложение банка (СБП, SberPay, TinkoffPay и т. д.) при последующем возврате обратно в AnyApp приложение статус покупки может быть всё ещё PurchaseState.INVOICE_CREATED. Это связано с временем обработки покупки на стороне банка. Поэтому разработчику необходимо правильно связать логику получения списка покупок с ЖЦ экрана.

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

Чтобы узнать подробности об обработке статусов покупок, ознакомьтесь с информацией.

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

Покупка продукта

Обработать результат покупки необходимо следующим образом.

private fun purchaseProduct(product: Product) {
val purchasesUseCase = billingClient.purchases
purchasesUseCase.purchaseProduct(product.productId)
.addOnSuccessListener { paymentResult ->
handlePaymentResult(paymentResult, product)
}
.addOnFailureListener {
// Handle error
}
}
private fun handlePaymentResult(paymentResult: PaymentResult, product: Product) {
when (paymentResult) {
is PaymentResult.Cancelled -> {
// custom logic
}

is PaymentResult.Success -> {
confirmPurchase(paymentResult.purchaseId)
}

is PaymentResult.Failure -> {
paymentResult.purchaseId?.let { // custom logic }
}
}
}

Чтобы узнать подробности о покупке продукта, ознакомьтесь с информацией.

Чтобы узнать подробности о обработке статусов покупок, ознакомьтесь с информацией.