当前位置: 首页 > news >正文

鸿蒙应用服务开发【华为支付服务】客户端

华为支付服务

介绍

本示例展示了使用华为支付服务提供的单次支付,签约代扣。

需要使用华为支付服务接口 @kit.PaymentKit

效果预览

1

Sample工程的配置与使用

在DevEco中配置Sample工程的步骤如下

  1. [创建项目]及[应用]。
  2. 打开Sample应用,使用[AppGallery Connect]应用的包名替换app.json5文件中的bundleName属性值。
  3. 使用[AppGallery Connect]应用的配置更新module.json5文件相关配置,配置client_id及app_id属性值。
  4. 详细可参见指南[开发准备]。

具体实现

单次支付:

  • 商户服务器按照商户模型调用Payment Kit提供的[直连商户预下单]或[服务商/平台类商户预下单]接口获取预下单号(prepayId),然后组建orderStr返回给客户端。
  • 商户客户端调用requestPayment接口调起Payment Kit客户端收银台。
  • 用户在Payment Kit客户端收银台完成支付操作后,Payment Kit客户端会收到支付结果信息。
  • Payment Kit客户端展示支付结果页,用户关闭支付结果页后Payment Kit客户端会返回支付状态给商户客户端。

签约代扣:

  • 商户服务器按照商户模型调用Payment Kit提供的[预签约接口]获取预下单号(preSignNo),然后返回给客户端。
  • 商户客户端构建contractStr参数,调用requestContract接口调起Payment Kit客户端签约收银台。
  • 用户在Payment Kit客户端签约收银台完成签约操作后,Payment Kit客户端会收到签约结果信息。
  • Payment Kit客户端展示签约结果页,用户关闭签约结果页后Payment Kit客户端会返回商户客户端。
  • 签约完成后,Payment Kit服务器会调用回调接口返回签约结果信息给商户服务器。
  • 商户服务器收到签约结果回调响应后,使用SM2验签方式对签约结果进行验签。
  • 签约完成后,商户服务器可以调用Payment Kit提供的[申请免密代扣接口],完成扣款服务。

参考

/** Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.*/
import { paymentService } from '@kit.PaymentKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';@Entry
@Component
struct Index {context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;requestPaymentPromise() {// use your own orderStrconst orderStr = '{"app_id":"***","merc_no":"***","prepay_id":"xxx","timestamp":"1680259863114","noncestr":"1487b8a60ed9f9ecc0ba759fbec23f4f","sign":"****","auth_id":"***"}';paymentService.requestPayment(this.context, orderStr).then(() => {// succeeded in payingconsole.info('succeeded in paying');}).catch((error: BusinessError) => {// failed to payconsole.error(`failed to pay, error.code: ${error.code}, error.message: ${error.message}`);});}requestPaymentCallBack() {// use your own orderStrconst orderStr = '{"app_id":"***","merc_no":"***","prepay_id":"xxx","timestamp":"1680259863114","noncestr":"1487b8a60ed9f9ecc0ba759fbec23f4f","sign":"****","auth_id":"***"}';paymentService.requestPayment(this.context, orderStr, (error: BusinessError) => {if (error) {// failed to payconsole.error(`failed to pay, error.code: ${error.code}, error.message: ${error.message}`);return;}// succeeded in payingconsole.info('succeeded in paying');})}requestContractPromise() {// use your own contractStrconst contractStr = '{"appId":"***","preSignNo":"***"}';paymentService.requestContract(this.context, contractStr).then(() => {// succeed in signingconsole.log('succeeded in signing');}).catch((error: BusinessError) => {// failed to signconsole.error(`failed to sign, error.code: ${error.code}, error.message: ${error.message}`);});}requestContractCallBack() {// use your own contractStrconst contractStr = '{"appId":"***","preSignNo":"***"}';paymentService.requestContract(this.context, contractStr, (error: BusinessError) => {if (error) {// failed to signconsole.error(`failed to sign, error.code: ${error.code}, error.message: ${error.message}`);return;}// succeed in signingconsole.info('succeeded in signing');})}build() {Column() {Button('requestPaymentPromise').type(ButtonType.Capsule).width('50%').margin(20).onClick(() => {this.requestPaymentPromise();})Button('requestPaymentCallBack').type(ButtonType.Capsule).width('50%').margin(20).onClick(() => {this.requestPaymentCallBack();})Button('requestContractPromise').type(ButtonType.Capsule).width('50%').margin(20).onClick(() => {this.requestContractPromise();})Button('requestContractCallBack').type(ButtonType.Capsule).width('50%').margin(20).onClick(() => {this.requestContractCallBack();})}.justifyContent(FlexAlign.Center).width('100%').height('100%')}
}

依赖

  1. AppScope/app.json5下"bundleName"配置需要与您在[AppGallery Connect]中[创建应用]时的包名保持一致。

  2. 您需要更新entry/src/main/module.json5文件中的[module -> metadata]配置项:

    • 其中app_id的“value”的值为开发者的APP ID(在AppGallery Connect网站点击“我的项目”,在项目列表中找到您的项目,在“项目设置 > 常规”页面的“应用”区域获取“APP ID”的值),详见下图的标号1处。
    • 其中client_id的“value”的值为开发者的OAuth 2.0客户端ID(在AppGallery Connect网站点击“我的项目”,在项目列表中找到您的项目,在“项目设置 > 常规”页面的“应用”区域获取“OAuth 2.0客户端ID(凭据):Client ID”的值),详见下图的标号2处。

AppGallery Connect 应用页面

2

配置内容为:

```
{"module": {// ..."metadata": [{"name": "app_id","value": "***"},{"name": "client_id","value": "***"}]}
}
```
  1. Index组件中的orderStr需要替换成自己的订单数据,contractStr需要替换成自己的签约信息数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 剖析算法内部结构----------贪心算法
  • Arduino编译时出现extra tokens at end of #ifndef directive
  • 智能输电线路防外破监测装置:监控线行下施工保持安全距离
  • 一个简单的录音软件(利用QT录音,ffmpeg进行音频重采样,fdk-aac编码)
  • Qt 串口通信(C++)
  • 自动化报表实践小结
  • JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?
  • docker代理
  • Llama 3.1论文中文对照翻译
  • 代码随想录算法训练营Day35 | 01背包问题 | 416. 分割等和子集
  • FFMPEG 序列帧图片合成视频
  • Summer School science communication project--Laptop Selection Suggestion
  • 《学会 SpringMVC 系列 · 参数解析器 ArgumentResolvers》
  • Java学习笔记(二十):反射、动态代理、日志、类加载器、xml、单元测试Junit、注解
  • EasyX自学笔记3(割草游戏1)
  • Docker 笔记(2):Dockerfile
  • java中具有继承关系的类及其对象初始化顺序
  • node学习系列之简单文件上传
  • Python_网络编程
  • SpringBoot 实战 (三) | 配置文件详解
  • swift基础之_对象 实例方法 对象方法。
  • ubuntu 下nginx安装 并支持https协议
  • XForms - 更强大的Form
  • Yeoman_Bower_Grunt
  • 成为一名优秀的Developer的书单
  • 翻译:Hystrix - How To Use
  • 码农张的Bug人生 - 见面之礼
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 数据结构java版之冒泡排序及优化
  • ​马来语翻译中文去哪比较好?
  • # 安徽锐锋科技IDMS系统简介
  • #DBA杂记1
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (003)SlickEdit Unity的补全
  • (2)MFC+openGL单文档框架glFrame
  • (C11) 泛型表达式
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)php投票系统 毕业设计 121500
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三)c52学习之旅-点亮LED灯
  • (三)mysql_MYSQL(三)
  • (十六)串口UART
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****Linux下Mysql的安装和配置
  • .Net 4.0并行库实用性演练
  • .Net Core 笔试1
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET大文件上传知识整理
  • .NET是什么
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • []T 还是 []*T, 这是一个问题
  • []指针