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

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

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

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

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

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

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

repositories {
    maven {
    }
}

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

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

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

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

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

Перед вызовом методов библиотеки выполните ее инициализацию. Добавьте следующий код в Application вашего проекта:

public class App extends Application {
     
    @Override
    public void onCreate() {
        super.onCreate();
        Application application = this;
        String consoleApplicationId = "111111";
        String deeplinkScheme = "yourappscheme";
        RuStoreBillingClient.INSTANCE.init(application, consoleApplicationId, deeplinkScheme);
    }
}
ApplicationId, указанный в build.gradle, должен совпадать с applicationId apk-файла, который вы публиковали в системе RuStore Консоль.
Подпись keystore должна совпадать с подписью, которой было подписано приложение, опубликованное в системе RuStore Консоль. Убедитесь, что используемый buildType (пр. debug) использует такую же подпись, что и опубликованное приложение (пр. release).

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

Для возвращения в ваше приложение после оплаты через сторонние приложения (СБП, SberPay и другие) необходимо правильно реализовать обработку deeplink. Укажите в AndroidManifest.xml intent-filter с scheme вашего проекта:
<activity
    android:name=".sample.MainActivity">
  
    <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().

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

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        RuStoreBillingClient.INSTANCE.onNewIntent(getIntent());
    }
}
 
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    RuStoreBillingClient.INSTANCE.onNewIntent(intent);
}

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

Получение списка продуктов

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

RuStoreBillingClient.INSTANCE.getPurchases().getPurchases().addOnSuccessListener(purchasesResponse -> {
    List<Purchase> purchases = purchasesResponse.getPurchases();
    if (purchases == null) return;
             
    for (Purchase purchase: purchases) {
        if (purchase.getPurchaseId() != null) {
            if (purchase.getPurchaseState() == PurchaseState.CREATED || purchase.getPurchaseState() == PurchaseState.INVOICE_CREATED) {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchase.getPurchaseId());
            } else if (purchase.getPurchaseState() == PurchaseState.PAID) {
                RuStoreBillingClient.INSTANCE.getPurchases().confirmPurchase(purchase.getPurchaseId());
            }
        }
    }
});

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

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

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

private void purchaseProduct(Product product) {
    RuStoreBillingClient.INSTANCE.getPurchases().purchaseProduct(product.getProductId())
            .addOnSuccessListener(paymentResult -> handlePaymentResult(paymentResult, product))
            .addOnFailureListener(throwable -> { /* Handle error */ });
    }
 
private void handlePaymentResult(PaymentResult paymentResult, Product product) {
    if (paymentResult instanceof PaymentResult.InvalidPurchase) {
        String purchaseId = ((PaymentResult.InvalidPurchase) paymentResult).getPurchaseId();
        if (purchaseId != null) {
            RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseId);
        }
    } else if (paymentResult instanceof PaymentResult.PurchaseResult) {
        PaymentResult.PurchaseResult purchaseResult = ((PaymentResult.PurchaseResult) paymentResult);
        switch (purchaseResult.getFinishCode()) {
            case SUCCESSFUL_PAYMENT: {
                if (product.getProductType() == ProductType.CONSUMABLE) {
                    RuStoreBillingClient.INSTANCE.getPurchases().confirmPurchase(purchaseResult.getPurchaseId());
                }
                break;
            }
            case CLOSED_BY_USER: {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseResult.getPurchaseId());
                break;
            }
            case UNHANDLED_FORM_ERROR: {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseResult.getPurchaseId());
                break;
            }
            case PAYMENT_TIMEOUT: {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseResult.getPurchaseId());
                break;
            }
            case DECLINED_BY_SERVER: {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseResult.getPurchaseId());
                break;
            }
            case RESULT_UNKNOWN: {
                RuStoreBillingClient.INSTANCE.getPurchases().deletePurchase(purchaseResult.getPurchaseId());
                break;
            }
        }
    }
}

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

Was this information helpful?