基于node.js微信支付notify_url回调处理

处理接口

话不多说,先上完整代码,再解释

router.all('/server/url_test', xmlparser({ trim: false, explicitArray: false }), function (req, res, next) {
    var jsonData = req.body.xml;
    if (jsonData.result_code == 'SUCCESS') {
        var key = "c24cb4054b87951ee24dc736c67b94ca";

        var stringA = "appid=" + jsonData.appid + "&bank_type=" + jsonData.bank_type + "&cash_fee=" + jsonData.cash_fee + "&fee_type=" + jsonData.fee_type +
            "&is_subscribe=" + jsonData.is_subscribe + "&mch_id=" + jsonData.mch_id + "&nonce_str=" + jsonData.nonce_str + "&openid=" +
            jsonData.openid + "&out_trade_no=" + jsonData.out_trade_no + "&result_code=" + jsonData.result_code + "&return_code=" +
            jsonData.return_code + "&time_end=" + jsonData.time_end + "&total_fee=" + jsonData.total_fee + "&trade_type=" +
            jsonData.trade_type + "&transaction_id=" + jsonData.transaction_id;
        var stringSignTemp = stringA + "&key=" + key;
        var sign = md5(stringSignTemp).toUpperCase();
        console.log(sign)
        if (sign == jsonData.sign) {
            console.log('yes')
            test.updatemsg(jsonData.out_trade_no).then(function (data) {
                // console.log(data)
                console.log('success')
            })
            //json转xml
            var json2Xml = function (json) {
                let _xml = '';
                Object.keys(json).map((key) => {
                    _xml += `<${key}>${json[key]}${key}>`
                })
                return `${_xml}`;
            }
            var sendData = {
                return_code: 'SUCCESS',
                return_msg: 'OK'
            }
            res.end(json2Xml(sendData));
        }
    }
})

官方文档 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3

1、接收参数

因为回调的参数是以XML的格式,所以使用常规方法接收是接收不到的这时候需要一个中间件

var xmlparser = require('express-xml-bodyparser');//引入
xmlparser({ trim: false, explicitArray: false })

接收回来的参数也直接转换成了json对象

2、签名检验

在官方文档中没有告诉我们回调的参数怎样进行签名校验,其实就是将传回来的参数除了sign

将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)
拼接成字符串stringA。
在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符
转换为大写,得到sign值signValue。

其实就是和前面的签名一样,将参数签名结果与所传回来的sign比较,一样则校验成功

3、返回参数

返回参数是需要以xml格式返回的,下面提供一个json转xml,可直接复制

var json2Xml = function (json) {
                let _xml = '';
                Object.keys(json).map((key) => {
                    _xml += `<${key}>${json[key]}${key}>`
                })
                return `${_xml}`;
            }

你可能感兴趣的:(基于node.js微信支付notify_url回调处理)