You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Capacitor+Vue3应用中cordova-plugin-purchase v13无法加载Google Play订阅基础套餐,无BillingClient日志问题排查求助

Capacitor+Vue3应用中cordova-plugin-purchase v13无法加载Google Play订阅基础套餐,无BillingClient日志问题排查求助

这种看不到BillingClient日志的黑盒问题真的让人头大,我之前做Hybrid应用支付的时候也踩过类似的坑,咱们一步步拆解排查:

第一步:补全错误捕获,揪出静默失败的元凶

你现在的代码完全没做错误处理,很可能store.initialize()或者store.update()已经抛出了错误,但被静默忽略了,导致产品根本没加载。先把代码改成带完整错误捕获的版本:

// 初始化逻辑(必须在原生deviceready触发后执行)
import { App } from '@capacitor/app';

App.addListener('deviceready', async () => {
  try {
    console.log('[Store] 开始初始化插件');
    await store.initialize([
      {
        id: 'stable_manager.test.sub',
        type: Cdv.ProductType.PAID_SUBSCRIPTION,
        platform: Cdv.Platform.GOOGLE_PLAY,
      },
    ]);
    console.log('[Store] 插件初始化成功');

    console.log('[Store] 开始拉取产品信息');
    // 明确指定要拉取的产品ID,避免全量更新的坑
    await store.update(['stable_manager.test.sub']);
    console.log('[Store] 产品信息拉取完成');

    const product = store.get?.('stable_manager.test.sub');
    console.log('[Store] 获取到的产品:', product);
  } catch (err) {
    // 一定要打印完整错误信息,别只打err
    console.error('[Store] 初始化/更新失败:', JSON.stringify(err));
  }
});

// 购买按钮点击逻辑
async function handlePurchaseClick() {
  try {
    console.log('[Purchase] 开始发起购买请求');
    const payment = new Cdv.Payment();
    payment.platform = Cdv.Platform.GOOGLE_PLAY;
    payment.productId = 'stable_manager.test.sub';
    // 先从Google Play控制台复制测试用的offerToken硬编码进来
    // (控制台-订阅详情-基础套餐-测试用offerToken)
    payment.offerToken = '你的测试基础套餐offerToken';
    const result = await store.order(payment);
    console.log('[Purchase] 购买流程已启动:', result);
  } catch (err) {
    console.error('[Purchase] 购买失败:', JSON.stringify(err));
  }
}

第二步:排查插件与Capacitor的兼容性冲突

cordova-plugin-purchase v13和Capacitor 5的生命周期适配可能有坑:

  • 绝对不要在Vue的onMounted里初始化插件!Web端的生命周期和原生端不同步,必须等Capacitor的deviceready事件触发后再执行(上面的代码已经做了)。
  • 重新同步插件依赖:执行npx cap sync android,确保Android项目里正确引入了cordova-plugin-purchase的原生代码,没有缺失依赖。
  • 检查Capacitor的Android项目build.gradle,确认有com.android.billingclient:billing的依赖(插件应该自动引入,但可以手动核对版本是否≥5.2.0,适配Android 13+)。

第三步:深挖Google Play测试环境的细节配置

很多问题其实出在Google Play的测试规则上:

  1. 测试账号必须双身份:你的测试账号必须同时加入「内部测试人员列表」和「许可测试人员列表」,缺一不可!而且要确保账号没有登录其他Google Play开发者账号,避免身份冲突。
  2. 产品ID与签名完全匹配
    • 核对代码里的stable_manager.test.sub和Google Play控制台的订阅ID完全一致(大小写、下划线、后缀都不能错)。
    • 确认Capacitor打包用的签名文件,和Google Play控制台「应用签名」页面的签名完全匹配(如果用Google Play应用签名,要确保上传的签名和控制台一致)。
  3. 基础套餐状态验证:进入Google Play控制台的订阅详情,确认基础套餐是「已激活」状态,不是「草稿」或「已停用」,并且测试设备所在地区在173个可用地区内。
  4. 强制刷新Google Play缓存
    • 测试设备退出Google Play账号,重新登录。
    • 清除Google Play Store和Google Play服务的所有数据(不是只清缓存),然后重启设备。

第四步:修正插件API的使用方式

cordova-plugin-purchase v13的API变动很大,你可能用错了枚举参数:

  • 把枚举值换成字符串试试,避免枚举常量不匹配的问题:
    await store.initialize([
      {
        id: 'stable_manager.test.sub',
        type: 'subs', // 代替Cdv.ProductType.PAID_SUBSCRIPTION
        platform: 'android', // 代替Cdv.Platform.GOOGLE_PLAY
      },
    ]);
    
  • 验证store实例有效性:初始化后打印console.log('Store实例:', store),确认它不是undefined,且有getupdateorder这些方法。

第五步:原生层日志排查(关键突破点)

既然看不到BillingClient日志,直接从Android原生层入手:

  1. 调整logcat过滤规则
    • 把logcat的日志级别调到Verbose(默认是Info,会漏掉很多调试日志)。
    • 过滤标签包含BillingClientBillingClientImplCdvPurchase(插件的原生日志标签)。
    • 同时过滤你的应用包名:package:com.stablemanager.app
  2. 手动加原生日志:如果有Android开发环境,打开Capacitor的Android项目,找到cordova-plugin-purchase的原生代码(src/android目录下),在CdvPurchase.javainitialize方法里加一行日志:
    Log.d("CdvPurchase", "正在初始化BillingClient,产品ID:stable_manager.test.sub");
    
    重新打包测试,看是否能输出这条日志,确认插件真的在尝试初始化BillingClient。

最后一招:换插件版本试试

如果以上都没用,可能是v13的API变动引入了未修复的适配bug:

  • 降级到cordova-plugin-purchase v12.x(v12的API更稳定,和Capacitor 5的适配更好)。
  • 或者升级到最新的v13.x版本(比如v13.13.0),看官方是否修复了Capacitor相关的问题。

按这个步骤排查,尤其是错误捕获和原生日志这两步,大概率能找到静默失败的原因。我当时就是靠加原生日志发现插件的BillingClient初始化被Capacitor的生命周期拦截了,调整初始化时机就解决了。

火山引擎 最新活动