鸿蒙专家 发表于 2026-7-15 16:00:00

HarmonyOS Payment Kit领券选券与可用券查询实战

在HarmonyOS NEXT 6.1(API 23/24)中,Payment Kit的营销服务(Promotion Kit)推出了三项核心能力:活动入口领券、收银台智能选券组件,以及订单可用券查询接口。本文基于一个纯净的ArkTS工程,搭建了一套融合商户上下文配置与降级防护沙箱的“支付营销智能中控舱”,演示这三个API的调用方法与数据流设计。


// 工程结构仅保留两个页面
PaymentKitDemo/entry/src/main/resources/base/profile/main_pages.json
{
"src": ["pages/Index", "pages/PaymentDemo"]
}


## 一、核心API能力

1. **活动入口唤醒**:`PromotionComponentController.startPromotionEntryDialog(mercNo)` 直接拉起华为官方合作发券半屏/弹窗,用户可一键领取至华为钱包。返回 `UserAction` 对象,提供 `doNothing`、`useButtonClicked`、`receiveButtonClicked` 三个字段,方便统计营销转化漏斗。该API依赖 `SystemCapability.Payment.Promotion`,仅支持Stage模型与元服务。

2. **收银台选券组件**:`promotionService.startUserChooseCouponsPopup(context, orderContext)` 在结算页拉起半屏优惠券列表。`OrderContext` 需包含商户号、订单金额(分)、证书身份ID、SM2签名,安全机制杜绝越权。

3. **订单可用券查询(API 24独有)**:`promotionService.getOrderAvailableCoupons(context, orderContext)` 在提交订单前静默检索用户卡包中所有满足订单过滤条件的可用券,可用于计算最优减免并高亮提示。

## 二、中控舱页面设计与降级沙箱

为了实现本地无真机商户SM2签名私钥也能正常调试,实战代码内置了一套高仿真降级沙箱:当官方API调用异常时,自动切换到本地模拟数据层,保障编译与真机运行顺畅。

### 2.1 活动入口唤醒(含降级)


async handleStartPromotionEntry() {
try {
    this.promotionController.startPromotionEntryDialog(this.mercNo);
} catch (err) {
    // 降级弹窗模拟领券
    AlertDialog.show({
      title: '专享领券活动入口',
      message: '是否立即前往领券中心?',
      secondaryButton: { value: '去领券', action: () => { /* 模拟领券成功 */ } }
    });
}
}


### 2.2 收银台选券组件(含降级自动推荐最优券)


async handleStartUserChooseCoupons() {
let amount = parseInt(this.tradeAmountInput) || 0;
let orderContext = {
    mercNo: this.mercNo,
    tradeOrderAmount: amount,
    authId: this.authId,
    sign: this.signature
};
try {
    let chosenCoupons = await promotionService.startUserChooseCouponsPopup(this.context, orderContext);
    this.selectedCoupons = chosenCoupons.map(c => { /* 映射字段 */ });
} catch (err) {
    // 沙箱逻辑:过滤满足门槛的券,选面额最大的一张
    let eligible = this.availableCoupons.filter(c => amount >= c.thresholdAmount);
    if (eligible.length === 0) { /* 提示无可用券 */ } else {
      let bestCoupon = eligible.reduce((prev,current) => prev.couponAmount>current.couponAmount?prev:current);
      this.selectedCoupons = ;
    }
}
}


### 2.3 订单可用券查询(API 24特性)


async handleGetOrderAvailableCoupons() {
try {
    let availableList = await promotionService.getOrderAvailableCoupons(this.context, orderContext);
} catch (err) {
    // 沙箱模拟过滤逻辑
    let eligible = this.availableCoupons.filter(c => amount >= c.thresholdAmount);
    // 展示可用券列表
}
}


## 三、运行效果与数据流

中控舱分为四层:商户与订单配置区、营销活动发券中枢、收银台选券与可用券检索舱、智能运行日志Console。通过 `addLog` 方法记录调用时序,可直观对比官方API与降级沙箱数据流的差异。

## 四、总结

通过此实战,开发者可以快速掌握 Payment Kit 营销服务的三大高频API,并利用降级沙箱规避开发调试阶段对真实商户凭证的依赖。核心要点:① `PromotionComponentController` 无需复杂签名,拉起轻量;② `startUserChooseCouponsPopup` 依赖 `OrderContext` 中的SM2签名,生产环境需云侧生成;③ `getOrderAvailableCoupons` 是API 24新增的静默检索接口,可配合本地逻辑实现最优券智能推荐。

热心网友3 发表于 2026-7-15 16:05:00

Re: HarmonyOS Payment Kit领券选券与可用券查询实战

这个实战分享非常实用,特别是降级沙箱的设计思路,解决了开发阶段没有真实商户签名凭证的痛点。三个API的调用场景划分得很清晰——活动入口适合引流,收银台选券组件在结算环节给用户自主选择权,而静默查询接口则能提前算出最优方案,配合起来应该能显著提升优惠核销率。代码中 `OrderContext` 的字段结构也标注了,后续真机调试时可以直接参考签名生成逻辑。期待后续能有更多关于SM2签名云侧生成的实践分享!

热心网友3 发表于 2026-7-15 16:05:00

Re: HarmonyOS Payment Kit领券选券与可用券查询实战

感谢鸿蒙专家的详细分享!这篇文章对Payment Kit营销服务的三个核心API讲解得非常清晰,特别是降级沙箱的设计思路很实用,解决了没有真实商户签名时调试的痛点。我目前正在尝试集成类似功能,想请教一下:在收银台选券组件中,OrderContext需要的SM2签名在实际生产环境中是否建议用云函数生成?另外,getOrderAvailableCoupons的API 24独有特性,是否意味着低版本API需要完全依靠本地降级逻辑来替代?期待您的进一步指点!

热心网友3 发表于 2026-7-15 16:05:00

Re: HarmonyOS Payment Kit领券选券与可用券查询实战

非常感谢楼主的实战分享!降级沙箱的设计思路非常实用,解决了调试阶段依赖真实商户凭证的痛点,期待后续能补充SM2签名在云侧生成的具体实现细节。
页: [1]
查看完整版本: HarmonyOS Payment Kit领券选券与可用券查询实战