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

Android订阅开发:billingClient.queryProductDetailsAsync返回空产品列表

问题:Google Billing订阅无法获取产品详情,queryProductDetailsAsync返回空列表

我正在Android应用中集成Google Billing订阅功能,已遵循Google Play Billing官方文档操作,且已在Play Console中创建订阅并完成应用相关功能开发。但调用billingClient!!.queryProductDetailsAsync方法始终返回空的productDetailsList,无法获取订阅产品。

实现细节

应用级gradle依赖

implementation "com.android.billingclient:billing-ktx:5.1.0"

订阅核心代码

private var billingClient: BillingClient? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    //Setup billing
    billingSetup()
}

private fun billingSetup() {
    billingClient = BillingClient.newBuilder(this)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases()
        .build()

    //Connect to Google Play
    connectToGooglePlay()
}

private fun connectToGooglePlay() {
    billingClient!!.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(billingResult: BillingResult) {
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                Log.i("payment_flow", "OnBillingSetupFinish connected")
                queryProduct()
            } else {
                Log.i("payment_flow", "OnBillingSetupFinish failed")
            }
        }

        override fun onBillingServiceDisconnected() {
            Log.i("payment_flow", "OnBillingSetupFinish connection lost")

            //Re-connect to Google Play
            connectToGooglePlay()
        }
    })
}

private fun queryProduct() {
    val productList = ImmutableList.of(
        Product.newBuilder()
            .setProductId("monthly_plan")
            .setProductType(BillingClient.ProductType.SUBS)
            .build(),
        Product.newBuilder()
            .setProductId("yearly_plan")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )
    val queryProductDetailsParams = QueryProductDetailsParams.newBuilder()
        .setProductList(productList).build()

    billingClient!!.queryProductDetailsAsync(queryProductDetailsParams) { billingResult: BillingResult, productDetailsList: List<ProductDetails> ->
        Log.d("payment_flow", "onProductDetailsResponse: 1: $billingResult")
        if (productDetailsList.isNotEmpty()) {
            tmpProductDetailsList.addAll(productDetailsList)
            Log.d("payment_flow", "onProductDetailsResponse: " + productDetailsList.size)
        } else {
            Log.i("payment_flow", "onProductDetailsResponse: No products")
        }
    }
}

相关截图

  • Play Console订阅配置截图:Play Console订阅截图
  • 应用日志截图:应用日志截图

排查方向及解决方法

1. 产品ID完全匹配检查

确保代码中monthly_plan、yearly_plan和Play Console中配置的订阅产品ID完全一致,大小写、特殊字符(下划线、短横线等)必须完全对应,任何字符差异都会导致匹配失败。

2. 订阅与应用发布状态验证

  • 确认Play Console中的订阅已设置为活跃状态(非草稿)。
  • 应用需上传至少一个内部测试/封闭测试/开放测试版本到Play Console,且本地测试包的包名、签名需与上传版本一致。未上传测试版本时,Billing服务无法拉取产品信息。

3. 测试账号权限配置

  • 测试设备使用的Google账号必须添加到Play Console的授权测试账号列表(路径:测试 → 对应测试渠道 → 测试账号管理)。普通账号无法获取未正式发布的订阅产品。

4. BillingClient状态与listener检查

  • 检查purchasesUpdatedListener是否正确实现,避免因listener抛出异常导致流程中断。
  • 在queryProduct()开头添加日志,验证billingClient?.isReady是否为true,确保调用查询时BillingClient处于已连接状态。

5. 产品可用性地区设置

检查Play Console中订阅产品的可用性地区,确保测试设备所在地区在允许访问范围内。若产品仅对特定地区开放,测试设备不在该地区会返回空列表。

6. 依赖版本与兼容性

当前使用的billing-ktx:5.1.0为稳定版本,可尝试升级至最新稳定版(如6.0+),排除版本兼容性问题。升级后需同步检查API变更(如Product类构建逻辑是否调整)。

7. 解析BillingResult具体信息

修改日志打印,输出响应码和调试信息,定位更具体的错误原因:

Log.d("payment_flow", "Response code: ${billingResult.responseCode}, Debug message: ${billingResult.debugMessage}")

常见响应码对应问题:ITEM_NOT_FOUND(产品ID不存在)、DEVELOPER_ERROR(配置错误)等。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:30:44