关于通知接口的坑
3.37里并没有告诉 用那些参数进行验证sign 鹅厂的文档向来写的不好
npm上的一些包也没有验证 这个会存在安全隐患 我自己写了个方法 仅供大家吐槽
var md5 = require('MD5');
function notify_url(body) {
if (body.xml) {
var sign = body.xml.sign[0];
var sign1=body.xml;
delete sign1.sign;
var url= _toQueryString(sign1)+"&key="+config.wxpayconfig.partnerKey// 微信支付秘钥 ;
var ret =md5(url).toUpperCase();//tool.getMd5(url).toUpperCase();
if (ret == sign) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
function _toQueryString(object) {
return Object.keys(object).filter(function (key) {
return object[key] !== undefined && object[key] !== '';
}).sort().map(function (key) {
return key + "=" + object[key];
}).join("&");
}其中body 是post 过来的xml文件 以上便是验证方法
下面我说说处理逻辑
function weixinindex(req, res) {
//
var body = req.body;
if(body.xml.return_code=="SUCCESS") {
var total_fee = body.xml.total_fee[0];
var transaction_id = body.xml.transaction_id[0];
var ret =wxbank.notify_url(body);
var out_trade_no =body.xml.out_trade_no[0];
console.log(out_trade_no,out_trade_no.split('_')[0]);
var openid = body.xml.openid[0];
if (ret == true) //验证通过 操作数据库
{
//处理自己的逻辑
if(支付成功)
{
//支付成功
res.send('success');
}
else{
//失败
res.send('fail');
}
}
}
} 至此 可以正常的适用了 也排除了安全隐患
