本文继续介绍nodejs接入微信支付,前面说过了统一下单和支付结果通知。下面再来说一下查询订单
查询订单
查询订单其实有了前两篇文章的介绍,基本上也没必要再多说了,基本上就是调用的问题,前面已经封装好了方法,这里说一下基本的步骤: - 构造参数,生成签名(使用exports.getWechatSign) - 将对象转换为xml格式(使用exports.json2xml) - 发起请求,发送xml格式(使用common.post_https_requestXml) - 接收xml格式数据(使用exports.parseReqXmlData) - 验签(使用exports.checkPayResultSign)
如此订单查询也就结束了,相关的方法在前两篇文章已经写过了,可自行前往查看。
申请退款
关于申请退款这个方法相对麻烦一点的就是需要双向证书,微信文档里说的是需要安装在本机上,其实使用nodejs并不需要安装,只需要在请求的时候进行相关的配置就可以了。需要注意的是使用nodejs需要的证书是p12后缀的证书。
其实相关的方法在统一下单里面说过了,在这里再介绍一遍:
代码语言:javascript复制//封装post请求
exports.post_https_requestXml = function (urlstring, post_data, callback) {
callback = callback || function () {
};
var urlData = url.parse(urlstring);
var hostIP = urlData.host;
if (urlData.host.indexOf(":") > 0) {
hostIP = urlData.host.substr(0, urlData.host.indexOf(":"));
}
var options = {
hostname: hostIP,
port: urlData.port,
path: urlData.path,
method: 'POST',
};
if(post_data.agentOptions){
options.pfx = post_data.agentOptions.pfx;
options.passphrase = post_data.agentOptions.passphrase;
}
var req = https.request(options, function (res) {
var body = "";
res.setEncoding('utf8');
res.on('data', function (chunk) {
body = chunk;
});
res.on('end', function () {
callback(body);
});
});
req.on('error', function (e) {
console.log('error:' e.message);
callback('');
});
req.write(post_data.body);
req.end();
};
在请求的参数中添加上一个agentOptions参数,其中pfx为证书内容,passphrase为证书的密码,默认为商户号,调用方法如下:
代码语言:javascript复制 exports.refundRequest = (requestUrl,jsonxml,pwd)=>{
return new Promise((resolve,reject)=>{
fs.readFile(path.resolve(process.cwd(),"payCert/apiclient_cert.p12"),function(err,data){
if(!err){
let requestOptions = {
body:jsonxml,
agentOptions:{
pfx:data,
passphrase: pwd,
}
};
common.post_https_requestXml(requestUrl,requestOptions,async (xmlRes)=>{
try{
console.log(xmlRes);
if(xmlRes.indexOf("xml")>=0){
let ParaseXml= await exports.parseXml(xmlRes);
resolve(ParaseXml);
}else{
resolve({
success:false,
msg:xmlRes
});
}
}catch(e){
reject(e)
}
})
}else{
reject(e)
}
});
})
};
解决了双向证书的问题之后基本上流程和查询订单流程就差不多了,就不再赘述了。
后续将继续介绍微信支付的退款结果通知