华为支付

164 阅读9分钟

华为支付

一、概述

二、商户模型

三、支付能力

四、开发准备

4.1. 商户入网与获取商户号

4.2. 开通支付服务

4.3. 商户号绑定AppID(直连商户、平台类商户)

4.4. 准备证书

4.4.1. 商户证书

4.4.2. 华为支付证书

4.5. 端侧应用配置

五、华为支付开发

5.1. 单次支付业务流程

5.2. 单次支付接口说明

5.3. 单次支付开发步骤

5.3.1. 预下单(服务器开发)

5.3.2. 拉起华为支付收银台(端侧开发)

5.3.3. 支付结果回调通知(服务器开发)

六、 拓展

6.1. 申请退款

6.1.1. 退款规则

6.1.2. 接口原型

6.1.3. 请求示例

6.1.4. 业务流程

七、 附录

一、概述

Payment Kit(鸿蒙支付服务)是华为为开发者提供的支付解决方案,支持在商户应用、元服务中快速集成安全、便捷的支付功能。通过拉起华为支付收银台,用户可完成实体商品或服务的购买,商户可同步获取支付结果并完成订单闭环。

二、商户模型

在接入华为支付服务前,请根据您的实际业务模式选择合适的合作身份。华为支付目前提供以下三种接入方式:商户、平台类商户、服务商。

商户(直连商户模式): 直接与华为支付对接,使用华为支付服务的经营主体。

image.png

平台类商户: 面向为商品交易或服务提供线上撮合与管理平台的商户,华为支付为其提供的支付与结算解决方案。

image.png

服务商: 作为华为支付与商户之间的连接桥梁,根据服务内容主要分为两类:技术服务商、收单外包服务机构。

image.png

image.png  

三、支付能力

image.png

四、开发准备

四.1. 商户入网与获取商户号

华为支付当前仅支持商户接入,在开发前需要先完成华为支付商户入网。商户入网后会分配对应的商户号,商户号作为开放API接口请求的必要入参。 image.png

四.2. 开通支付服务

1. 登录AppGallery Connect网站,选择“开发与服务”。

2. 在项目列表中找到项目(如未创建项目可点击添加项目先完成项目创建),在项目下的应用列表中选择需要开通Payment Kit的应用。

3. 在左侧导航栏选择“盈利 > 鸿蒙支付服务 > 支付服务(非虚拟类)> 立即开通”。 image.png

四.3. 商户号绑定AppID(直连商户、平台类商户)

1. 登录华为支付商户平台进入“商户中心 > 产品功能 > AppID管理 > 新增关联AppID”。

2. 申请绑定AppID后,应用管理员登录AppGallery Connect网站选择对应的项目后,在左侧导航栏选择“盈利 > 鸿蒙支付服务 > 支付服务(非虚拟类) > 待关联商户号”选择对应的商户点击“授权”。

四.4. 准备证书

开发者接入华为支付开放API接口,需要通过证书来对请求内容及响应内容做签名和验证签名,以保证请求的安全性和可靠性。需准备证书:商户证书、华为支付证书(公钥)。 image.png

四.4.1. 商户证书

商户证书是包含商户公钥和私钥信息的证书。由商户主动申请并包含商户号、公司名称及公钥信息。此证书必须以pem格式创建,同时支持RSA与SM2两种加密算法。商户需自行生成符合要求的公私密钥对,并将其上传至华为支付商户平台。只有在商户将公钥证书成功提交至华为支付商户平台之后,才能获得一个证书ID,此ID用于HTTP请求头中鉴权信息PayMercAuth对象的authId字段。完成商户入网流程后,可在商户中心的“证书管理”部分,通过“上传商户证书”功能来获取“证书ID”。

四.4.2. 华为支付证书

华为支付证书是华为支付平台提供的凭证,含平台标识与公钥信息,采用 SM2 加密算法。商户需从华为支付商户平台下载,该证书用于校验华为支付给商户业务系统发送的信息,如支付结果信息等。

 

下载华为支付证书:

登录华为支付商户平台后,通过“商户中心 > 证书管理 > 华为支付证书”页签进行华为支付证书下载。

四.5. 端侧应用配置

配置bundleName:


{

  "app": {

     *// bundleName需要与开发者在AppGallery Connect中创建应用时的包名保持一致*

    "bundleName""com.huawei.******.******.demo",

     *// ...*

  }

}

配置应用属性 :

“entry/src/main/module.json5”文件中module的metadata节点下增加client_id和app_id属性配置。

{

    "module": {

         *// ...*

        "metadata": [

            {

                "name""app_id",

                "value""***"

            },

            {

                "name""client_id",

                "value""***"

            }

       ]

    }

}

五、华为支付开发

五.1. 单次支付业务流程

image.png

1. 创建商品订单: 商户客户端向商户服务器发起请求,创建商品订单。

2. 获取预支付ID: 商户服务器调用Payment Kit预下单接口,获取预支付ID(prepayId)。

3. 组建订单字符串: 商户服务端组建订单信息参数orderStr签名后返回给商户客户端。

4. 拉起支付收银台 商户客户端调用requestPayment接口,拉起Payment Kit支付收银台。

5. 完成支付操作: 用户在收银台完成支付,Payment Kit 客户端展示结果。

6. 支付结果回调: 支付完成后,Payment Kit服务器会通过回调接口将支付结果信息发送给商户服务器。

7. 验证支付结果: 商户服务器收到支付结果回调响应后,需使用SM2验签方式对支付结果进行验证。

五.2. 单次支付接口说明

requestPayment(context: common.UIAbilityContext, orderStr: string): Promise

说明: 该方法提供基础支付、支付并签约等功能,调用方法前请确保网络已连接,调用该方法后会拉起Payment Kit收银台,支付完成后使用Promise异步返回。 image.png requestPayment(context: common.UIAbilityContext, orderStr: string, callback: AsyncCallback): void

说明: 该方法提供基础支付、支付并签约等功能,调用该方法前请确保网络已连接,调用该方法后会拉起Payment Kit收银台,支付完成后通过AsyncCallback回调结果。

image.png

五.3. 单次支付开发步骤

五.3.1. 预下单(服务器开发)

获取预支付ID 开发者根据商户的业务模型,通过调用直连商户预下单、平台类商户或服务商的预下单接口,获取预支付ID(prepayId)。

签名请求 为保证支付订单的安全性和可靠性,开发者需要对请求体(body)和请求头(PayMercAuth对象)内的参数进行排序、拼接并进行签名。

构建订单字符串 商户服务器需构建包含必要支付信息(如预支付ID等)的订单字符串(orderStr),并对该字符串进行签名,然后将其返回给客户端。

五.3.2. 拉起华为支付收银台(端侧开发)

调用支付接口 在客户端,开发者调用requestPayment接口来唤起Payment Kit支付收银台,让用户进行支付操作。

处理支付结果 接口调用成功后,会通过then()返回,表明当前订单支付成功。如果请求出现异常,可以通过error.code获取错误码以便进行问题定位和处理。(支付成功,不建议以客户端返回作为用户的支付结果,需以服务器接收到的结果通知或者查询API返回为准。)

import { BusinessError } from '@kit.BasicServicesKit';
import { paymentService } from '@kit.PaymentKit';
import { common } from '@kit.AbilityKit';
 
@Entry
@Component
struct Index {
  context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;

  requestPaymentPromise() {

    const orderStr = '{"app\_id":"***","merc\_no":"***","prepay\_id":"xxx","timestamp":"1680259863114","noncestr":"1487b8a60ed9f9ecc0ba759fbec23f4f","sign":"\*\***","auth\_id":"**\*"}';

    paymentService.requestPayment(this.context, orderStr)

      .then(() => {

        console.info('succeeded in paying');

      })

      .catch((error: BusinessError) => {

        console.error(`failed to pay, error.code: ${error.code}, error.message: ${error.message}`);

      });

  }

 

  build() {

    Column() {

      Button('requestPaymentPromise')

        .type(ButtonType.Capsule)

        .width('50%')

        .margin(20)

        .onClick(() => {

          this.requestPaymentPromise();

        })

      }

    .width('100%')

    .height('100%')

  }

}

五.3.3. 支付结果回调通知(服务器开发)

接收支付信息 支付成功后,Payment Kit服务器会调用开发者提供的回调接口,将支付信息返回给开发者的服务器。

验证支付信息 为确保接收到的支付信息的合法性,商户服务器必须使用SM2算法对返回的支付信息进行验签。

六、拓展

六.1. 申请退款

六.1.1. 退款规则

1. 不支持对同一笔交易单进行并发退款。

2. 订单退款只支持180天内的订单。

3. 申请退款成功不代表退款成功,退款场景是异步处理,需收到退款成功的异步回调通知才表示退款成功。

六.1.2. 接口原型

image.png

六.1.3. 请求示例

POST /api/v1/aggr/transactions/refunds HTTP/1.1  

Content-Type: application/json;charset=UTF-8  

PayMercAuth: {"callerId":"10132120\*\*\*","traceId":"202305151442062977847","time":1684132926969,"authId":"120291744647139\*\*\*","headerSign":"BpOBa8o+gJnKG+vHVI7u********************mVuKDV8iPqNJ+Y8b4XDpSi3FHgjozsWH+uLoTSIg=","bodySign":"lHjrX3dv44zyfu+PO1G+oa9tJi2********************EatA8QTjLPsSPKfM="}  

Accept: application/json  

{  

  "mercOrderNo""czl00120240705",  

  "mercRefundOrderNo""czl0012024070914",  

  "reason""商品质量问题",  

  "callbackUrl""<https://www.xxxxxx.com/hw/pay/refund/callback",  >

  "refundAmount"200,  // 退款2元(单位:分)  

  "payload""refund-20240709"  

}  

六.1.4. 业务流程

1. 用户发起退款 用户提交退款申请(如选择订单、填写原因)。

2. 端侧请求服务端: 客户端将退款信息(原订单号、退款金额等)发送至商户服务端。

3. 服务端调用华为退款接口: 商户服务端验证请求合法性后,调用华为支付退款API发起退款。

4. 华为处理退款: 华为支付异步处理退款,完成后通过回调地址通知商户服务端。

5. 服务端同步结果: 商户服务端更新订单状态,并将结果同步给客户端。

6. 端侧展示结果: 应用展示退款状态(如 “退款中”“退款成功”)。

七、附录

1. 鸿蒙支付服务官方文档:

developer.huawei.com/consumer/cn…

2. 申请华为支付商户入网:

developer.huawei.com/consumer/cn…

3. 华为支付API文档:

developer.huawei.com/consumer/cn…