跳到主要内容

迁移到支付版本2.2.0

注意

该门户网站正在开发中。文档的完整版本请看这里.

概述

在支付版本 2.2.0 中,PaymentResult 中的产品购买结果模型发生了显著变化。

为了快速且无大问题地迁移到 SDK 的新版本,请遵循此迁移指南。

更新依赖项

为了更新依赖项,请在您的 build.gradle 文件的 dependencies 区域中升级 billingclient 的版本:

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()** 方法会直接返回购买列表:

```js
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()
}

买模型和错误模型保持不变。

获取购买信息

获取购买信息的结果模型发生了变化。现在,getPurchaseInfo() 方法会直接返回购买模型:

val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.confirmPurchase(purchaseId = "purchaseId" , developerPayload = null )
.addOnSuccessListener {
// 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。

某些情况下,通过银行应用程序(如快速支付系统(SBP)、SberPay、T-Pay等)支付后,当用户随后返回到AnyApp应用程序时,购买的状态可能仍然是 PurchaseState.INVOICE_CREATED。这与银行端处理购买的时间有关。因此,开发者需要正确地将获取购买列表的逻辑与屏幕生命周期相结合。解决这个问题的另一种方法是,只有在用户与应用程序交互时,才取消处于 PurchaseState.INVOICE_CREATED 状态的购买。例如,可以将这个逻辑放到一个单独的按钮中。

  1. 购买方法 (purchaseProduct) 返回 PaymentResult.Cancelled。
  2. 购买方法 (purchaseProduct) 返回 PaymentResult.Failure。

如果出现以下情况,应使用产品消耗方法(confirmPurchase):

  1. 获取购买列表的方法 (getPurchases) 返回了类型为 CONSUMABLE 且状态为 PurchaseState.PAID 的购买。