You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google In-app Billing v4的TrivialDriveSample太复杂,有没有更简单的实现示例?

Android 单消耗型商品内结算极简实现方案

你完全可以直接剥离官方Billing库的核心API逻辑,跳过示例里的复杂架构封装,自行实现适配需求的极简版本,总代码量可以控制在100行以内,完全可以直接取用。

前置配置

  • 先完成Google Play Console的商品配置、商户账户绑定,将你配置的消耗型商品ID提前写死在代码中
  • debug环境可以直接使用Google Play官方提供的静态测试卡,不需要绑定真实支付账户即可完成全流程测试

核心实现步骤

1. 引入依赖

在模块级build.gradle中添加官方Billing库依赖:

dependencies {
    implementation "com.android.billingclient:billing-ktx:6.2.1"
}

2. 核心逻辑实现

直接在需要触发支付的Activity/Fragment中添加如下逻辑即可,不需要引入ViewModel、Factory等额外架构组件:

// 初始化BillingClient
private val billingClient = BillingClient.newBuilder(this)
    .setListener { billingResult, purchases ->
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
            // 支付成功,直接确认消费
            val consumeParams = ConsumeParams.newBuilder()
                .setPurchaseToken(purchases.first().purchaseToken)
                .build()
            billingClient.consumeAsync(consumeParams) { _, _ ->
                // 消费完成,给用户发放对应报告
                deliverReportToUser()
            }
        } else {
            // 所有异常情况统一按失败处理
            showPayFailedTip()
        }
    }
    .enablePendingPurchases()
    .build()

// 拉起支付方法,直接在支付按钮点击事件中调用
private fun launchPay() {
    billingClient.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(billingResult: BillingResult) {
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                // 查询你配置的消耗型商品
                val params = QueryProductDetailsParams.newBuilder()
                    .setProductList(
                        listOf(
                            QueryProductDetailsParams.Product.newBuilder()
                                .setProductId("你的消耗型商品ID")
                                .setProductType(BillingClient.ProductType.INAPP)
                                .build()
                        )
                    )
                    .build()
                billingClient.queryProductDetailsAsync(params) { _, productDetailsList ->
                    productDetailsList.firstOrNull()?.let { productDetails ->
                        // 拉起支付页
                        val billingFlowParams = BillingFlowParams.newBuilder()
                            .setProductDetailsParamsList(
                                listOf(
                                    BillingFlowParams.ProductDetailsParams.newBuilder()
                                        .setProductDetails(productDetails)
                                        .build()
                                )
                            )
                            .build()
                        billingClient.launchBillingFlow(this@YourActivity, billingFlowParams)
                    } ?: showPayFailedTip()
                }
            } else {
                showPayFailedTip()
            }
        }
        override fun onBillingServiceDisconnected() {
            showPayFailedTip()
        }
    })
}

上述代码已经去掉了所有非必要的架构封装、异常重试逻辑,完全符合你「要么成功要么失败、仅单个消耗型商品」的需求,可以直接复制到项目中适配修改。

内容的提问来源于stack exchange,提问作者user462990

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:21:03