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

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

В версии 2.2.0 платежей были значительно изменены модели результата покупки продуктов PaymentResult.

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

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

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

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) необходимо использовать, если:

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

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

    Альтернативным вариантом решения данной проблемы является отмена покупки в статусе PurchaseState.INVOICE_CREATED только через взаимодействие пользователя с приложением. Например, вынести эту логику в отдельную кнопку.

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

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

  1. Метод получения списка покупок (getPurchases) вернул покупку типа CONSUMABLE и со статусом PurchaseState.PAID.
Обновлено 5 октября 2023 г.
Was this information helpful?