Миграция SDK платежей c версии 1.x.x до версии 3.х.х
В версии 3.0.0 платежей были значительно изменены модели результата покупки продуктов PaymentResult.
Для того, чтобы быстро и без особых проблем перейти на новую версию SDK, используйте данную инструкцию по миграции.
Обновление зависимости
Для обновления зависимости, поднимите версию у billingclient в блоке dependencies вашего build.gradle:
dependencies { implementation( "ru.rustore.sdk:billingclient:3.1.0" ) } |
Изменение моделей
Получение списка продуктов
Изменилась модель результата получения списка продуктов. Теперь метод 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) необходимо использовать, если:
-
Метод получения списка покупок (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.