nodejs微信支付签名验签
时间: 2023-07-19 09:06:11 浏览: 64
在 Node.js 中进行微信支付签名和验签的具体步骤如下:
1. 创建一个对象,包含必要的参数。例如:
```javascript
const params = {
appid: 'your_appid',
mch_id: 'your_mch_id',
nonce_str: '随机字符串',
body: '商品描述',
out_trade_no: '商户订单号',
total_fee: '订单总金额,单位为分',
spbill_create_ip: '用户端实际ip',
notify_url: '接收微信支付异步通知回调地址',
trade_type: 'JSAPI',
openid: '用户的openid'
};
```
2. 对参数按照字典序排序,得到一个新的参数对象。
```javascript
const sortedParams = Object.keys(params).sort().reduce((result, key) => {
result[key] = params[key];
return result;
}, {});
```
3. 拼接参数字符串,不包括签名。
```javascript
const paramsString = Object.keys(sortedParams).map(key => `${key}=${sortedParams[key]}`).join('&');
```
4. 在拼接的参数字符串末尾加上商户支付密钥,得到一个新的字符串。
```javascript
const apiKey = 'your_api_key';
const signString = `${paramsString}&key=${apiKey}`;
```
5. 对新的字符串进行 MD5 加密,得到签名值。
```javascript
const crypto = require('crypto');
const sign = crypto.createHash('md5').update(signString, 'utf8').digest('hex').toUpperCase();
```
6. 将签名值添加到参数对象中。
```javascript
params.sign = sign;
```
7. 将参数对象转换成 XML 格式。
```javascript
const xml2js = require('xml2js');
const builder = new xml2js.Builder({rootName: 'xml', cdata: true, headless: true});
const xml = builder.buildObject(params);
```
8. 发送支付请求或接收微信支付异步通知时,需要对 XML 数据进行验签。具体步骤如下:
- 将 XML 数据解析成 JavaScript 对象。
```javascript
const parser = new xml2js.Parser({trim: true, explicitArray: false, explicitRoot: false});
const parsed = await parser.parseStringPromise(xml);
```
- 按照字典序排序,得到一个新的对象。
```javascript
const sorted = Object.keys(parsed).sort().reduce((result, key) => {
result[key] = parsed[key];
return result;
}, {});
```
- 拼接参数字符串,不包括签名。
```javascript
const sortedString = Object.keys(sorted).filter(key => key !== 'sign').map(key => `${key}=${sorted[key]}`).join('&');
```
- 在拼接的参数字符串末尾加上商户支付密钥,得到一个新的字符串。
```javascript
const signCheckString = `${sortedString}&key=${apiKey}`;
```
- 对新的字符串进行 MD5 加密,得到签名值。
```javascript
const signCheck = crypto.createHash('md5').update(signCheckString, 'utf8').digest('hex').toUpperCase();
```
- 将签名值与 XML 数据中的签名值进行比较,如果相同则验签通过。
```javascript
if (signCheck === parsed.sign) {
// 验签通过
} else {
// 验签失败
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)