一、微信Native支付流程分析
微信支付平台
商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。
业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
二、了解统一下单接口
注意属性表
后台项目添加常用属性标的配置文件,这些配置均由 不需要更改,直接使用接口,如果自己想配置,先申请公司,然后申请微信支付功能。
// admin-app/config/index.js
module.exports = {
// 统一下单接口地址
unifiedorder: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
// 公众账号ID
appid: 'wx100749d4612ea385',
// 商户号
mch_id: '1448624302',
// 支付结果的回调地址
notify_url: 'https://walter666.cn/wxpay/notify',
// 拼接API密钥
key: 'T8NHKqOfKWtqZPnQm8K77PtQtaRXluU8'
}
三、后台接口根据用户选购的商品生成订单
根据统一下单接口添加必须的属性,前端只需要 产品的描述 + 产品的订单id + 交易的金额。
1.熟悉必须的属性表
属性 | 作用 | 备注 |
---|---|---|
appid | 公众号id | 从配置中获取 |
mch_id | 商户号 | 从配置中获取 |
nonce_str | 随机字符串 | 随机字符串,长度要求在32位以内。推荐随机数生成算法 |
sign | 签名 | 通过签名算法计算得出的签名值,详见签名生成算法 |
body | 商品描述 | 商品简单描述,该字段请按照规范传递,具体请见参数规定 |
out_trade_no | 商户订单号 | 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-以及* 且在同一个商户号下唯一。 |
total_fee | 标价金额 | 订单总金额,单位为分 |
notify_url | 通知地址 | 从配置中获取 |
trade_type | 交易类型 | JSAPI -JSAPI支付NATIVE -Native支付APP -APP支付 |
2.生成随机字符串
微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。
项目根目录下创建utils文件夹,在其下创建 tools.js
- 安装随机字符串模块
cnpm i randomstring -S
// admin-app/utils/tools.js
var randomstring = require('randomstring')
exports.getNoncestr = () => {
return randomstring.generate(32)
}
3.生产签名
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
1.整合数据
在接口文件中先行准备数据
2.封装生成签名
// admin-app/utils/tools.js
var randomstring = require('randomstring');
var crypto =