nodejs微信支付之申请退款

2020-07-01 16:53:41 浏览数 (1)

本文继续介绍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)
            }
        });
    })

};

解决了双向证书的问题之后基本上流程和查询订单流程就差不多了,就不再赘述了。

后续将继续介绍微信支付的退款结果通知

0 人点赞