YClimb 2019-06-25
版权声明:本文为博主原创文章,未经博主允许不得转载。
在微信服务器成功返回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,到生成二维码,处理微信的支付成功结果,整个流程都已跑通,微信支付到此告一段落了。