使用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中的History历史对象
Jan 16 Javascript
JavaScript效率调优经验
Jun 04 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
js获取客户端外网ip的简单实例
Nov 21 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
jquery delay()介绍及使用指南
Sep 02 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
jquery插件splitScren实现页面分屏切换模板特效
Jun 16 Javascript
AngularJS中的API(接口)简单实现
Jul 28 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
Aug 11 Javascript
vue实现移动端悬浮窗效果
Dec 01 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
小程序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
php正则
2006/07/07 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python获得一个月有多少天的方法
2015/06/04 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
python主要用于哪些方向
2020/07/05 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis