(一)目前支付有两种主流方式

1. 支付宝支付    2. 微信支付

(二)微信支付

1. 微信支付

微信支付分为多种情况 

(1)付款码支付

付款码支付是指用户展示微信钱包内的“付款码”给商户系统扫描后直接完成支付

(2)小程序支付

小程序支付是指商户通过调用微信支付小程序支付接口,在微信小程序平台内实现支付功能;用户打开商家助手小程序下单,输入支付密码并完成支付后,返回商家小程序

(3)APP支付

APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。适用于在移动端APP中集成微信支付功能的场景。

(4)H5支付

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。

(5)刷脸支付

刷脸支付是指用户在刷脸设备前通过摄像头刷脸、识别身份后进行的一种支付方式,安全便捷。

 

微信支付接入入文档:https://pay.weixin.qq.com/wiki/doc/api/index.html,选择接入的类型,主要看 API列表 和 支付实践

调用微信接口支付的时候,需要前置条件,比如 注册微信公众平台、商户号等等

(三)调用支付接口

url 接口链接是 微信已经给出的,现在要做的就是 将相应的参数整理好传过去 参数值用XML转义即可

const reqData =  `
<xml>
  <appid>${公众账号ID}</appid>
  <mch_id>${商户号}</mch_id>
  <nonce_str>${随机字符串}</nonce_str>
  <notify_url>${通知地址}</notify_url>
  <openid>${用户标识}</openid>
  <out_trade_no>${商户订单号}</out_trade_no>
  <spbill_create_ip>${终端IP}</spbill_create_ip>
  <total_fee>${标价金额}</total_fee>
  <trade_type>${交易类型}</trade_type>
  <sign>${签名}</sign>
</xml>`

// 订单总金额,单位为分

以上就是模拟的传参数数据,其中比较复杂的是签名算法,通过签名算法生成签名

使用 axios 发起请求的时候,需要指定

Content-type: 'application/xml'

然后就发送请求 获取结果就行了,返回的结果是xml 格式的 比如这种

<xml>
   <return_code><![CDATA[SUCCESS]]></return_code>
   <return_msg><![CDATA[OK]]></return_msg>
   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
   <mch_id><![CDATA[10000100]]></mch_id>
   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
   <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>
   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
   <result_code><![CDATA[SUCCESS]]></result_code>
   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
   <trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

我们需要把 xml 转化成 js 格式的,来获取字段

xml 转化成 js 需要借助插件: xml2js

(四)生成支付二维码

如果 以支付接口返回字段 return_code 和 result_code 不都是 success,就提示用户 支付失败信息

如果 return_code 和 result_code 都为SUCCESS的时候,会返回一个 code_url,二维码链接

二维码生成插件:qrcode.js (引入生成二维码)

(五)支付成功通知

商户系统对于支付结果通知的内容一定要做签名验证,接口返回的签名和传入的签名呢是否一致!!

并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

如果 全都校验通过,则改变订单状态~