📌  相关文章
📜  如何在 Android 中实现应用内购买?(1)

📅  最后修改于: 2023-12-03 14:52:12.840000             🧑  作者: Mango

如何在 Android 中实现应用内购买

应用内购买(In-App Purchase, IAP)是指用户可以通过应用程序内部购买虚拟商品、订阅服务或解锁功能的功能。在 Android 开发中,可以通过使用 Google Play Billing Library 来实现应用内购买功能。

以下是在 Android 中实现应用内购买的步骤:

步骤一:配置 Google Play Console
  1. Google Play Console 中创建一个新的应用,或者选择一个已存在的应用。
  2. 在应用的 In-app products(应用内商品)部分,创建你的虚拟商品或订阅项目,设置价格、描述等信息。
  3. 配置应用内购买的许可证和公钥。
步骤二:添加依赖和权限

在项目的 build.gradle 文件中添加以下依赖:

implementation 'com.android.volley:volley:1.1.1'
implementation 'com.android.billingclient:billing:4.0.0'

在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="com.android.vending.BILLING" />
步骤三:初始化 BillingClient

在应用启动时,创建并初始化 BillingClient 对象,连接 Google Play 商店。可以在 Application 类的 onCreate 方法中进行初始化:

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.PurchasesUpdatedListener;

public class MyApp extends Application {

    private BillingClient billingClient;

    @Override
    public void onCreate() {
        super.onCreate();
        
        billingClient = BillingClient.newBuilder(this)
                .setListener(new PurchasesUpdatedListener() {
                    @Override
                    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
                        // 处理购买结果
                    }
                })
                .enablePendingPurchases()
                .build();

        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                // 连接成功
            }

            @Override
            public void onBillingServiceDisconnected() {
                // 连接断开
            }
        });
    }
}
步骤四:查询可购买商品

在需要展示可购买商品列表的界面,使用 BillingClient 查询可购买商品的信息:

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;

billingClient.querySkuDetailsAsync(SkuDetailsParams.newBuilder()
        .setType(BillingClient.SkuType.INAPP)  // 查询应用内商品
        .setSkusList(Arrays.asList("productId1", "productId2"))  // 商品 ID 列表
        .build(),
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
            // 处理商品信息列表
        }
    });
步骤五:启动购买流程

当用户点击购买按钮时,启动购买流程:

import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.ConsumeParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchaseParams;
import com.android.billingclient.api.PurchaseResult;
import com.android.billingclient.api.PurchasesUpdatedListener;

// 发起购买
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)  // 商品信息
        .build();
billingClient.launchBillingFlow(activity, flowParams);

// 处理购买结果(已在初始化 BillingClient 时设置了 Listener)
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {
        for (Purchase purchase : purchases) {
            // 处理购买成功的商品
            // 如果是订阅商品,记得调用 acknowledgePurchase 或 consumeAsync 方法
        }
    } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
        // 用户取消购买
    } else {
        // 购买失败
    }
}
步骤六:处理购买的消耗或订阅

对于应用内非消耗性商品,需要调用 BillingClient.acknowledgePurchaseBillingClient.consumeAsync 方法来消耗购买项。

// 消耗商品
ConsumeParams consumeParams = ConsumeParams.newBuilder()
        .setPurchaseToken(purchase.getPurchaseToken())
        .build();
billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
    @Override
    public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
        // 消耗成功
    }
});

// 对于订阅商品,调用 acknowledgePurchase 方法
billingClient.acknowledgePurchase(AcknowledgePurchaseParams.newBuilder()
        .setPurchaseToken(purchase.getPurchaseToken())
        .build(), new AcknowledgePurchaseResponseListener() {
    @Override
    public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
        // 完成订阅确认
    }
});

以上是在 Android 中实现应用内购买的基本步骤和代码示例。根据具体情况,你可以根据返回的 BillingResult 对象来处理购买结果,并进行相应的业务逻辑处理。