美文网首页
【Node.js】实现一码多付,微信,支付宝收款码聚合。

【Node.js】实现一码多付,微信,支付宝收款码聚合。

作者: 远浅 | 来源:发表于2017-09-23 00:36 被阅读592次

    github地址 https://github.com/unliar/wechat-alipay-qr ,有帮助的话可以star 一下谢谢。修改下配置直接能用。测试地址hipoor.com
    相关参考文档
    中文 express 简单翻译
    nunjucks模板引擎
    Nodejs文档

    现在,二维码支付遍地开花,小摊小贩都能使用二维码进行收款,大大的便利了人们的日常生活。

    但是,有没有觉得用两个二维码是一种极其不优雅的体验。

    用户在支付之前还得判断一下这个二维码到底是用哪种支付工具,而且会常出现手抖打开了错误的扫一扫界面。

    因此,实现二维码聚合来优化支付体验十分有必要。

    下面我们就来用 Node 的web框架 express来实现一个简单的二维码聚合。

    实现原理:

    不同的浏览器会有不同的请求头,根据请求头的user_agent 就能对微信浏览器和支付宝浏览器进行不同的响应啦!由于微信无法直接调用支付界面,所以只能采用展示二维码界面长按进行支付。agent如下,加粗部分为用于判断客户端的特征值。

    微信浏览器user-agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 MicroMessenger/6.5.16 NetType/4G Language/zh_CN"

    支付宝user-agent: "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; BLN-AL10 Build/HONORBLN-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.4.950 UWS/2.11.0.20 Mobile Safari/537.36 UCBS/2.11.0.20 Nebula AlipayDefined(nt:4G,ws:360|0|3.0) AliApp(AP/10.1.2.091816) AlipayClient/10.1.2.091816 Language/zh-Hans useStatusBar/true

    开发步骤

    前置工作:

    1,安装nodejs。
    2,安装 express-generator。
    3,初始化项目。

    npm install -g express-generator
    express  qrcode
    cd qrcode 
    npm install qr-image --save    //生成二维码模块
    npm install  nunjucks --save   //模板引擎模块
    

    定义配置

    1,修改 app.js ,引入nunjucks 模板引擎和配置。
    2,去除默认的jade引擎。去除不需要的路由。
    3,新增config/index.js,修改 www/bin 配置。
    4,修改路由 routes/index.js ,新增视图 view/* 模板。

    app.js 具体内容

    let express = require('express');
    let path = require('path');
    let logger = require('morgan');
    let cookieParser = require('cookie-parser');
    let bodyParser = require('body-parser');
    let nunjucks = require('nunjucks');
    let index = require('./routes/index');
    
    
    let app = express();
    
    app.enable('trust proxy')
    // view engine setup
    nunjucks.configure('views', {
      autoescape: false,
      express: app,
      noCache: false
    });
    app.set('view engine', 'html');
    app.set('views', path.join(__dirname, 'views'));
    
    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(logger('combined'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({
      extended: false
    }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', index);
    
    
    // catch 404 and forward to error handler
    app.use(function (req, res, next) {
      let err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    // error handler
    app.use(function (err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    

    config/index.js 具体内容

    module.exports = {
      hostName: "http://hipoor.com", //可访问地址,本地开发预览时,填你的电脑局域网ip+端口。
      alipayUrl: 'HTTPS://QR.ALIPAY.COM/FKX0736735EJNZE1PEYUA6', //你的支付宝收款码识别出来的地址-->https://cli.im/deqr/
      wechatPayQR: 'img/qr.png', //你的微信收款码
      port: 2666 //端口号
    }
    

    主要的路由逻辑 routes/index.js

    let express = require('express');
    let router = express.Router();
    let qr = require("qr-image")
    let {
      hostName,
      alipayUrl,
      wechatPayQR
    } = require("../config/index")
    
    // 把你的可访问地址生成一张二维码图片作为首页入口
    let qrImg = qr.image(hostName, {
      type: 'png'
    })
    qrImg.pipe(require("fs").createWriteStream("public/img/qrImg.png"))
    
    // 首页路由逻辑
    router.get('/', function (req, res) {
    //获取浏览器agent
      const {
        'user-agent': agent
      } = req.headers
    
      if (agent.indexOf("MicroMessenger") !== -1) {
        //跳转微信二维码展示
        res.redirect("/wechat")
      } else if (agent.indexOf("AlipayClient") !== -1) {
        //支付宝扫描直接跳转到转账
        res.redirect(alipayUrl)
      } else {
        //否则渲染入口页
        res.render("index")
      }
    
    });
    
    // 微信二维码展示地址
    router.get("/wechat", (req, res) => {
      res.render('wechat', {
        url: wechatPayQR //你的微信转账图片地址
      })
    })
    module.exports = router;
    

    视图层

    {% extends "layout.html" %} 
    {% block body %}
    
    <h1>打钱使我快乐</h1>
    <h2>长按支付</h2>
    ![]({{url}}) 
     {% endblock%}
    

    结语

    这个案例只做到了单用户,事实上多用户也可以根据这个进行扩展。
    具体需要完善以下逻辑:
    1,最好实现多用户注册登录
    2,前端实现二维码的展示。
    3,后端对用户提交的二维码信息进行解析,存储在数据库。给每个用户信息唯一的id并渲染一个聚合二维码入口页面。

    相关文章

      网友评论

          本文标题:【Node.js】实现一码多付,微信,支付宝收款码聚合。

          本文链接:https://www.haomeiwen.com/subject/ryyqextx.html