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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:32:46