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订阅配置截图:

- 应用日志截图:

排查方向及解决方法
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
相关产品推荐
相关产品推荐

