【微信公众号开发系列文章】二、Access token相关操作

2023-11-14

所有内容首发微信公众号【WEB前端李志杰】,欢迎关注、点赞并转发!

写在最前

关于获取Access token这部分内容建议仔细阅读官方文档,本文章对于重点内容进行了摘录,有利于大家把握重点部分。

最后文章中会给出这一部分的程序设计思路及示例代码。

一、关于Access token的说明:

access_token是公众号的全局唯一接口调用凭据;

公众号调用接口时都必须带上access_token,开发者需要进行妥善保存;

access_token有效期为2个小时,重复获取将导致上次获取的access_token失效;

access_token的存储至少要保留512个字符空间。

二、access_token的使用及生成方式说明:

access_token应该由中控服务器统一获取和刷新,其他业务逻辑服务只需要读取;

access_token的有效期通过返回的expire_in来传达,有效期是7200秒(两个小时);

access_token刷新过程中,公众平台后台会保证在5分钟内,新老access_token都可用;

三、接口调用请求说明

接口请求方式:GET

接口请求地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

四、接口调用参数说明

在这里插入图片描述

五、返回值示例

/*
 * 正确返回
 * access_token  获取到的凭证
 * expires_in  凭证有效时间,单位:秒
*/
{"access_token":"ACCESS_TOKEN","expires_in":7200}
/*
 *错误返回
*/
{"errcode":40013,"errmsg":"invalid appid"}

六、程序设计思路

由于所有的接口调用都需要携带access_token,为了方便读取access_token,我们可以将其存储在本地(access_token.txt)文件中,每次调用接口前先尝试读取文件中保存的access_token。

本地没有文件:则直接发起接口请求,将请求结果及失效时间(expires_in)保存在新建的(access_token.txt)文件中并返回给需要使用的接口请求。

本地有文件:则读取access_token及失效时间(expires_in)并判断access_token是否已经失效,如果失效则发起接口请求,并更新(access_token.txt)文件中的请求结果及失效时间并返回给需要使用的接口请求的地方,否则直接将读取到的结果返回给需要使用的接口请求。

七、程序示例代码

在实现工具类之前,新建两个文件:

一个config.js配置文件,用来存储appid、appsecret等配置信息

一个apiurl.js文件统一存储微信后台的请求接口地址,防止微信服务器网络链路发生故障时,可迅速切换。

定义一个工具类(wechatTools)

// 请求access_token接口
const getAccessToken = () => {}; 
// 保存access_token
const saveAccessToken = () => {}; 
// 读取access_token.txt
const readAccessToken = () => {}; 
// 验证access_token的有效性
const validateExpiresIn = () => {}; 
// 封装获取access_token工具
const fetchAccessToken = () => {};
// 最后只需要导出fetchAccessToken就行
module.exports = { fetchAccessToken };

实现getAccessToken()函数

getAccessToken() {
    return new Promise(async (resolve, reject) => {
      const url = `${token}&appid=${appid}&secret=${appsecret}`;
      try {
        const response = await axios.get(url);
        const expires_in = new Date().getTime() + (response.data.expires_in - 300) * 1000;
        response.data.expires_in = expires_in;
        resolve(response.data);
      } catch (error) {
        reject("获取access_token失败" + error);
      }
    });
  }

实现saveAccessToken()函数

async saveAccessToken(data) {
    return new Promise((resolve, reject) => {
      writeFile(path.join(__dirname, `../text/access_token.txt`), JSON.stringify(data), error => {
        if (error) {
          reject("保存access_token失败" + error);
        } else {
          resolve(true);
        }
      });
    });
  }

实现readAccessToken()函数

readAccessToken() {
    return new Promise((resolve, reject) => {
      readFile(path.join(__dirname, `../text/access_token.txt`), {}, (error, data) => {
        if (error) {
          reject(`读取access_token.txt失败` + error);
        } else {
          let dataType = typeof data == "string";
          let resData = dataType ? data : JSON.parse(data);
          resolve(resData);
        }
      });
    });
  }

实现validateExpiresIn()函数

validateExpiresIn(data) {
    if (!data && !data.expires_in) return false;
    return data.expires_in > new Date().getTime();
  }

实现fetchAccessToken()函数

fetchAccessToken() {
    return (
      this.readAccessToken()
        // 本地有文件
        .then(async res => {
          if (this.validateExpiresIn(res)) {
            return Promise.resolve(res);
          } else {
            const data = await this.getAccessToken();
            await this.saveAccessToken(data);
            return Promise.resolve(data);
          }
        })
        // 本地没有文件
        .catch(async error => {
          const data = await this.getAccessToken();
          await this.saveAccessToken(data);
          return Promise.resolve(data);
        })
        // 最终返回的结果
        .then(res => {
          return Promise.resolve(res);
        })
    );
  }

至此所有的代码已经实现,如果想要获取access_token只需要调用fetchAccessToken方法。

fetchAccessToken().then(res => {
  console.log(res);
});

往期内容:
【Vue】在Vite+Vue3.0中使用jsx语法开发。

【Vite+vue3】vue3当中keep-alive的使用

【微信公众号开发系列文章】一、微信公众号开发环境搭建

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【微信公众号开发系列文章】二、Access token相关操作 的相关文章

随机推荐

  • 字节序转换函数

    由于主机的千差万别 主机的字节序不能做到统一 但是对于网络上传输的变量 它们的值必须有一个统一的表示方法 网络字节序是指多字节变量在网络传输时的表示方法 网络字节序采用大端字节序的表示方法 所以小端字节序的系统通过网络传输变量的时候需要进行
  • vuex刷新后数据不会保存??解决办法在此

    我们在写vue项目的时候 经常要用到vuex作为内存来储存 但是我们存放在vuex中的数据 用户数据 当前页面的数据等等 在刷新后就会丢失 那么如何解决呢 超级简单 1 安装vuex persistedstate npm install s
  • STM32串口USART1中断接收和中断发送

    先贴出中断函数 plain view plain copy void USART1 IRQHandler void IF USART GetiTStatus USART1 USART IT RXNE RESET USART ClearITP
  • vue 实现分享功能

    今天给大家分享一个vue的分享插件vshare 实现如下 1 开发环境 vue element 2 电脑系统 windows10专业版 3 组件安装 通过命令在控制台输入 npm install vshare save 4 组件导入 在ma
  • 【刷题】蓝桥杯

    蓝桥杯2023年第十四届省赛真题 平方差 C语言网 dotcpp com 初步想法 x y2 z2 y z y z 即x a b a y z b y z 2y a b 即a b是2的倍数就好了 即x存在两个因数之和为偶数就能满足条件 但时间
  • 抠矩形图程序

    根据抠图位置的起始点坐标和长宽进行矩形抠图 示例代码 原图大小为640 480 每个像素占16bit 起始点坐标 234 124 抠图长宽分别为238 282 include
  • mysql java测试_JAVA 访问MySQL数据库(使用方法及测试)

    说明 本文使用的JDBC框架是基于Java SE 1 8 MySQL Eclipse 工具下载 MySQL V5 5 x64 64位 MySQL V5 5 x86 32位 要根据你电脑的情况选择相应的MySQL版本 我的电脑是64位 所以本
  • 【牛客SQL】SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

    题目描述 描述 有一个薪水表salaries简况如下 请你获取薪水第二多的员工的emp no以及其对应的薪水salary 示例1 输入 drop table if exists salaries CREATE TABLE salaries
  • Matlab批量拟合曲线并绘制在一张图上

    文章目录 简单的拟合 批量拟合并呈现在一张图上 最终结果与完整代码 简单的拟合 在命令行输入 cftool 可以启动工具箱 1 在 选择数据 中导入数据 2 选择拟合方法 matlab提供的方法或者你自己定义的函数 matlab提供的方法
  • 数据结构——非线性结构(树与二叉树)

    文章目录 一 非线性结构的概述 二 树的基本概念 1 树的定义 2 专业术语 3 树的性质 三 树的分类 1 一般树 2 二叉树 是有序树 2 1 概念 2 2 分类 1 一般二叉树 2 满二叉树 3 完全二叉树 2 3 二叉树的性质 2
  • 【西南交大电子实习】用ESP32和HX711实现的称重计/电子秤的Arduino代码

    参考 https randomnerdtutorials com esp32 load cell hx711 7月12日 Update 修改为克g 盎司oz 克拉ct之间的切换 增加计数功能版本代码 需要安装的arduino库 Adafru
  • JS变量的使用【弹出输入框,提示用户名输入姓名;弹出一个对话框,输出用户刚才输入的姓名】

    一 代码 二 结果显示 1 输入名字 2 输出名字 三 补充变量 1 变量只声明不赋值 输出结果是undefined 2 变量不声明不赋值 直接使用某个变量会报错 3 不声明直接赋值使用 也可使用 4 尽量不要用name作为变量名
  • 我玩了玩chatGPT,她确实NB!

    大家好 我是北妈 0 如果这几天你不知道一个叫chatGPT的东西 那说明你网感真不太好了 或者说你过的很幸福 完全不需要关注网络世界的新动向 因为毫不夸张地说 北妈个人未来可以预见的是 普通互联网从业人士已经赶不上时代趋势 以后如果地球没
  • Spring Source Tools安装Virgo插件

    1 STS 3 7 4 安装Virgo插件失败 需要先安装 先下载一个STS IDE 地址 http spring io tools sts all 然而在STS中添加Virgo插件 如果你直接在Install new software中输
  • mysql 1054错误 "Unknown column 'xxx' in 'field list'"

    出现问题的代码如下 s 测试 sql INSERT INTO ffff ID VALUES s s try cursor execute sql db commit print 写入成功 except Exception as e prin
  • FPGA基本IP核之FIFO(异步)

    异步FIFO 创建新的异步FIFO IP核 可以看出相比于同步FIFO这里做了写和读两侧并且各自用一个时钟 一般选用二级同步 然后勾选读和写两侧需要用到的三种信号 选择添加额外的MSB 由于分成两侧时 中间不知道数据是否写满了或者写空了 添
  • GE IS215VCMIH2BB IS200VCMIH2BCC 数字量输入模块

    GE IS215VCMIH2BB 和 IS200VCMIH2BCC 是数字量输入模块 通常用于工业自动化和控制系统中 用于接收和处理数字量输入信号 以下是这些模块可能具备的一些常见功能和产品特点 多通道输入 这些模块通常具有多个数字量输入通
  • 【数据读写】csv文件与xls/xlsx文件

    目录 一 csv格式与xls xlsx格式的区别 二 两种文件格式的读写操作 1 csv文件的读 写函数 csvread csvwrite 2 xls xlsx文件的读 写函数 xlsread xlswrite 三 应用案例 1 实例1 参
  • STM32寄存器

    问题 什么是寄存器 什么是存储器映射 什么是寄存器映射 STM32架构 程序存放在FLASH中 const的常量存放在FLASH中 变量 全局 静态变量 存放在SRAM中 System总线主要读取寄存器 AHB 高速 总线上挂着SDIO 复
  • 【微信公众号开发系列文章】二、Access token相关操作

    所有内容首发微信公众号 WEB前端李志杰 欢迎关注 点赞并转发 写在最前 关于获取Access token这部分内容建议仔细阅读官方文档 本文章对于重点内容进行了摘录 有利于大家把握重点部分 最后文章中会给出这一部分的程序设计思路及示例代码