使用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 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
幻宇的层模拟窗口效果-提供演示和下载
Jan 20 Javascript
基于JQuery的日期联动实现代码
Feb 24 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
Jan 27 jQuery
JS查找孩子节点简单示例
Jul 25 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
JavaScript手写数组的常用函数总结
Nov 22 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
php自动适应范围的分页代码
2008/08/05 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
php学习之运算符相关概念
2011/06/09 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
js实现轮播图特效
2020/05/28 Javascript
使用cx_freeze把python打包exe示例
2014/01/24 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
模具专业毕业生自荐书范文
2014/02/19 职场文书
合作意向书格式及范文
2014/03/31 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
教代会闭幕词
2015/01/28 职场文书
员工离职证明范本
2015/06/12 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL