Миграция до платежей версии 2.1.0

Общая информация

В версии 2.1.0 платежей был значительно изменен публичный API с целью дальнейшего удобства и гибкости использования SDK.

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

Обновление зависимости

Для обновления зависимости поднимите версию у billingclient в блоке dependencies вашего build.gradle:

build.gradle
dependencies {
    implementation("ru.rustore.sdk:billingclient:2.1.0")
}

Создание инстанса

Теперь для обращения к RuStoreBillingClient его нужно создать, используя RuStoreBillingClientFactory.create():

Создание RuStoreBillingClient
val billingClient: RuStoreBillingClient = RuStoreBillingClientFactory.create(
    context = app,
    consoleApplicationId = "111111",
    deeplinkScheme = "yourappscheme"
)
  • context  контекст android. Можно передать любой контекст, внутри используется контекст приложения. 
  • consoleApplicationId — код приложения из консоли разработчика RuStore (пример: https://console.rustore.ru/apps/111111). 
  • deeplinkScheme  cхема deeplink, необходимая для возврата в ваше приложение после оплаты через стороннее приложение (например, SberPay или СБП). SDK генерирует свой хост к данной схеме.

Таким образом, RuStoreBillingClient.init() заменен на RuStoreBillingClientFactory.create().

Вследствие этого изменения ответственность за хранение платежного клиента переходит к разработчику. Вы можете сами выбирать, когда потребуется создать RuStoreBillingClient и когда отказаться от него, экономя ресурсы.

Предлагаем создавать RuStoreBillingClient через Dependency Injection. К примеру, через Hilt:

RuStoreBillingClient с DI
@Module
@InstallIn(SingletonComponent::class)
abstract class PaymentsModule {
    companion object {
        @Provides
        @Singleton
        fun ruStoreBillingClient(@ApplicationContext context: Context): RuStoreBillingClient {
            return RuStoreBillingClientFactory.create(
                context = context,
                consoleApplicationId = "111111",
                deeplinkScheme = "yourappscheme"
            )
        }
    }
}

Получение RuStoreBillingClient с использованием Hilt может выглядеть так:

RuStoreBillingClient с DI
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var billingClient: RuStoreBillingClient
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

Обработка deeplink и рефакторинг обращения к RuStoreBillingClient

Учитывая рефакторинг получения RuStoreBillingClient, вам также потребуется поправить все обращения к RuStoreBillingClient. К примеру, обработка deeplink с использованием Hilt может быть переделана следующим образом:

onNewIntent в активити платежей
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
     
    @Inject
    lateinit var billingClient: RuStoreBillingClient
 
    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)
    }
}

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

Теперь вы можете проверить доступность платежей без создания экземпляра RuStoreBillingClient.

Проверка доступности платежей
RuStoreBillingClient.checkPurchasesAvailability(context)
    .addOnSuccessListener { result ->
        when (result) {
            is FeatureAvailabilityResult.Available -> {
                // Handle purchases available
            }
            is FeatureAvailabilityResult.Unavailable -> {
                // Handle purchases unavailable
            }
        }
    }
    .addOnFailureListener { throwable ->
        // Handle error
    }

Благодаря этому, вы можете принять решение об использовании платежей RuStore в runtime, без необходимости лишний раз создавать платёжный клиент.

Обратная совместимость с singleton

Чтобы дальше пользоваться платежным клиентом RuStore как синглтоном, сначала замените RuStoreBillingClient.init() на RuStoreBillingClientFactory.init(), а инстанс получайте через RuStoreBillingClientFactory.getSingleton():

RuStoreBillingClient как синглтон
class App : Application() {
 
    override fun onCreate() {
        super.onCreate()        
        RuStoreBillingClientFactory.init(
            application = this,
            consoleApplicationId = "111111",
            deeplinkScheme = "yourappscheme"
        )
 
        val billingClient: RuStoreBillingClient = RuStoreBillingClientFactory.getSingleton()
    }
}

Для Kotlin предлагается использовать функции extension.

Импортируйте необходимые функции из пакета ru.rustore.sdk.billingclient.utils.pub:

RuStoreBillingClient как синглтон, extension функции
import ru.rustore.sdk.billingclient.utils.pub.init
import ru.rustore.sdk.billingclient.utils.pub.onNewIntent
import ru.rustore.sdk.billingclient.utils.pub.products
import ru.rustore.sdk.billingclient.utils.pub.purchases
 
class App : Application() {
 
    override fun onCreate() {
        super.onCreate()                 
        RuStoreBillingClient.init(
            application = this,
            consoleApplicationId = "111111",
            deeplinkScheme = "yourappscheme"
        )
        val products: ProductsUseCase = RuStoreBillingClient.products
        val purchases: PurchasesUseCase = RuStoreBillingClient.purchases
        RuStoreBillingClient.onNewIntent(intent)    
    }
}

Перечисленные выше методы помечены как deprecated и могут быть удалены в следующих версиях.

Обновлено 9 июня 2023 г.
Was this information helpful?