更新记录

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 元

接入准备

  1. 在 AppGallery Connect 中开通应用内支付服务。
  2. 创建商品,并配置商品类型、价格和描述。
  3. 确认应用包名、签名和 AppGallery Connect 中的应用信息一致。
  4. 配置华为沙箱测试账号,并使用真机联调。
  5. 在 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

所有接口均使用 successfailcomplete 回调并返回 void

回调 说明
success 操作成功时调用
fail 参数校验失败、环境不支持或 IAP 调用失败时调用
complete 操作结束时调用,参数为成功结果或错误对象

API

getTTHarmonyIap

获取插件单例。

const harmonyIap = harmonyIapSdk.getTTHarmonyIap()

queryEnvironmentStatus

检查当前设备、华为账号及账号服务地区是否支持 IAP。检查成功时 supportedtrue;不支持或检查失败时进入 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 consumablenon_consumableauto_renewablenon_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)
        }
    })
}

needFinishtrue 时必须确认交付;为 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,不要只根据错误文案判断。

安全、交付与补单

推荐业务流程:

  1. 调用 queryEnvironmentStatus 检查支付环境。
  2. 调用 queryProducts 获取商品和本地化价格。
  3. 调用 createPurchase 拉起支付。
  4. 将完整 purchaseData 和当前业务用户标识上传到服务端。
  5. 服务端验证 JWS 签名,并校验应用、商品、金额、币种、用户和订单状态。
  6. 服务端以 purchaseOrderId 做幂等交付,避免重复发货或重复开通权益。
  7. 业务交付成功后,再调用 finishPurchase
  8. 在应用启动、登录成功和回到前台时调用 queryUnfinishedPurchases 主动补单,并重复服务端校验和幂等交付流程。

插件只解码 orderPayloadsubscriptionStatus,不校验 JWS 签名。这些客户端解析结果不能替代服务端验签。验签失败、商品不匹配、订单已处理或用户关系不正确时,不应交付,也不应调用 finishPurchase

常见问题

为什么购买成功后不能立即 finishPurchase?

购买成功只表示客户端拿到了购买结果,不代表订单已通过服务端验签或业务交付已完成。过早确认会导致订单无法再通过未完成订单查询补回。

queryUnfinishedPurchases 是历史订单查询吗?

不是。它只查询已购买但尚未交付的订单,并自动拉取全部分页。

查询商品或购买失败时先检查什么?

  • AppGallery Connect 是否已开通 IAP,商品是否生效
  • 商品 ID 和商品类型是否与平台配置一致
  • 应用包名和签名是否匹配
  • 真机是否登录可用的华为账号或沙箱账号
  • 当前账号服务地区是否支持 IAP
  • 是否已调用 queryEnvironmentStatus

参考资料

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。