(一)目前支付有两种主流方式
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 (引入生成二维码)
(五)支付成功通知
商户系统对于支付结果通知的内容一定要做签名验证,接口返回的签名和传入的签名呢是否一致!!
并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
如果 全都校验通过,则改变订单状态~