更新记录
1.0.0(2026-02-04)
- 初版发布
- 支持 Android Google Play Billing(PBL 8.x):初始化、查询商品、发起购买、消耗、确认、查询已购
- 内置本地 AAR 依赖,兼容云打包场景
平台兼容性
uni-app(4.52)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | 5.0 | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.52)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | 5.0 | - | - | - |
jwh-GooglePay
Google Play Billing(Google 内购/订阅)UTS 插件,面向 uni-app x。
特性
- 基于 Google Play Billing Library(PBL)8.x
- 支持 内购(inapp) / 订阅(subs)
- 内置本地 AAR 依赖,避免云打包拉取 Maven 失败
- 支持完整流程:初始化、查询商品、发起购买、消耗、确认、查询已购
- 失败回调返回统一错误码与中文说明
支持平台
- Android(uni-app x)
- iOS / Harmony:暂不支持
前置条件
- Android
minSdkVersion >= 21 - 设备需具备并可用:Google Play 商店、Google Play 服务(GMS)
- 开发/测试建议使用:
- 真机:已认证且带完整 GMS 的设备
- 模拟器:Android Studio AVD 的 “Google Play” 系统镜像
权限说明
插件默认声明:
android.permission.INTERNETcom.android.vending.BILLING
目录结构
utssdk/app-android/libs/billing8.aar: Google Play Billing AAR(已内置)utssdk/interface.uts: 接口定义utssdk/unierror.uts: 错误码定义utssdk/app-android/index.uts: Android 原生实现
安装与使用
1. 安装插件
将插件安装到 uni_modules/jwh-GooglePay 后即可使用。
2. Play Console 配置(非常重要)
Google 内购/订阅必须在 Play Console 配置完成并满足测试条件,否则会出现商品不可用、计费服务不可用、无法拉起收银台等问题。
建议检查:
- 已创建应用并完成基础信息
- 已创建并激活商品(inapp/subs),商品 ID 与代码一致
- 应用已上传到测试轨道(内部测试/封闭测试等)
- 测试账号已加入测试人员列表,并在设备 Play 商店登录该账号
- 设备区域/商品销售区域匹配
3. 基本流程
推荐顺序:
1) initBilling
2) queryProducts(缓存 ProductDetails)
3) launchPurchase
4) 成功后:
- inapp:
consumePurchase(消耗型道具)或按业务处理 - subs:
acknowledgePurchase(确认订阅) 5) 可选:queryPurchases恢复/查询已购
1. 初始化
import { initBilling } from '@/uni_modules/jwh-GooglePay';
initBilling({
success: () => {
console.log("初始化成功");
},
fail: (err) => {
console.error("初始化失败", err);
}
});
2. 查询商品
import { queryProducts } from '@/uni_modules/jwh-GooglePay';
queryProducts({
productIds: ['your_product_id'],
productType: 'inapp', // 或 'subs'
success: (products) => {
console.log("商品详情", products);
}
});
3. 发起购买
import { launchPurchase } from '@/uni_modules/jwh-GooglePay';
launchPurchase({
productId: 'your_product_id',
productType: 'inapp',
success: (res) => {
console.log("购买成功", res);
// 接下来需要消耗或确认
}
});
4. 消耗/确认购买
注意:购买完成后需要按产品类型执行 消耗(consume) 或 确认(acknowledge)。建议在服务端校验购买凭证后再发放权益。
import { consumePurchase, acknowledgePurchase } from '@/uni_modules/jwh-GooglePay';
// 内购项目 (消耗)
consumePurchase({
purchaseToken: '...',
success: (token) => console.log("消耗成功")
});
// 订阅项目 (确认)
acknowledgePurchase({
purchaseToken: '...',
success: (token) => console.log("确认成功")
});
API 说明
initBilling(options)
- 作用:初始化并连接 BillingClient
- 常见失败:设备无 GMS、Play 服务不可用、网络不可达等
queryProducts(options)
- 作用:查询商品详情(并缓存 ProductDetails 用于购买流程)
- 参数:
productIds: string[]productType: "inapp" | "subs"
- 返回:
ProductDetails[](包含_raw字段)
launchPurchase(options)
- 作用:发起购买
- 注意:
- 必须先
queryProducts,插件会从缓存里取ProductDetails - 订阅(subs)需要传
offerToken
- 必须先
consumePurchase(options)
- 作用:消耗购买(通常用于消耗型道具)
acknowledgePurchase(options)
- 作用:确认购买(订阅/不可消耗产品通常需要确认)
queryPurchases(options)
- 作用:查询当前账号下已购买项目(恢复购买/校对权益)
错误码与失败原因(中文)
插件的失败回调统一返回 UniError(包含 errCode / errMsg)。其中:
errCode:尽量与 Google Play Billing 的BillingResponseCode保持一致;另外提供了 9 开头的自定义错误码。errMsg:默认会从utssdk/unierror.uts中的BillingErrors映射取中文;如果 Google 返回了debugMessage,会尽量翻译为中文并拼接说明(少量情况仍可能保留英文原文)。
常见 errCode 对照
| errCode | 中文含义 | 常见触发场景 | 处理建议 |
|---|---|---|---|
| -3 | 服务超时 | 与 Play Billing 服务通信超时 | 检查网络、重试、确保 Play 商店可用 |
| -2 | 功能不支持 | 当前设备/版本不支持对应能力 | 升级 Play 商店/系统,或降级能力使用 |
| -1 | 服务连接已断开 | Billing 服务断开 | 重新 initBilling 连接 |
| 1 | 用户取消支付 | 用户在收银台主动取消 | 视为正常流程,提示用户即可 |
| 2 | 服务不可用 | Play 服务临时不可用 | 检查网络/区域/Play 商店状态,稍后重试 |
| 3 | 计费服务不可用 | 设备不支持计费/缺少 Play 商店 | 确保安装官方 Play 商店并登录可用账号 |
| 4 | 商品不可用 | 商品在当前账号/区域不可售 | 检查 Play Console 配置、上架状态、测试账号、区域 |
| 5 | 开发者错误 | 参数/签名/配置错误 | 检查商品 ID、签名、调用时机与参数 |
| 6 | 未知错误 | Google 返回通用错误 | 结合 errMsg(debugMessage)进一步定位 |
| 7 | 商品已购买/已拥有 | 重复购买了不可重复商品 | 内购非消耗品/订阅已在有效期,走“恢复/查询已购” |
| 8 | 未拥有该商品 | 尝试消耗/确认未拥有的订单 | 先查询已购,确保 token 正确且未过期 |
| 9000001 | 获取 Context 失败 / 初始化 BillingClient 失败 | initBilling 获取不到 Context |
确认在 App 正常启动后调用,避免过早执行 |
| 9000002 | BillingClient 未初始化或未连接 | 未先 initBilling 或连接已断开 |
先调用 initBilling,必要时重连 |
| 9000003 | 未获取到当前 Activity | 发起购买时无前台 Activity | 确保在前台页面触发购买,不要在后台任务中拉起 |
| 9000004 | 未找到商品详情 | 未先查询商品或缓存丢失 | 先 queryProducts 再 launchPurchase |
订阅 offerToken 如何获取
订阅商品购买通常需要指定 offer。插件的 queryProducts 返回的 ProductDetails 中包含 _raw(原始 Google ProductDetails 对象)。
示例思路:
1) queryProducts 得到 products
2) 取 products[0]._raw.subscriptionOfferDetails
3) 选择一个 offer(例如第一个),并读取其 offerToken
4) 在 launchPurchase 时传入 offerToken
常见问题(排查)
云打包失败 / 找不到 AAR
- 确保
uni_modules/jwh-GooglePay/utssdk/app-android/libs/billing8.aar存在
初始化失败:Billing service unavailable on device
- 设备缺少/禁用 Google Play 商店或 Google Play 服务(GMS)
- 使用 Android Studio AVD 时请选择带 “Google Play” 的系统镜像
- 第三方模拟器(含部分 MuMu 版本)通常不稳定或不可用,建议换真机或 AVD
无法调起支付/收银台
- 检查 Play Console:测试轨道、测试账号、商品状态、区域是否匹配
- 确保设备 Play 商店已登录测试账号,且网络可访问 Google 服务
常见编译失败原因(历史问题说明)
如果你在接入/改造过程中遇到以下编译报错,通常是因为 Billing Library 版本升级导致接口签名变化、或 UTS 对 Android List 的类型差异:
overrides nothing/does not implement abstract member:监听器方法签名不匹配(如ProductDetailsResponseListener在 PBL 8 变为QueryProductDetailsResult参数)。No value passed for parameter 'p0':enablePendingPurchases()在新版本需要PendingPurchasesParams参数。找不到名称 length:AndroidList在 UTS/Kotlin 侧应使用.size而不是.length。
如何更新 Billing AAR
本插件内置 billing8.aar,如果你需要升级到更高版本,可从 Google Maven 下载对应版本的 AAR,并替换 utssdk/app-android/libs/billing8.aar。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 11
赞赏 1
下载 11196500
赞赏 1856
赞赏
京公网安备:11010802035340号