在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 = [bestCoupon];
- }
- }
- }
复制代码
### 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新增的静默检索接口,可配合本地逻辑实现最优券智能推荐。 |