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的测试规则上:
- 测试账号必须双身份:你的测试账号必须同时加入「内部测试人员列表」和「许可测试人员列表」,缺一不可!而且要确保账号没有登录其他Google Play开发者账号,避免身份冲突。
- 产品ID与签名完全匹配:
- 核对代码里的
stable_manager.test.sub和Google Play控制台的订阅ID完全一致(大小写、下划线、后缀都不能错)。 - 确认Capacitor打包用的签名文件,和Google Play控制台「应用签名」页面的签名完全匹配(如果用Google Play应用签名,要确保上传的签名和控制台一致)。
- 核对代码里的
- 基础套餐状态验证:进入Google Play控制台的订阅详情,确认基础套餐是「已激活」状态,不是「草稿」或「已停用」,并且测试设备所在地区在173个可用地区内。
- 强制刷新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,且有get、update、order这些方法。
第五步:原生层日志排查(关键突破点)
既然看不到BillingClient日志,直接从Android原生层入手:
- 调整logcat过滤规则:
- 把logcat的日志级别调到
Verbose(默认是Info,会漏掉很多调试日志)。 - 过滤标签包含
BillingClient、BillingClientImpl、CdvPurchase(插件的原生日志标签)。 - 同时过滤你的应用包名:
package:com.stablemanager.app。
- 把logcat的日志级别调到
- 手动加原生日志:如果有Android开发环境,打开Capacitor的Android项目,找到
cordova-plugin-purchase的原生代码(src/android目录下),在CdvPurchase.java的initialize方法里加一行日志:
重新打包测试,看是否能输出这条日志,确认插件真的在尝试初始化BillingClient。Log.d("CdvPurchase", "正在初始化BillingClient,产品ID:stable_manager.test.sub");
最后一招:换插件版本试试
如果以上都没用,可能是v13的API变动引入了未修复的适配bug:
- 降级到cordova-plugin-purchase v12.x(v12的API更稳定,和Capacitor 5的适配更好)。
- 或者升级到最新的v13.x版本(比如v13.13.0),看官方是否修复了Capacitor相关的问题。
按这个步骤排查,尤其是错误捕获和原生日志这两步,大概率能找到静默失败的原因。我当时就是靠加原生日志发现插件的BillingClient初始化被Capacitor的生命周期拦截了,调整初始化时机就解决了。




