Android Google Play Billing 4.0调用querySkuDetailsAsync返回空列表排查
谷歌支付库迁移问题排查指南
License Key配置说明
com.android.billingclient 4.0.0版本不需要在客户端代码中显式配置旧版要求的license key,该参数仅用于服务端对购买收据做验签使用,客户端无需声明,因此该配置不是你查询SKU返回空的诱因。
querySkuDetailsAsync返回空结果排查方案
- 确认BillingClient初始化完成后再调用查询接口:必须在
BillingClientStateListener的onBillingSetupFinished回调返回响应码为0(BILLING_RESPONSE_RESULT_OK)之后,再执行SKU查询操作,未完成初始化就调用接口会直接返回空列表。 - 检查SKU类型匹配是否正确:如果查询的是订阅类商品,
setType参数需要传入SkuType.SUBS,仅一次性购买商品(消耗/非消耗)可传入SkuType.INAPP,类型不匹配会返回空结果。 - 核对应用配置与测试环境:
测试设备的Google Play商店版本需≥18.0.0,且登录的谷歌账号已被加入Google Play后台的应用内部测试/封闭测试白名单
当前安装的应用包名、签名信息(需使用release签名,和Google Play后台上传的测试/正式包签名完全一致),签名不匹配会导致所有支付接口调用异常 - 确认Google Play后台商品状态:需要查询的SKU对应的商品必须设置为「激活」状态,未激活的商品无法被查询到。
- 增加错误码日志定位具体问题:在
onSkuDetailsResponse回调中优先打印返回的响应码和调试信息,可直接定位根因,示例代码如下:
@Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) { // 先打印错误信息排查问题 Log.i("BillingDebug", "响应码:" + billingResult.getResponseCode() + " 错误信息:" + billingResult.getDebugMessage()); if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) { // 正常业务逻辑 } }
常见响应码说明:3表示当前设备不支持对应版本的Billing API,7表示用户已经持有该商品,8表示用户账号未绑定支付方式。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

