android 实现google 订阅支付

在 Android 上实现 Google Play 订阅支付是一项系统工程。2026 年的支付架构已全面转向"订阅 2.0",即 一个订阅 ID 下包含多个基础方案(Base Plans) 的模式

一、Google Play Console 后台配置

创建订阅产品

  1. 登录Google Play Console。

  2. 进入 借助Play变现**> 商品 > 订阅**

3.创建订阅 :设置一个 Product ID(如 pro_membership)。

4.添加基础方案 (Base Plan):

定义计费周期(月、年)。

关键点:设置价格后,务必点击"激活基础方案"。

向后兼容性:在基础方案设置中,勾选"向后兼容",这样旧版 SDK 也能识别。

二、关联 Google Cloud 服务账号 (API 接入)

  1. 在Google Cloud 控制台创建项目并启用 Google Play Android Developer API

2.创建服务账号 (Service Account),操作->管理密钥->添加键->键类型Json->创建 ,下载 JSON 密钥文件

3.创建项目并启用api

4.回到Google Play Console 控制台,点击用户和权限->点击邀请新用户->邮箱填上面Google Cloud创建的邮箱->账号权限要给"查看财务数据"和"管理订单和订阅"权限

三、环境配置与测试准备

1. 许可测试设置 (License Testing)

在 Play Console 的"全局设置"中找到 许可测试,添加你的测试 Gmail 账号。这样你测试时可以使用"测试卡片",不会产生真实扣费。

  1. 测试版本发布
  • 必须发布 :你必须上传一个包含 Billing 权限的 AAB 包到 内部测试轨道 (Internal Testing)

  • 签名一致:本地调试运行的 App 包名和签名必须与测试轨道上的包完全一致。

  1. 手机必须安装Play store

打开play store-> 点击头像 -> 设置 ->关于->快速点击play store 版本号进入开发者模式->常规->账号和设备偏好设置->国家地区和个人资料选择非中国区

四、代码实现 (使用原生 Billing Library)

目前主流版本为 Google Play Billing Library 8.0+。

1.添加依赖

在build.gradle中添加

Kotlin 复制代码
dependencies {
    def billing_version = "8.3.0"
    implementation "com.android.billingclient:billing:$billing_version"
}
  1. 初始化BillingClient
Kotlin 复制代码
val billingClient = BillingClient.newBuilder(context)
    .setListener { billingResult, purchases -> 
        // 支付结果回调
    }
    .enablePendingPurchases()
    .build()

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
            // 连接成功,可以查询商品
        }
    }
    override fun onBillingServiceDisconnected() {
        // 尝试重连
    }
})
  1. 查询订阅详情 (Query Product Details)

注意:订阅必须指定 ProductType.SUBS

Kotlin 复制代码
val productList = listOf(
    QueryProductDetailsParams.Product.newBuilder()
        .setProductId("your_subscription_id")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
)
val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build()

billingClient.queryProductDetailsAsync(params) { billingResult, productDetailsList ->
    val responseCode = billingResult.responseCode
    val debugMessage = billingResult.debugMessage
    when (responseCode) {
        BillingClient.BillingResponseCode.OK -> {
                val list = result.productDetailsList
                if (list.isEmpty()) {
                    LogUtils.e(
                    TAG,
                    "Query OK but list is EMPTY. Check if 'gallery_star' is ACTIVE and has an ACTIVE Base Plan." 
                         )
                 } else {            
                     mProductDetails = list[0]            
                     _productDetailsList.value = list            
                     LogUtils.d(TAG, "Successfully queried ${list.size} products. ID: ${mProductDetails?.productId}")        
                 }    
        }    
        
        BillingClient.BillingResponseCode.DEVELOPER_ERROR -> {
                // Code 12 核心报错            
        }    
        else -> {        
            LogUtils.e(TAG, "Query failed with code $responseCode: $debugMessage")
        }
}
  1. 发起购买流程
Kotlin 复制代码
val productDetails = productDetailsList[0]
val offerToken = productDetails.subscriptionOfferDetails?.get(0)?.offerToken ?: ""

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setOfferToken(offerToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

billingClient.launchBillingFlow(activity, billingFlowParams)

五、常见错误排查

错误码 含义 解决方案
Code 3 (BILLING_UNAVAILABLE) 支付不可用 检查是否登录了 Google 账号;梯子是否全局开启;内测邀请是否已点击"接受"。
Code 12 (INTERNAL_ERROR) 内部错误 通常是 Google Play 商店缓存问题。清理商店数据、重启手机、更换纯净 IP 节点。
Code 4 (ITEM_UNAVAILABLE) 商品未找到 检查 Product ID 拼写;确保基础方案已"激活"且勾选了"向后兼容"。

注意:

  1. 网络环境测试时,请确保你的加速器是全局模式,且节点地区与你的测试账号注册地一致。

  2. play store地区一定不能是中国区

相关推荐
2501_915918412 小时前
基于Mach-O文件的动态库与静态库归属方案及API扫描实践
android·ios·小程序·https·uni-app·iphone·webview
2501_915106322 小时前
iOS 证书无法跨电脑使用?签名迁移方法一文讲透
android·ios·小程序·https·uni-app·iphone·webview
Kapaseker2 小时前
Window 内外藏机巧 旧岗新页见真章
android·kotlin
谪星·阿凯2 小时前
从XXE遗留疑问到Upload-Labs全通关:文件上传漏洞的溯源与实战突破
android·计算机网络
星轨初途2 小时前
C++ 类和对象(下):初始化列表、static 成员与编译器优化深度剖析
android·开发语言·c++·经验分享·笔记
恋猫de小郭2 小时前
Flutter 的 build_runner 已经今非昔比,看看 build_runner 2.13 有什么特别?
android·前端·flutter
xiangpanf13 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx16 小时前
安卓线程相关
android
消失的旧时光-194316 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json