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
相关产品推荐
相关产品推荐

