使用express获取微信小程序二维码小记


Posted in Javascript onMay 21, 2019

前言

遇到了一个需求,想要扫码后,进入微信小程序的某一个页面,这就要求二维码携带参数。

微信小程序开发文档很简单,但不太具体。

经百度和折腾,在express中成功获得了带参数的二维码。

总结以下几步,供参考。

1.express项目中引入http请求工具

为什么要在服务端引入这个工具?因为还需要用这个工具去找微信服务端拿access_token接口凭证,来保证安全。

笔者用的是axios。cmd进入根目录,npm安装。

# npm i axios --save

肯定需要写一个获得二维码的接口。在写这个接口的文件中引入axios即可,接口路由的写法不具体展开介绍。

import express from 'express';
import axios from 'axios'; //引入axios库
let qrcode= express.Router();
qrcode.post('/getQrode',async (req,res)=>{
  try {
    ...
    //待写接口内容区域
  } catch (error) {
    throw error;
  }
})
export default qrcode;

引入了库,定义了路由,也定义了一个post接口。第一步准备完毕。

2.获取access_token

找微信服务端拿access_token,需要用上刚刚引入的axios工具了。

通过官方文档介绍,获取access_token需要三个参数,一个常量grant_type,两个变量分别是appid和secret(注册小程序的时候就会获得)

修改接口即可获得access_token

import express from 'express';
import axios from 'axios';
let qrcode= express.Router();
qrcode.post('/share',async (req,res)=>{
  try {
    let appid = 'wxc********b7a';
    let secret = '2bfa**************e8682';
    let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`
    axios.get(url).then(res2=>{
      //access_token就在res2中
      let access_token = res2.data.access_token;
      //待继续补充区域
    });
  } catch (error) {
    console.log(error)
  }
})
export default qrcode;

拿到了access_token接口凭证了,继续下一步。

3.获取二维码的二进制数据

阅读文档,得知需要进一步传参,请求微信服务端获取二维码的buffer数据。

需要携带的参数可以写在scene中。其他参数文档中介绍的已经很具体。

然而,这里有两个坑要注意!

第一个坑:access_token参数要写在url中,不然请求后会报未传access_token的错。

第二个坑:要设置响应格式,否则请求回来的buffer数据总是被编译成String字符串,造成文件损坏,就无法转化为正常图片(这个折磨了我好久)

import express from 'express';
import axios from 'axios';
let qrcode = express.Router();
qrcode.post('/share',async (req,res)=>{
  try {
    let appid = 'wxc********b7a';
    let secret = '2bfa**************e8682';
    let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`
    axios.get(url).then(res2=>{
      let scene = req.body._id;//开发者自己自定义的参数
      axios(
        {
          headers:{"Content-type":"application/json"},
          method: 'post',
          responseType: 'arraybuffer',
          url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='+access_token+'',
          data:{
            scene:scene,
            page:'pages/infor/main',
            width: 280
          }
        }
      ).then(res3=>{
        //请求到的二维码buffer就在res3中
        //待完善区域
      })
    });
  } catch (error) {
    console.log(error)
  }
})
export default qrcode;

第二次axios请求,用option配置的方式,设置了responseType,避开了第二个坑。二维码的buffer数据就在res3中。

4.用buffer生成图片

只要buffer数据是完整的,就能正确生成二维码。

因为需要生成图片,所以需要引用fs模块和path模块。

import express from 'express';
import axios from 'axios';
import path from 'path';
import fs from 'fs';
let qrcode= express.Router();
qrcode.post('/share',async (req,res)=>{
  try {
    let appid = 'wxc********b7a';
    let secret = '2bfa**************e8682';
    let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`;
    axios.get(url).then(res2=>{
      let access_token = res2.data.access_token;
      let scene = req.body._id;
      axios(
        {
          headers:{"Content-type":"application/json"},
          method: 'post',
          responseType: 'arraybuffer',
          url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='+access_token+'',
          data:{
            scene:scene,
            page:'pages/infor/main',
            width: 280
          }
        }
      ).then(res3=>{
        let src = path.dirname(__dirname).replace(/\\/g,'/')+`/public/photo/${req.body._id}.png`;
        fs.writeFile(src, res3.data, function(err) {
          if(err) {console.log(err);}
          res.json({msg:ok});
        });
      })
    });
  } catch (error) {
    console.log(error);
    res.json({error})
  }
})

export default qrcode;

就会在根目录下的public/photo文件夹中生成制定名称的二维码图片。供小程序访问调用。

后记

获取二维码后,可以在前端利用canvas进行图片绘制,也可以在后端生成图片。可根据业务需求自行选择。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
Apr 02 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
JavaScript DOM元素尺寸和位置
Apr 13 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
微信小程序如何实现精确的日期时间选择器
Jan 21 Javascript
小程序server请求微信服务器超时的解决方法
May 21 #Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 #Javascript
用node.js写一个jenkins发版脚本
May 21 #Javascript
vue-router源码之history类的浅析
May 21 #Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 #Javascript
vue 中使用 watch 出现了如下的报错的原因分析
May 21 #Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
May 21 #Javascript
You might like
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
php取出数组单个值的方法
2018/03/12 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
JQuery datepicker 使用方法
2011/05/20 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
python统计日志ip访问数的方法
2015/07/06 Python
使用python实现tcp自动重连
2017/07/02 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
广州盈通面试题
2015/12/05 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
岗位职责的定义
2013/11/10 职场文书
挂牌仪式主持词
2014/03/20 职场文书
党支部活动策划方案
2014/08/18 职场文书
幸福中国演讲稿
2014/09/12 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android