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

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

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

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

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

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

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

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

Подключите репозиторий:

repositories {
    maven {
    }
}

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

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

dependencies {
    implementation 'ru.rustore.sdk:billingclient:2.2.0'
}

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

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

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

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

Создание RuStoreBillingClient
final Context context = getContext();
final String consoleApplicationId = "111111";
final String deeplinkScheme = "yourappscheme";
 
// Опциональные параметры
final BillingClientThemeProvider themeProvider = null;
final boolean debugLogs = false;
final ExternalPaymentLoggerFactory externalPaymentLoggerFactory = null;
 
 RuStoreBillingClient billingClient = RuStoreBillingClientFactory.INSTANCE.create(
    context,
    consoleApplicationId,
    deeplinkScheme,
    // Опциональные параметры
    themeProvider,
    debugLogs,
    externalPaymentLoggerFactory
 );
  • context — контекст Android. Может быть любым, в реализации используется applicationContext. 
  • consoleApplicationId — код приложения из консоли разработчика RuStore (пример: https://console.rustore.ru/apps/111111). 
  • deeplinkScheme — cхема 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 (пр. debug) использует такую же подпись, что и опубликованное приложение.

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

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

Для возвращения в ваше приложение после оплаты через сторонние приложения (СБП, 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().

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

public class YourBillingActivityextends AppCompatActivity {
     
    // Previously created with RuStoreBillingClientFactory.create();
    RuStoreBillingClient billingClient = YourDependencyInjection.getBillingClient();
     
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            billingClient.onNewIntent(getIntent());
        }
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        billingClient.onNewIntent(intent);
    }  
}

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

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

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

 
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.getPurchases().addOnSuccessListener(purchases -> {
    for (Purchase purchase: purchases) {
        if (purchase.getPurchaseId() != null) {
            if (purchase.getPurchaseState() == PurchaseState.CREATED || purchase.getPurchaseState() == PurchaseState.INVOICE_CREATED) {
                purchasesUseCase.deletePurchase(purchase.getPurchaseId());
            else if (purchase.getPurchaseState() == PurchaseState.PAID) {
                purchasesUseCase.confirmPurchase(purchase.getPurchaseId());
            }
        }
    }
});

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

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

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

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

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

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

private void purchaseProduct(Product product) {
    PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
    purchasesUseCase.purchaseProduct(product.getProductId())
            .addOnSuccessListener(paymentResult -> handlePaymentResult(paymentResult, product))
            .addOnFailureListener(throwable -> { /* Handle error */ });
    }
 
private void handlePaymentResult(PaymentResult paymentResult, Product product) {
    PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
    if (paymentResult instanceof PaymentResult.Cancelled) {
        String purchaseId = ((PaymentResult.Cancelled) paymentResult).getPurchaseId();
        purchasesUseCase.deletePurchase(purchaseId);
    else if (paymentResult instanceof PaymentResult.Success) {
        PaymentResult.Success purchaseResult = ((PaymentResult.Success) paymentResult);
        purchasesUseCase.confirmPurchase(purchaseResult.getPurchaseId());
    else if (paymentResult instanceof PaymentResult.Failure) {
        String purchaseId = ((PaymentResult.Failure) paymentResult).getPurchaseId();
        if (purchaseId != null) {
            purchasesUseCase.deletePurchase(purchaseId);
        }
    }
}

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

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

Обновлено 29 сентября 2023 г.
Was this information helpful?