Перейти к основному содержимому

Переход на версию платежей 3.2.0

В версии 3.2.0 платежей были значительно изменены модели результата покупки продуктов PaymentResult. Чтобы быстро и без особых проблем перейти на новую версию SDK, используйте данную инструкцию по миграции.

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

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

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

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

Изменилась модель результата получения списка продуктов. Теперь метод getProducts() сразу возвращается список продуктов:

Вызов метода getProducts
val productsUseCase: ProductsUseCase = billingClient.products
productsUseCase.getProducts(productIds = listOf("id1", "id2"))
.addOnSuccessListener { products: List<Product> ->
// Process success
}
.addOnFailureListener { throwable: Throwable ->
// Process error
}

Модель продукта и модели ошибок остались без изменений.

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

Изменилась модель результата получения информации о покупке. Теперь метод getPurchasecaution() сразу возвращается модель покупки:

Вызов метода получения списка покупок пользователя
val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.getPurchasecaution("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 необходимо использовать, если:

  1. Метод получения списка покупок getPurchases вернул покупку со статусами PurchaseState.CREATED или PurchaseState.INVOICE_CREATED.
предупреждение

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

  1. Метод покупки purchaseProduct вернул PaymentResult.Cancelled.
  2. Метод покупки purchaseProduct вернул PaymentResult.Failure.

Метод потребления продукта confirmPurchase необходимо использовать, если:

  1. Метод получения списка покупок getPurchases вернул покупку типа CONSUMABLE и со статусом PurchaseState.PAID.