Android内购测试时querySkuDetailsAsync返回responseCode=-1问题排查
问题分析与解决方案
从你的日志顺序就能直接定位核心问题:你在BillingClient完成连接建立之前,就调用了querySkuDetailsAsync。日志里先打印了查询响应(返回-1),之后才显示连接完成,这说明查询请求发起时,Google Play Billing服务还未成功连上,自然会返回服务断开的错误码。
核心修复:调整查询时机
你需要把查询商品详情的代码,移到onBillingSetupFinished方法内部,确保只有当连接成功建立后,才发起商品查询。修改后的代码如下:
mBillingClient = BillingClient.newBuilder(getContext()) .setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { Log.d(TAG, "Purchase Updated!"); } }) .build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { Log.d(TAG, "Billing setup complete!"); // 连接成功后,才发起商品查询 List<String> skuList = new ArrayList<>(); skuList.add("plaque001"); SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { Log.d(TAG, "details response received!"); Log.d(TAG, Integer.toString(responseCode)); } }); } } @Override public void onBillingServiceDisconnected() { Log.d(TAG, "DISCONNECTED!"); // 实现自动重试逻辑,避免连接断开后无法恢复 new Handler(Looper.getMainLooper()).postDelayed(() -> { if (!mBillingClient.isReady()) { mBillingClient.startConnection(this); } }, 3000); } });
额外检查点(排查潜在问题)
除了调整查询时机,你还需要确认以下几点:
- 你的测试账号已经被添加到Play Console的内部测试人员列表,并且已经通过邮件链接接受了测试邀请(必须完成这一步,才能访问Alpha版本的内购商品)。
- 确认商品
plaque001的类型是应用内商品(INAPP),和你代码中设置的BillingClient.SkuType.INAPP完全匹配(如果是订阅商品,要改成SkuType.SUBS)。 - 测试设备必须登录授权的测试账号,且安装的是从Play Store下载的Alpha版本(本地调试APK无法测试正式内购流程)。
- 确保应用签名和Play Console中上传的Alpha版本签名一致,签名不匹配会导致内购验证失败。
内容的提问来源于stack exchange,提问作者Noam
相关产品推荐
相关产品推荐

