nodejs微信扫码支付功能实现

2020-06-17 07:11:23易采站长站整理

formData += "<sign>" + sign + "</sign>";
formData += "</xml>";
// 这里使用了egg里面请求的方式
const resultData = yield ctx.curl(url, {
method: 'POST',
content: formData,
headers: {
'content-type': 'text/html',
},
});

// xml转json格式
xml2js.parseString(resultData.data, function (err, json) {
if (err) {
new Error("解析xml报错")
} else {
var result = formMessage(json.xml); // 转换成正常的json 数据
console.log(result) //打印出返回的结果
}
})
var formMessage = function (result) {
var message = {};
if (typeof result === 'object') {
var keys = Object.keys(result);
for (var i = 0; i < keys.length; i++) {
var item = result[keys[i]];
var key = keys[i];
if (!(item instanceof Array) || item.length === 0) {
continue;
}
if (item.length === 1) {
var val = item[0];
if (typeof val === 'object') {
message[key] = formMessage(val);
} else {
message[key] = (val || '').trim();
}
} else {
message[key] = [];
for (var j = 0, k = item.length; j < k; j++) {
message[key].push(formMessage(itemp[j]));
}
}
}
}
return message;
}

上面使用了egg的请求方式,原生node可以使用request


var request = require('request');
request({
url: url,
method: "POST",
body: formData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
}
});

如果请求成功会最终返回一个xml,然后我们进行解析成json的格式,里面会有一个code_url和out_trade_no,我们需要把这两个返回给前端,然后通过生成二维码展示给用户扫码,完成支付

监听支付是否成功

上面操作完成之后,我们需要知道用户是否完成支付,因为用户会停留在该页面,我们需要在用户付完款之后,通知用户支付成功。

首先,用户发起支付的时候我们会生成二维码,让用户完成扫码支付,我们还要做的是,开一个定时器,每隔一段时间去发送一个请求,这个时候,我们node后台就需要写一个查询订单的接口,之前我们拿到了out_trade_no,也就是我们系统内部的订单号,我们把这个数据发送给后台查询订单的接口,然后后台接收到之后会请求微信的查询接口地址https://api.mch.weixin.qq.com/pay/orderquery,流程跟上面一样,只是接口地址和微信返回的xml不一样而已,返回的字段会有一个状态即SUCCESS和NOTPAY,我们可以通过判断是否支付返回给前端,成功之后提示给用户支付成功,关闭定时器。