从 Google Play Billing SDK 迁移到 Aptoide Billing SDK
概述
此迁移针对一次性产品(消费型),将 Google Play Billing SDK(com.android.billingclient:billing)替换为 Aptoide Billing SDK(com.aptoide:android-aptoide-billing)。由于 Aptoide Billing SDK 在结构上与 Google Play Billing 相似,因此只需进行少量有针对性的代码更改即可,下面的步骤将逐一说明确切需要替换或重构的内容。
迁移示例
...
// Update the imports from Google Play package to Aptoide package
import android.app.Activity
import android.content.Context
import android.util.Log
-import com.android.billingclient.api.AcknowledgePurchaseResponseListener
-import com.android.billingclient.api.BillingClient
-import com.android.billingclient.api.BillingClient.BillingResponseCode
-import com.android.billingclient.api.BillingClient.ProductType
-import com.android.billingclient.api.BillingClientStateListener
-import com.android.billingclient.api.BillingFlowParams
-import com.android.billingclient.api.BillingResult
-import com.android.billingclient.api.ConsumeParams
-import com.android.billingclient.api.ConsumeResponseListener
-import com.android.billingclient.api.ProductDetails
-import com.android.billingclient.api.Purchase
-import com.android.billingclient.api.PurchasesUpdatedListener
-import com.android.billingclient.api.QueryProductDetailsParams
-import com.android.billingclient.api.QueryProductDetailsParams.Product
-import com.android.billingclient.api.QueryProductDetailsResult
-import com.android.billingclient.api.QueryPurchasesParams
+import com.aptoide.sdk.billing.AptoideBillingClient
+import com.aptoide.sdk.billing.AptoideBillingClient.BillingResponseCode
+import com.aptoide.sdk.billing.AptoideBillingClient.FeatureType
+import com.aptoide.sdk.billing.AptoideBillingClient.ProductType
+import com.aptoide.sdk.billing.BillingFlowParams
+import com.aptoide.sdk.billing.BillingResult
+import com.aptoide.sdk.billing.ConsumeParams
+import com.aptoide.sdk.billing.ProductDetails
+import com.aptoide.sdk.billing.Purchase
+import com.aptoide.sdk.billing.PurchasesUpdatedListener
+import com.aptoide.sdk.billing.QueryProductDetailsParams
+import com.aptoide.sdk.billing.QueryProductDetailsParams.Product
+import com.aptoide.sdk.billing.QueryProductDetailsResult
+import com.aptoide.sdk.billing.QueryPurchasesParams
+import com.aptoide.sdk.billing.listeners.AptoideBillingClientStateListener
+import com.aptoide.sdk.billing.listeners.ConsumeResponseListener
...
// Change the type of billingClient to AptoideBillingClient
-var billingClient: BillingClient
+val billingClient: AptoideBillingClient
...
// Update billingClientStateListener to AptoideBillingClientStateListener
-val billingClientStateListener: BillingClientStateListener
+val aptoideBillingClientStateListener: AptoideBillingClientStateListener
get() =
- object : BillingClientStateListener {
+ object : AptoideBillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
...
}
override fun onBillingServiceDisconnected() {
...
}
}
...
// Initialize the SDK with the AptoideBillingClient Builder
// by setting the Public Key and
// remove enablePendingPurchases
fun setupSdkConnection(context: Context) {
- billingClient = BillingClient.newBuilder(context)
+ billingClient = AptoideBillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
- .enablePendingPurchases()
+ .setPublicKey(PUBLIC_KEY)
.build()
- billingClient.startConnection(billingClientStateListener)
+ billingClient.startConnection(aptoideBillingClientStateListener)
}
...
// Update the Payment initialization by launching it from a background Thread
fun launchPayment(activity: Activity, obfuscatedAccountId: String, productDetailsParamsList: List<BillingFlowParams.ProductDetailsParams>) {
val billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setObfuscatedAccountId(obfuscatedAccountId)
.build()
- billingClient.launchBillingFlow(activity, billingFlowParams)
+ Thread {
+ billingClient.launchBillingFlow(activity, billingFlowParams)
+ }.start()
}
...
迁移步骤摘要
要成功迁移您的一次性产品集成,请应用以下更改:
-
更新 SDK 依赖项
在您的build.gradle中,将 Google Play Billing SDK 依赖项替换为 Aptoide Billing SDK。 -
更新导入
将所有引用 Google Play Billing 的类导入更新为相应的 Aptoide Billing SDK 类。 -
重构 Billing 客户端初始化
将BillingClient替换为AptoideBillingClient,并通过.setPublicKey()提供公钥。 -
更新购买流程
使用相同的计费流程结构,但确保对launchBillingFlow()的调用在后台线程中完成,以支持 Aptoide WebPayments。
1. 更新 SDK 依赖项
操作内容:
从您的 build.gradle 文件中移除对 Google Play Billing 的依赖项,转而添加 Aptoide Billing SDK。
您还应同步您的项目,并确保您的应用使用最新的稳定版 Aptoide billing 版本。
Google Play SDK:
implementation("com.android.billingclient:billing:8.0.0")
Aptoide SDK:
implementation("com.aptoide:android-aptoide-billing:1.+")
2. 更新导入
将所有对 com.android.billingclient.api 中类的引用替换为来自 com.aptoide.sdk.billing 的相应 Aptoide Billing SDK 类。
大多数类名保持不变(Purchase、ProductDetails、BillingFlowParams 等),但来自不同的软件包。
Google Play 导入:
import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.Purchase
import com.android.billingclient.api.ProductDetails
import com.android.billingclient.api.QueryProductDetailsParams
import com.android.billingclient.api.BillingFlowParams
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.ProductDetails;
import com.android.billingclient.api.QueryProductDetailsParams;
import com.android.billingclient.api.BillingFlowParams;
Aptoide 导入:
import com.aptoide.sdk.billing.AptoideBillingClient
import com.aptoide.sdk.billing.Purchase
import com.aptoide.sdk.billing.ProductDetails
import com.aptoide.sdk.billing.QueryProductDetailsParams
import com.aptoide.sdk.billing.BillingFlowParams
import com.aptoide.sdk.billing.AptoideBillingClient;
import com.aptoide.sdk.billing.Purchase;
import com.aptoide.sdk.billing.ProductDetails;
import com.aptoide.sdk.billing.QueryProductDetailsParams;
import com.aptoide.sdk.billing.BillingFlowParams;
3. 重构 Billing 客户端初始化
将 BillingClient 的实例化替换为 AptoideBillingClient。与 Google Play Billing 不同,Aptoide SDK 要求您通过 .setPublicKey() 设置公钥,并使用带有 AptoideBillingClientStateListener 的 startConnection()。
您可以从 Aptoide Connect 检索您的公钥。
Google Play 初始化:
val billingClientStateListener: BillingClientStateListener
get() =
object : BillingClientStateListener {
...
}
val billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.build()
billingClient.startConnection(billingClientStateListener)
BillingClientStateListener billingClientStateListener = new BillingClientStateListener() {
...
};
BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.build();
billingClient.startConnection(billingClientStateListener);
Aptoide 初始化:
val aptoideBillingClientStateListener: AptoideBillingClientStateListener
get() =
object : AptoideBillingClientStateListener {
...
}
val billingClient = AptoideBillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.setPublicKey(MY_PUBLIC_KEY)
.build()
billingClient.startConnection(aptoideBillingClientStateListener)
AptoideBillingClientStateListener aptoideBillingClientStateListener = new AptoideBillingClientStateListener() {
...
};
AptoideBillingClient billingClient = AptoideBillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.setPublicKey(MY_PUBLIC_KEY)
.build();
billingClient.startConnection(aptoideBillingClientStateListener);
4. 更新购买流程
创建并传递 ProductDetailsParams 的逻辑与 Google 中相同。不过,Aptoide 要求对 launchBillingFlow() 的调用从后台线程而非 UI 线程发起。这可确保在未安装原生 Wallet 应用时与 Aptoide 的 WebPayment 回退兼容。
Google Play 购买流程:
val billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(listOf(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.build()
))
.build()
billingClient.launchBillingFlow(activity, billingFlowParams)
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(List.of(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.build()
))
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Aptoide 购买流程:
val billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(listOf(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.build()
))
.build()
Thread {
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
runOnUiThread {
// Handle billingResult
}
}.start()
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(List.of(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.build()
))
.build();
new Thread(() -> {
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
activity.runOnUiThread(() -> {
// Handle billingResult
});
}).start();
更改对比表
| 功能 | Google Play Billing | Aptoide Billing SDK |
|---|---|---|
| SDK 依赖项 | com.android.billingclient | com.aptoide:android-aptoide-billing |
| 导入 | Google Play 类(com.android.billingclient.api) | Aptoide Billing 类(com.aptoide.sdk.billing) |
| Billing 客户端命名 | BillingClient | AptoideBillingClient |
| 公钥要求 | ❌ | ✅ 需要 .setPublicKey(...) |
| 在特定线程中启动 Billing 流程 | UI/主线程 | ✅ 必须使用后台线程以支持 WebPayments |
FAQ
在哪里可以找到完整的 Aptoide Billing SDK 集成文档?
我们关于 Aptoide Billing SDK 集成的完整文档可在此处找到。它包含完整且成功集成我们计费系统的最重要步骤。
在哪里可以找到我应用的公钥?
要获取您应用的公钥并使用它来初始化 Billing 客户端,请遵循本指南。
我的应用包含订阅,是否有任何差异?
订阅在 Aptoide Billing SDK 中遵循不同的结构,需要进行一些额外的更改才能正确集成它们。请遵循我们完整的集成指南,因为它包含所有必要的步骤。
如果您有任何其他问题或疑问,请联系我们的官方支持渠道。