Google Play Billing Library 5支付流程报SERVICE_DISCONNECTED求助
解决方案:Billing Library 5启动支付流触发SERVICE_DISCONNECTED问题
针对你在Eclipse老项目中升级Billing Library 5遇到的问题,尝试以下排查和修复步骤:
1. 规范BillingClient与Activity的生命周期绑定
- 确保BillingClient实例在Activity的
onCreate中初始化,onDestroy中调用endConnection()销毁,避免重复创建实例或实例生命周期与Activity不匹配。 - 检查Activity的启动模式,避免使用
singleInstance、singleTask这类会隔离Activity栈的模式,这类模式可能导致支付界面无法正确绑定,触发服务断开。 - 确保
launchBillingFlow在Activity处于onResume状态后调用,避免在onCreate或onStart等未完全就绪的状态发起支付。
2. 验证BillingFlowParams构建的正确性
- 确认构建参数时,
ProductDetails对象与Google Play Console中配置的商品ID、类型完全一致,尤其是订阅商品必须指定有效的offerToken(可从ProductDetails.getSubscriptionOfferDetails()中获取)。示例代码:// 构建订阅商品的支付参数 SubscriptionOfferDetails offerDetails = productDetails.getSubscriptionOfferDetails().get(0); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(Arrays.asList( ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerDetails.getOfferToken()) .build() )) .build(); - 避免传入空值或无效的
ProductDetails,即使queryProductDetailsAsync成功,也要在发起支付前再次校验对象的有效性。
3. 解决Eclipse环境的兼容性问题
- 确认项目的
minSdkVersion>= 21(Billing Library 5的最低要求),targetSdkVersion>= 30,过低的SDK版本会导致库功能异常。 - 清理项目
libs目录中所有旧版Billing相关的jar/aar文件,只保留Billing Library 5.0.0的依赖,避免多版本冲突导致类加载异常。 - 检查项目是否引入了与Billing Library冲突的第三方支付相关库,如有则移除或替换为兼容版本。
4. 优化重连逻辑
- 收到
SERVICE_DISCONNECTED响应时,不要立即重试支付,先调用billingClient.endConnection()销毁现有连接,再重新初始化并启动连接,待onBillingSetupFinished返回OK后再发起支付。示例逻辑:@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) { // 先结束现有连接 if (billingClient != null && billingClient.isReady()) { billingClient.endConnection(); } // 重新初始化并连接 billingClient = BillingClient.newBuilder(this) .enablePendingPurchases() .setListener(this) .build(); billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult result) { if (result.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 连接成功后重试支付 launchBillingFlow(YourActivity.this, billingFlowParams); } } @Override public void onBillingServiceDisconnected() { // 可在此设置延迟重连,避免频繁重试 } }); } }
5. 检查设备环境
- 确保测试设备的Google Play服务版本 >= 20.0.0,过低的版本会导致与Billing Library 5不兼容,可在设备的Google Play商店中更新Google Play服务。
- 使用已登录有效Google账号的设备测试,避免匿名账号或未验证的账号导致权限问题。
6. 开启详细日志排查
- 初始化BillingClient时开启DEBUG日志,查看logcat中更详细的错误信息:
BillingClient billingClient = BillingClient.newBuilder(context) .enablePendingPurchases() .setListener(this) .setLogLevel(BillingClient.LogLevel.DEBUG) .build(); - 重点关注
launchBillingFlow前后的日志,寻找是否有隐藏的权限错误、Activity栈异常等信息。
内容的提问来源于stack exchange,提问作者Martin Tomas
相关产品推荐
相关产品推荐

