Условия работы платежей
Для работы проведения платежей необходимо соблюдение всех условий:
- На устройстве пользователя установлено приложение RuStore.
- Приложение RuStore поддерживает функциональность платежей.
- Пользователь авторизован в приложении RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Для приложения включена возможность покупок в системе RuStore Консоль.
Сервис имеет некоторые ограничения на работу за пределами РФ.
Добавление репозитория
Подключите репозиторий:
Подключение зависимости
Добавьте следующий код в свой конфигурационный файл для подключения зависимости:
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); } } |
- consoleApplicationId — код приложения из системы RuStore Консоль (пример: https://console.rustore.ru/apps/111111).
ApplicationId, указанный в build.gradle, должен совпадать с applicationId apk-файла, который вы публиковали в системе RuStore Консоль.
Подпись keystore должна совпадать с подписью, которой было подписано приложение, опубликованное в системе RuStore Консоль. Убедитесь, что используемый buildType (пр. debug) использует такую же подпись, что и опубликованное приложение (пр. release).
Чтобы узнать подробности инициализации библиотеки, ознакомьтесь с информацией.
Обработка deeplink
Для возвращения в ваше приложение после оплаты через сторонние приложения (СБП, 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()); } 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 ; } } } } |
Чтобы узнать подробности о покупке продукта, ознакомьтесь с информацией.