更新记录
1.0.0(2026-07-30)
支持 鸿蒙应用内购
平台兼容性
uni-app(5.08)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | iOS | 鸿蒙 | 鸿蒙插件版本 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | × | × | 20 | 1.0.0 |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.08)
| Chrome | Safari | Android | iOS | 鸿蒙 | 鸿蒙插件版本 | 微信小程序 |
|---|---|---|---|---|---|---|
| × | × | × | × | 20 | 1.0.0 | × |
tt-harmony-iap
基于 HarmonyOS IAP Kit 的应用内支付插件,为 uni-app 和 uni-app x 提供 HarmonyOS 平台的商品查询、购买、权益查询、主动补单和确认交付能力。
首发优惠
插件按累计付费用户数阶梯定价,普通授权和源码授权统一计入累计人数。已购买用户不受后续调价影响,实际成交价以插件市场页面显示为准。
| 累计付费用户 | 普通授权 | 源码授权 |
|---|---|---|
| 前 10 名 | 1.99 元 | 39.90 元 |
| 第 11~30 名 | 3.99 元 | 59.90 元 |
| 31 名以后 | 6.99 元 | 79.90 元 |
接入准备
- 在 AppGallery Connect 中开通应用内支付服务。
- 创建商品,并配置商品类型、价格和描述。
- 确认应用包名、签名和 AppGallery Connect 中的应用信息一致。
- 配置华为沙箱测试账号,并使用真机联调。
- 在 Harmony 工程中集成 IAP Kit。
Harmony 工程配置
当前示例项目提供了项目级配置文件:
harmony-configs/entry/src/main/module.json5
其中包含 IAP 联网所需权限:
{
"name": "ohos.permission.INTERNET"
}
快速开始
插件只支持 HarmonyOS,业务代码应使用条件编译。
// #ifdef APP-HARMONY
import * as harmonyIapSdk from '@/uni_modules/tt-harmony-iap'
let harmonyIap: harmonyIapSdk.TTHarmonyIap | null = null
onReady(() => {
harmonyIap = harmonyIapSdk.getTTHarmonyIap()
})
// #endif
所有接口均使用 success、fail、complete 回调并返回 void:
| 回调 | 说明 |
|---|---|
success |
操作成功时调用 |
fail |
参数校验失败、环境不支持或 IAP 调用失败时调用 |
complete |
操作结束时调用,参数为成功结果或错误对象 |
API
getTTHarmonyIap
获取插件单例。
const harmonyIap = harmonyIapSdk.getTTHarmonyIap()
queryEnvironmentStatus
检查当前设备、华为账号及账号服务地区是否支持 IAP。检查成功时 supported 为 true;不支持或检查失败时进入 fail,不会返回 supported: false。
harmonyIap?.queryEnvironmentStatus({
success: (result) => {
console.log('IAP supported', result.supported)
},
fail: (error) => {
console.log(error.errCode, error.errMsg)
}
})
成功结果 TTHarmonyIapEnvironmentResult:
| 字段 | 类型 | 说明 |
|---|---|---|
supported |
boolean | 成功时固定为 true |
rawData |
string | null | 预留字段,当前为 null |
queryProducts
查询 AppGallery Connect 中配置的商品信息。同一次调用中的 productIds 不能为空、不能包含空字符串且不能重复。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
TTHarmonyIapProductType |
是 | consumable、non_consumable、auto_renewable 或 non_renewable |
productIds |
string[] | 是 | 商品 ID 列表 |
harmonyIap?.queryProducts({
type: 'consumable',
productIds: ['coin_001', 'coin_002'],
success: (products) => {
console.log(products)
},
fail: (error) => {
console.log(error.errMsg)
}
})
商品 TTHarmonyIapProduct:
| 字段 | 类型 | 说明 |
|---|---|---|
productId |
string | 商品 ID |
type |
TTHarmonyIapProductType |
商品类型 |
name |
string | 商品名称 |
description |
string | 商品描述 |
price |
string | 带币种符号的本地化价格 |
currency |
string | ISO 4217 货币代码 |
microsPrice |
number | 以微单位表示的价格 |
originalPrice |
string | 带币种符号的本地化原价 |
originalMicrosPrice |
number | 以微单位表示的原价 |
status |
valid | canceled | offline | null |
商品状态 |
subscriptionInfo |
TTHarmonyIapSubscriptionInfo | null |
订阅周期、订阅组和首购优惠 |
promotionalOffers |
TTHarmonyIapPromotionalOffer[] |
促销优惠列表 |
rawData |
string | null | 原始商品数据,主要用于调试 |
createPurchase
创建订单并拉起 HarmonyOS IAP 支付界面。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
TTHarmonyIapProductType |
是 | 四种商品类型之一 |
productId |
string | 是 | 商品 ID,不能为空 |
developerPayload |
string | null | 否 | 开发者透传字段,不能替代服务端订单校验 |
reservedInfo |
string | null | 否 | JSON 格式商户扩展信息 |
promotionalOfferId |
string | null | 否 | 促销优惠 ID |
applicationUserName |
string | null | 否 | 关联业务用户的混淆标识 |
jwsRepresentation |
string | null | 否 | 促销等购买参数的签名 JWS |
quantity |
number | null | 否 | 消耗型和非续期订阅的购买数量,必须是 1-10 的整数 |
harmonyIap?.createPurchase({
type: 'consumable',
productId: 'coin_001',
developerPayload: 'order_123',
success: (purchase) => {
// 将完整 purchase.purchaseData 上传到服务端验签和校验。
console.log(purchase.purchaseOrderId)
},
fail: (error) => {
console.log(error.errMsg)
}
})
购买结果 TTHarmonyIapPurchase:
| 字段 | 类型 | 说明 |
|---|---|---|
productId |
string | null | 客户端成功解析时返回商品 ID |
type |
TTHarmonyIapProductType |
商品类型 |
purchaseToken |
string | null | 客户端成功解析时返回确认交付 token |
purchaseOrderId |
string | null | 客户端成功解析时返回购买订单号 |
finishStatus |
string | null | 1 已交付,2 未交付 |
needFinish |
boolean | null | 是否必须调用 finishPurchase |
purchaseTime |
number | null | 购买时间戳,单位毫秒 |
quantity |
number | null | 购买数量 |
purchaseData |
string | Harmony IAP 返回的完整购买数据,应上传服务端验签 |
subscriptionStatusJws |
string | null | 自动续订商品的原始订阅状态 JWS |
subscriptionStatus |
TTHarmonyIapSubscriptionStatus | null |
客户端解码的订阅状态 |
orderPayload |
TTHarmonyIapPurchaseOrderPayload | null |
客户端解码的订单载荷 |
parseWarnings |
string[] | 客户端解析提示,不影响原始购买数据返回 |
插件始终返回完整 purchaseData。某条 JWS 无法解析时,对应解析字段为 null 并写入 parseWarnings,不会阻断同批次的其他订单。
queryPurchases
查询当前有效权益。只支持非消耗型商品和自动续订商品。插件会自动读取全部分页。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
non_consumable | auto_renewable |
是 | 当前权益商品类型 |
harmonyIap?.queryPurchases({
type: 'non_consumable',
success: (purchases) => {
console.log(purchases)
},
fail: (error) => {
console.log(error.errMsg)
}
})
该接口不是历史订单查询:非消耗型商品返回当前拥有的权益,自动续订商品返回当前有效的订阅。
queryUnfinishedPurchases
查询已购买但尚未完成交付的订单。支持四种商品类型,并自动跟随 continuationToken 读取全部分页。建议在登录成功、应用启动和回到前台时调用,用于主动补单。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
TTHarmonyIapProductType |
是 | 四种商品类型之一 |
harmonyIap?.queryUnfinishedPurchases({
type: 'consumable',
success: (purchases) => {
console.log('unfinished purchases', purchases)
},
fail: (error) => {
console.log(error.errMsg)
}
})
queryPurchaseHistory
使用官方 ALL 查询指定商品类型的历史购买记录,并自动读取全部分页。历史记录用于订单展示和诊断,不能替代 queryUnfinishedPurchases 补单。
harmonyIap?.queryPurchaseHistory({
type: 'consumable',
success: (purchases) => {
console.log(purchases)
}
})
finishPurchase
服务端完成验签、订单校验和业务交付后,确认该笔购买已处理。不要在客户端购买回调中直接调用。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
TTHarmonyIapProductType |
是 | 必须与购买结果中的类型一致 |
purchaseToken |
string | 是 | 使用购买结果中的 token |
purchaseOrderId |
string | 是 | 使用购买结果中的订单号 |
function finishVerifiedPurchase(purchase: harmonyIapSdk.TTHarmonyIapPurchase): void {
if (purchase.purchaseToken == null || purchase.purchaseOrderId == null) {
return
}
harmonyIap?.finishPurchase({
type: purchase.type,
purchaseToken: purchase.purchaseToken,
purchaseOrderId: purchase.purchaseOrderId,
success: () => {
console.log('finish success')
},
fail: (error) => {
console.log(error.errMsg)
}
})
}
needFinish 为 true 时必须确认交付;为 false 时确认交付是可选操作。无论取值如何,都应先完成服务端验签和业务侧幂等交付。
管理与辅助接口
以下接口对外仍使用回调。由于 Harmony IAP Kit 只为这些能力提供 Promise 版本,插件仅在各自内部进行适配。
| 接口 | 说明 |
|---|---|
showManagedSubscriptions |
打开系统订阅管理页面,可传 groupId 和窗口模式 |
isSandboxActivated |
检查当前账号和应用是否处于可用沙箱环境 |
createRefundRequest |
根据 purchaseOrderId 打开退款申请页面 |
showManagedInvoices |
根据 purchaseOrderId 打开发票管理页面 |
harmonyIap?.showManagedSubscriptions({
windowScreenMode: 'fullscreen',
fail: (error) => {
console.log(error.errCode, error.errMsg)
}
})
这些接口受 HarmonyOS 版本和设备能力限制。不支持时会通过 fail 透传官方 801 等错误码,其中发票管理要求 SystemCapability.Payment.IAP.Extension。
自动续订状态
自动续订购买结果可能包含 subscriptionStatus:
| 字段 | 类型 | 说明 |
|---|---|---|
subGroupId |
string | 订阅组 ID |
subGroupGenerationId |
string | 订阅组代 ID |
subscriptionId |
string | 订阅 ID |
purchaseToken |
string | 订阅购买 token |
status |
string | 1 生效中、2 已到期、3 尝试扣费、5 撤销 |
expiresTime |
number | 订阅过期时间戳,单位毫秒 |
renewalInfo |
TTHarmonyIapSubscriptionRenewalInfo | null |
未来扣费计划 |
rawData |
string | 客户端解码后的 JWS 载荷 |
续费计划 renewalInfo:
| 字段 | 类型 | 说明 |
|---|---|---|
productId |
string | 当前生效的商品 ID |
nextRenewPeriodProductId |
string | null | 下一计费周期的商品 ID |
autoRenewStatusCode |
string | 0 关闭自动续订,1 开启自动续订 |
hasInBillingRetryPeriod |
boolean | 是否处于扣费重试期 |
priceIncreaseStatusCode |
string | null | 用户对订阅涨价的确认状态 |
offerTypeCode |
string | null | 当前优惠类型代码 |
offerId |
string | null | 当前优惠 ID |
renewalPrice |
number | null | 下期续费价格,单位为分 |
currency |
string | null | ISO 4217 货币代码 |
renewalTime |
number | null | 续期时间戳,单位毫秒 |
expirationIntent |
string | null | 续期失败原因代码 |
这些字段只是客户端解码结果。订阅是否有效、是否续费以及最终权益期限必须以服务端验签和业务记录为准。
错误处理
失败回调收到 TTHarmonyIapFail:
| 字段 | 类型 | 说明 |
|---|---|---|
errSubject |
string | 固定为 tt-harmony-iap |
errCode |
number | 插件错误码或 Harmony IAP 原生错误码 |
errMsg |
string | 错误说明 |
details |
string | null | 可用的原始错误数据 |
插件错误码:
| 错误码 | 说明 |
|---|---|
1001 |
无法获取 UIAbilityContext |
1002 |
参数为空、重复或格式不正确 |
1003 |
不支持的商品类型 |
1005 |
使用不支持的商品类型查询当前权益 |
1006 |
查询分页超过上限或返回重复分页 token |
1007 |
当前设备不支持发票管理能力 |
其他错误码由 Harmony IAP Kit 返回,例如账号未登录、服务地区不支持、用户取消支付或商品配置错误。业务侧应保留原始 errCode,不要只根据错误文案判断。
安全、交付与补单
推荐业务流程:
- 调用
queryEnvironmentStatus检查支付环境。 - 调用
queryProducts获取商品和本地化价格。 - 调用
createPurchase拉起支付。 - 将完整
purchaseData和当前业务用户标识上传到服务端。 - 服务端验证 JWS 签名,并校验应用、商品、金额、币种、用户和订单状态。
- 服务端以
purchaseOrderId做幂等交付,避免重复发货或重复开通权益。 - 业务交付成功后,再调用
finishPurchase。 - 在应用启动、登录成功和回到前台时调用
queryUnfinishedPurchases主动补单,并重复服务端校验和幂等交付流程。
插件只解码 orderPayload 和 subscriptionStatus,不校验 JWS 签名。这些客户端解析结果不能替代服务端验签。验签失败、商品不匹配、订单已处理或用户关系不正确时,不应交付,也不应调用 finishPurchase。
常见问题
为什么购买成功后不能立即 finishPurchase?
购买成功只表示客户端拿到了购买结果,不代表订单已通过服务端验签或业务交付已完成。过早确认会导致订单无法再通过未完成订单查询补回。
queryUnfinishedPurchases 是历史订单查询吗?
不是。它只查询已购买但尚未交付的订单,并自动拉取全部分页。
查询商品或购买失败时先检查什么?
- AppGallery Connect 是否已开通 IAP,商品是否生效
- 商品 ID 和商品类型是否与平台配置一致
- 应用包名和签名是否匹配
- 真机是否登录可用的华为账号或沙箱账号
- 当前账号服务地区是否支持 IAP
- 是否已调用
queryEnvironmentStatus

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