版权声明:本文为博主原创文章,未经博主允许不得转载。
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,到生成二维码,处理微信的支付成功结果,整个流程都已跑通,微信支付到此告一段落了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。