nodejs 校验微信支付通知的签名

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答

微信支付的文档请点击这里 ,这里用 js 把它写出来了

有需要的可以直接 copy

微信发送的数据是一个 xml ,首先需要吧 xml 转换成 js 的对象

在 express 中,可以使用 body-parser 这个插件达到效果

const bodyParser = require('body-parser')
require('body-parser-xml')(bodyParser)
app.use(bodyParser.xml({
    limit: '1MB',
    xmlParseOptions: {
        normalize: true,
        normalizeTags: true, 
        explicitArray: false
    }
}))

使用这个中间件会把 xml 转换成 JavaScript 的 对象(Object),下面的 checkWXNotifySign 函数默认你已经使用了上面的中间件

function checkWXNotifySign(xmlObj, PAY_API_KEY) {
    let string = ''
    const keys = Object.keys(xmlObj)
    keys.sort()
    keys.forEach(key => {
        if (xmlObj[key] && key !== 'sign') {
            string = string + key + '=' + xmlObj[key] + '&'
        }
    })
    string = string + 'key=' + PAY_API_KEY
    const localSign = md5(string).toUpperCase()
    return localSign === xmlObj.sign
}

其中,第一个参数是 xml 转换成的对象,第二个是微信支付的 key (不是小程序的 secret, 官方会发到你的邮箱里面)
函数返回的是一个布尔值,校验通过则为 true, 否则为 false
上面用到了一个 md5 函数,可以自行去 npm install 一个

你可能感兴趣的:(nodejs 校验微信支付通知的签名)