Миграция SDK платежей c версии 1.x.x до версии 3.х.х

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

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

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

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

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

Изменение моделей

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

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

Вызов метода getProducts
ProductsUseCase productsUseCase = billingClient.getProducts();
productsUseCase.getProducts(Arrays.asList("id1""id2")).addOnCompleteListener(new OnCompleteListener<List<Product>>() {
    @Override
    public void onFailure(@NonNull Throwable throwable) {
        // Process error
    }
  
    @Override
    public void onSuccess(List<Product> products) {
        // Process success
    }
});

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

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

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

Вызов метода получения списка покупок пользователя
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.getPurchases().addOnCompleteListener(new OnCompleteListener<List<Purchase>>() {
    @Override
    public void onFailure(@NonNull Throwable throwable) {
        // Process error
    }
  
    @Override
    public void onSuccess(List<Purchase> purchases) {
        // Process success
    }
});

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

Получение информации о покупке

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

Вызов метода получения списка покупок пользователя
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.getPurchaseInfo("purchaseId").addOnCompleteListener(new OnCompleteListener<Purchase>() {
    @Override
    public void onFailure(@NonNull Throwable throwable) {
        // Process error
    }
  
    @Override
    public void onSuccess(Purchase purchase) {
        // Process success
    }
});

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

Покупка продукта 

Изменилась модель результата покупки продукта. Обновленная модель представлена ниже:

Структура результата покупки
interface PaymentResult {
      
    interface Success extends PaymentResult {
        @Nullable
        public String getOrderId();
          
        public String getPurchaseId();
          
        public String getProductId();
  
        public String getInvoiceId();
          
        @Nullable
        public String getSubscriptionToken();
    }
      
    interface Failure extends PaymentResult {
        @Nullable
        public String getPurchaseId();
          
        @Nullable
        public String getInvoiceId();
          
        @Nullable
        public String getOrderId();
          
        @Nullable
        public Integer getQuantity();
          
        @Nullable
        public String getProductId();
  
        @Nullable
        public Integer getErrorCode();
    }
  
    interface Cancelled extends PaymentResult {
        public String getPurchaseId();
    }         
  
    interface InvalidPaymentState extends PaymentResult {}
}

где:

  • Success – результат успешного завершения покупки цифрового товара.
  • Failure – результат ошибки покупки цифрового товара.
  • Cancelled – результат отмены покупки цифрового товара.
  • InvalidPaymentState – ошибка работы SDK платежей. Может возникнуть, в случае некоторретного обратного deeplink.

Особое внимание нужно обратить на сценарии потребления и отмены покупки! 

Потребление (подтверждение) покупки

Изменилась модель результата потребления покупки. Теперь потребление может либо закончиться успехом, либо ошибкой:

Вызов метода подтверждения
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.confirmPurchase("purchaseId""developerPayload").addOnCompleteListener(new OnCompleteListener<Unit>() {
    @Override
    public void onFailure(@NonNull Throwable throwable) {
        // Process error
    }
  
    @Override
    public void onSuccess(Unit result) {
        // Process success
    }
});

Отмена покупки

Изменилась модель результата отмены покупки. Теперь отмена покупки может либо закончиться успехом, либо ошибкой:

Вызов метода отмены покупки
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.deletePurchase("purchaseId").addOnCompleteListener(new OnCompleteListener<Unit>() {
    @Override
    public void onFailure(@NonNull Throwable throwable) {
        // Process error
    }
  
    @Override
    public void onSuccess(Unit result) {
        // Process success
    }
});

Сценарий потребления и отмены покупки

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

Метод отмены покупки (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?