Nodejs后端实现微信支付结果异步通知处理

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);
        }
    }

三、总结

对支付结果通知的处理,整体来说还算可以,不是很难,当时由于没有看清文档说明,在对通知数据读取的时候费了些时间,刚开始没有想到是以数据流的形式返回数据的,感觉还是很奇怪的,同样是微信支付的一部分功能,为什么返回数据的形式要不一样呢。

猜你喜欢

转载自blog.csdn.net/m0_37857819/article/details/106444203