使用nodejs获取微信小程序带参数二维码

由于项目需求,需要获取小程序页面的带有参数的二维码。好,那就看文档搞吧。

之前都是写前端,没有写过后台的东西,这次难得有机会组长让我试一试试用node来写,那就写吧。

1、首页获取token,发送request请求,用get的方式,在url后面加上小程序的grant_type,appid,secret,就顺利拿到token了,注意,这个token是有有效时间的,小程序的是7200秒,也就是2个小时,每天获取的次数有限,需要有个中控服务器定时获取token,由于我的业务量小,就没有对token进行保存了,每次都是重新获取。

2、获取完token之后,再发送请求获取二维码,坑的是,微信没有告诉我们获取的是二进制流,之前一直是写前端的代码,对流没有概念,百度之,谷歌之,折腾了两天,终于搞定。还遇到了express的坑,用原来express的代码,死活生成不了二维码,新建一个express再生成二维码就没问题,莫名其妙的坑。

上代码:


使用:

var config = {
    width: 2048,
    arr: []
  }
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].LEVEL != 1) { 
      config.arr.push({
        path: 'pages/detail/detail?id=' + arr[i].ID + '&type=share', //小程序的带参数路径
        name: arr[i].NAME  //每张二维码的名字
      })
    }
  }
  var createQrcode = require('./public/javascripts/createQrcode');//引入包
  createQrcode.create(config);//传入配置,直接生成带参数的二维码



生成二维码的代码:

var fs = require('fs');
var log4js = require('../../conf/log_conf');//打日志的,可以不要,以下有logger.debug()的都可以删除,对代码没有影响
var logger = log4js.getLogger();
var request = require('request');
var wx_conf = require('../../conf/wx_conf');


var AccessToken = {
  grant_type: 'client_credential',
  appid: wx_conf.appId,
  secret: wx_conf.appSecret
}
var wx_gettoken_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=' + AccessToken.grant_type + '&appid=' + AccessToken.appid + '&secret=' + AccessToken.secret;




var create_time = 0,
  now = 0,
  token = '';
var createQrcode = {
  create: function(config) {
    var that = this;
    logger.debug('fn:create');
    if (this.isInTwoHours()) {
      this.getQrcode(config);
    } else {
      getWxToken().then(res => {
        if (res.isSuccess) {
          that.getQrcode(config);
        } else {
          logger.debug('获取token出错');
        }
      })
    }
  },
  //判断是否超过两个小时,将token存储起来,减少token请求。
  isInTwoHours: function() {
    logger.debug('fn:isTwoHours');
    now = new Date().getTime();
    var diffHours = (now - create_time) / (60 * 1000);
    logger.debug('diffHours:' + diffHours);
    if (diffHours < 2) {
      return true;
    } else {
      return false;
    }
  },
  //生成二维码
  getQrcode: function(config) {
    logger.debug('长度是:' + config.arr.length);
    for (let i = 0; i < config.arr.length; i++) {
      logger.debug('执行了' + (i + 1) + '次');
      logger.debug('fn:getQrcode');
      //setTimeout用来做延迟请求,一次性发几十个请求,微信服务器会返回繁忙
      //其实可以用队列来处理,但是我不知道怎么弄,就只能用这种低端的处理方法了,看看队列再来改造一下吧。
      setTimeout(function() {
        new Promise(function(resolve, reject) {
          resolve(
            request({
              method: 'POST',
              url: 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=' + token.access_token,
              body: JSON.stringify({
                path: config.arr[i].path,
                width: config.width
              })
            }))
        }).then(data => {
          //将微信返回的东西装到文件中。
          data.pipe(fs.createWriteStream('./public/images/' + config.arr[i].name + '.png'));
        })
      }, 100 * i);
    }
  }
}


//获取微信的token
var getWxToken = function() {
  logger.debug('fn:getWxToken');
  var that = this;
  return new Promise((resolve, reject) => {
    request({
      method: 'GET',
      url: wx_gettoken_url
    }, function(err, res, body) {
      if (res) {
        create_time = new Date().getTime();
        token = JSON.parse(body);
        resolve({
          isSuccess: true
        });
      } else {
        logger.debug(err);
        resolve({
          isSuccess: false
        });
      }
    })
  });
}




module.exports = createQrcode;

打个广告,自己的第一个小程序:

使用nodejs获取微信小程序带参数二维码_第1张图片



你可能感兴趣的:(前端)