Nodejs后端实现微信支付结果异步通知处理
一、前言
在之前的文章里写了小程序后端调用微信支付的内容,今天来说一下如何处理微信后台异步推送支付结果给后端的操作。【微信官方支付结果通知说明】
微信支付后台推送支付结果,就是微信后台调用我们在支付的时候发送给微信后台的通知地址notifyUrl,将支付结果数据发送给我们自己的后端,后端再去解析数据,进行逻辑处理。
我们要做的内容就是在后端写好支付结果通知的处理方法,写好路由操作,同时将写好的接收通知的地址发送给微信后台就可以了。
二、支付结果通知处理方法
对通知结果的处理难点在于,微信后台是以数据流的形式将数据返回的,同时他返回的数据格式是XML格式,而且需要以给定的形式给微信后台发送反馈消息,如果微信后台没有收到反馈消息,则会每隔一段时间给你发送一次通知。为了便于小程序端进行支付结果查询,我们需要将支付结果通知在本地进行存储。
注意:这里的返回结果是给微信后台返回的,并不是发给小程序的。
这里使用request.on()的方法来读取数据流,使用“xmlreader”包来读取XML格式的数据。WXPayInfoModel是自定义的通知结果数据表,我是使用MongoDB数据库来进行数据管理的。
参考代码:
wxPayNotify = (req: Request, res: Response) => {
req.setEncoding("utf8");
try {
req.on("data", function (xml, call) {
xmlreader.read(xml, (err, result) => {
if (null !== err) {
console.log(err);
return;
}
if (result.xml.return_code.text() === "SUCCESS") {
const data = {
appid: result.xml.appid.text(),
mch_id: result.xml.mch_id.text(),
nonce_str: result.xml.nonce_str.text(),
sign: result.xml.sign.text(),
return_code: result.xml.return_code.text(),
result_code: result.xml.result_code.text(),
openid: result.xml.openid.text(),
is_subscribe: result.xml.is_subscribe.text(),
trade_type: result.xml.trade_type.text(),
bank_type: result.xml.bank_type.text(),
total_fee: result.xml.total_fee.text(),
cash_fee: result.xml.cash_fee.text(),
transaction_id: result.xml.transaction_id.text(),
out_trade_no: result.xml.out_trade_no.text(),
time_end: result.xml.time_end.text(),
type: "notify info"
}
const payInfo = new WXPayInfoModel(data);
payInfo.save();
const formData = `
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
`
return res.send(formData);
}
else {
const formData = `
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[${result.xml.return_msg.text()}]]></return_msg>
</xml>
`
return res.send(formData);
}
});
});
req.on("end", function (db) {
db;
});
}
catch (err) {
console.log(err);
}
}
三、总结
对支付结果通知的处理,整体来说还算可以,不是很难,当时由于没有看清文档说明,在对通知数据读取的时候费了些时间,刚开始没有想到是以数据流的形式返回数据的,感觉还是很奇怪的,同样是微信支付的一部分功能,为什么返回数据的形式要不一样呢。