node 微信扫码支付(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。

node 后台生成二维码和支付成功的回调

生成二维码

在微信服务器成功返回code_url等信息之后,我们需要进一步将code_url生成二维码;当然后在前端用一些第三方的插件也能生成,单是相对来说,不如在后台生成二维码更加安全,微信的官方文档也是推荐在后台生成。
为了方便,我们还是在wxpayRouter.js中实现该部分代码

/**
*需要的依赖请参考[node微信扫码支付(一)](https://segmentfault.com/a/1190000011540768)
**/
wxPayRouter.get("/create_qrcode",function(req, res ,next) {
    var qrcode_url = req.query.code_url;
    /**
    ** 在这里建议加上用户的身份信息验证,然后再返回二维码,避免多人同时发出请求,造成二维码错乱
    **/
    var qrcode = qr.image(code_url,{size:100});
    res.type('png');
    qrcode.pipe(res);
})

以上是后端生成二维码,这里我们采用qr-image这个包,当然还有其他的包,但是需要配置phtyon等环境,相当麻烦,在这里我将获取code_url和create qrcode做成了两个路由,当然如果嫌麻烦,可以做成一个路由。
在前端的话需要在img中调用该接口

/**
** 前端请求order接口之后获得的code_url之后;
**/
<img src="/wxpay/create_qrcode?code_url=(请求order接口之后获得的code_url)">

到此为止,用户已经可以扫码完成支付,将钱充进商户的账户中了。

处理支付成功后返回的信息

在统一下单中,notify_url 这个字段填写的地址,就是我们支付成功后微信回调的地址,小伙伴们注意啦,这里有一个大坑,在收到支付成功的消息后,如果没有给微信回复相应的消息后,微信就会不停的轮询,回调我们的接口;我们还是在wxpayRouter.js完成这个接口

wxPayRouter.post('/orderpay', function (req, res, next) {
    var body = req.body;
    var payInfo = body.xml;
    var attach  = payInfo.attach; // 这里是我们的附加信息,

    console.log(payInfo);
    async.auto({

        /**
        **在这里建议从业务上也处理一下微信的这个轮询回调;入库的话,避免数据重复入库等
        **
        **/
       
    }, function (err, result) {
         /**
         **处理完数据之后,就可以给微信发送消息了,告诉微信,支付成功的消息已经收到
         **/
        var resxml = {
            return_code: 'SUCCESS',
            return_msg: 'OK'
        }
        var body = jsontoxml(resxml);
        body = '<xml>' + body + '</xml>';
        res.end(body);
    });
});

在这里还会有一个坑,微信是数据流的形式返回信息,用express接收不到微信返回的消息,所以我们需要在app.js中配置一下;

var bodyParser = require("body-parser");
require("body-parser-xml")(bodyParser);
app.use(bodyParser.xml({
  limit: "2MB",   
  xmlParseOptions: {
    normalize: true,     
    normalizeTags: true,
    explicitArray: false 
  },
  verify: function(req, res, buf, encoding) {
    if(buf && buf.length) {
      req.rawBody = buf.toString(encoding || "utf8");
    }
  }
}));

到这里,微信支付从获取code_url,到生成二维码,处理微信的支付成功结果,整个流程都已跑通,微信支付到此告一段落了。

相关推荐