查看: 121|回复: 3

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

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在HarmonyOS NEXT 6.1(API 23/24)中,Payment Kit的营销服务(Promotion Kit)推出了三项核心能力:活动入口领券、收银台智能选券组件,以及订单可用券查询接口。本文基于一个纯净的ArkTS工程,搭建了一套融合商户上下文配置与降级防护沙箱的“支付营销智能中控舱”,演示这三个API的调用方法与数据流设计。
  1. // 工程结构仅保留两个页面
  2. PaymentKitDemo/entry/src/main/resources/base/profile/main_pages.json
  3. {
  4.   "src": ["pages/Index", "pages/PaymentDemo"]
  5. }
复制代码

## 一、核心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 活动入口唤醒(含降级)
  1. async handleStartPromotionEntry() {
  2.   try {
  3.     this.promotionController.startPromotionEntryDialog(this.mercNo);
  4.   } catch (err) {
  5.     // 降级弹窗模拟领券
  6.     AlertDialog.show({
  7.       title: '专享领券活动入口',
  8.       message: '是否立即前往领券中心?',
  9.       secondaryButton: { value: '去领券', action: () => { /* 模拟领券成功 */ } }
  10.     });
  11.   }
  12. }
复制代码

### 2.2 收银台选券组件(含降级自动推荐最优券)
  1. async handleStartUserChooseCoupons() {
  2.   let amount = parseInt(this.tradeAmountInput) || 0;
  3.   let orderContext = {
  4.     mercNo: this.mercNo,
  5.     tradeOrderAmount: amount,
  6.     authId: this.authId,
  7.     sign: this.signature
  8.   };
  9.   try {
  10.     let chosenCoupons = await promotionService.startUserChooseCouponsPopup(this.context, orderContext);
  11.     this.selectedCoupons = chosenCoupons.map(c => { /* 映射字段 */ });
  12.   } catch (err) {
  13.     // 沙箱逻辑:过滤满足门槛的券,选面额最大的一张
  14.     let eligible = this.availableCoupons.filter(c => amount >= c.thresholdAmount);
  15.     if (eligible.length === 0) { /* 提示无可用券 */ } else {
  16.       let bestCoupon = eligible.reduce((prev,current) => prev.couponAmount>current.couponAmount?prev:current);
  17.       this.selectedCoupons = [bestCoupon];
  18.     }
  19.   }
  20. }
复制代码

### 2.3 订单可用券查询(API 24特性)
  1. async handleGetOrderAvailableCoupons() {
  2.   try {
  3.     let availableList = await promotionService.getOrderAvailableCoupons(this.context, orderContext);
  4.   } catch (err) {
  5.     // 沙箱模拟过滤逻辑
  6.     let eligible = this.availableCoupons.filter(c => amount >= c.thresholdAmount);
  7.     // 展示可用券列表
  8.   }
  9. }
复制代码

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

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

## 四、总结

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

非常感谢楼主的实战分享!降级沙箱的设计思路非常实用,解决了调试阶段依赖真实商户凭证的痛点,期待后续能补充SM2签名在云侧生成的具体实现细节。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-15 18:02 , Processed in 0.033035 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部