使用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 相关文章推荐
模拟用户操作Input元素,不会触发相应事件
May 11 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 Javascript
jQuery深拷贝Json对象简单示例
Jul 06 Javascript
jquery实现多次上传同一张图片
Jan 09 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
解决layer.msg 不居中 ifram中的问题
Sep 05 Javascript
Vue实现滑动拼图验证码功能
Sep 15 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
使用AutoJs实现微信抢红包的代码
Dec 31 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
扩展你的 PHP 之入门篇
2006/12/04 PHP
php 常用类汇总 推荐收藏
2010/05/13 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
JavaScript 参考教程
2006/12/29 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
python读写二进制文件的方法
2015/05/09 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python实现的归并排序算法示例
2017/11/21 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
师范应届生求职信
2013/11/15 职场文书
单位成立周年感言
2014/01/26 职场文书
法制主题班会教案
2015/08/13 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
Vue实现下拉加载更多
2021/05/09 Vue.js
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python