处理接口
话不多说,先上完整代码,再解释
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>${_xml}</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>${_xml}</xml>`;
}