Миграция до платежей версии 2.2.0
Общая информация
В версии 2.2.0 платежей были значительно изменены модели результата покупки продуктов PaymentResult.
Для того, чтобы быстро и без особых проблем перейти на новую версию SDK, используйте данную инструкцию по миграции.
Обновление зависимости
Для обновления зависимости, поднимите версию у billingclient в блоке dependencies вашего build.gradle:
dependencies { implementation( "ru.rustore.sdk:billingclient:2.2.0" ) } |
Изменение моделей
Получение списка продуктов
Изменилась модель результата получения списка продуктов. Теперь метод getProducts() сразу возвращается список продуктов:
val productsUseCase: ProductsUseCase = billingClient.products productsUseCase.getProducts(productIds = listOf( "id1" , "id2" )) .addOnSuccessListener { products: List<Product> -> // Process success } .addOnFailureListener { throwable: Throwable -> // Process error } |
Модель продукта и модели ошибок остались без изменений.
Получение списка покупок
Изменилась модель результата получения списка покупок. Теперь метод getPurchases() сразу возвращается список покупок:
val purchasesUseCase: PurchasesUseCase = billingClient.purchases purchasesUseCase.getPurchases() .addOnSuccessListener { purchases: List<Purchase> -> // Process success } .addOnFailureListener { throwable: Throwable -> // Process error } |
Модель покупки и модели ошибок остались без изменений.
Получение информации о покупке
Изменилась модель результата получения информации о покупке. Теперь метод getPurchaseInfo() сразу возвращается модель покупки:
val purchasesUseCase: PurchasesUseCase = billingClient.purchases purchasesUseCase.getPurchaseInfo( "purchaseId" ) .addOnSuccessListener { purchase: Purchase -> // Process success } .addOnFailureListener { throwable: Throwable -> // Process error } |
Модели ошибок остались без изменений.
Покупка продукта
Изменилась модель результата покупки продукта. Обновленная модель представлена ниже:
public sealed interface PaymentResult { public data class Success( val orderId: String?, val purchaseId: String, val productId: String, val invoiceId: String, val subscriptionToken: String? = null , ) : PaymentResult public data class Cancelled( val purchaseId: String, ) : PaymentResult public data class Failure( val purchaseId: String?, val invoiceId: String?, val orderId: String?, val quantity: Int?, val productId: String?, val errorCode: Int?, ) : PaymentResult public object InvalidPaymentState : PaymentResult() } |
где:
- Success — результат успешного завершения покупки цифрового товара.
- Failure — результат ошибки покупки цифрового товара.
- Cancelled — результат отмены покупки цифрового товара.
- InvalidPaymentState — ошибка работы SDK платежей. Может возникнуть, в случае некорректного обратного deeplink.
Обратите особое внимание на сценарии потребления и отмены покупки.
Потребление (подтверждение) покупки
Изменилась модель результата потребления покупки. Теперь потребление может либо закончиться успехом, либо ошибкой:
val purchasesUseCase: PurchasesUseCase = billingClient.purchases purchasesUseCase.confirmPurchase(purchaseId = "purchaseId" , developerPayload = null ) .addOnSuccessListener { // Process success }.addOnFailureListener { throwable: Throwable -> // Process error } |
Отмена покупки
Изменилась модель результата отмены покупки. Теперь отмена покупки может либо закончиться успехом, либо ошибкой:
val purchasesUseCase: PurchasesUseCase = billingClient.purchases purchasesUseCase.deletePurchase(purchaseId = "purchaseId" ) .addOnSuccessListener { // Process success }.addOnFailureListener { throwable: Throwable -> // Process error } |
Сценарий потребления и отмены покупки
В связи с тем, что изменилась модель результата покупки продукта, изменилась и логика потребления и отмены покупки.
Метод отмены покупки (deletePurchase) необходимо использовать, если:
-
Метод получения списка покупок (getPurchases) вернул покупку со статусами PurchaseState.CREATED или PurchaseState.INVOICE_CREATED.
В некоторых случаях, после оплаты через приложение банка (СБП, СберPay, TinkoffPay и т. д.), при последующем возврате обратно в AnyApp приложение, статус покупки может быть всё ещё PurchaseState.INVOICE_CREATED. Это связано с временем обработки покупки на стороне банка. Поэтому разработчику необходимо правильно связать логику получения списка покупок с жизненного цикла экрана.
Альтернативным вариантом решения данной проблемы является отмена покупки в статусе PurchaseState.INVOICE_CREATED только через взаимодействие пользователя с приложением. Например, вынести эту логику в отдельную кнопку.
- Метод покупки (purchaseProduct) вернул PaymentResult.Cancelled.
- Метод покупки (purchaseProduct) вернул PaymentResult.Failure.
Метод потребления продукта (confirmPurchase) необходимо использовать, если:
- Метод получения списка покупок (getPurchases) вернул покупку типа CONSUMABLE и со статусом PurchaseState.PAID.