Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序开发 access_token 统一管理

小程序开发 access_token 统一管理

作者头像
Kindear
发布于 2021-07-14 07:23:18
发布于 2021-07-14 07:23:18
1.9K00
代码可运行
举报
运行总次数:0
代码可运行
TOKEN 定时刷新器

一、背景

对于使用过公众平台的API功能的开发者来说,access_token绝对不会陌生,它就像一个打开家门的钥匙,只要拿着它,就能使用公众平台绝大部分的API功能。因此,对于开发者而言,access_token的使用方式就变得尤其的重要。在日常API接口的运营中,经常遇到各种的疑问:为什么我的access_token突然非法了?为什么刚刚拿到的access_token,用了10min就过期了?对于这些疑问,我们提供出access_token的设计方案,便于开发者对access_token使用方式上的理解。

对于access_token的获取,可以参考公众平台的官方文档:auth.getAccessToken获取Access token

二、access_token的内部设计

2.1 access_token的时效性

众所周知,access_token是通过appid和appsecret来生成的。内部设计的步骤如下:

(1)开发者通过https请求方式: GET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,传入appid及apppsecret的参数

(2)公众平台后台会校验appid和哈希(appsecret)是否与存储匹配,若匹配,结合当前时间戳,生成新的access_token。

(3)生成新的access_token的同时,会对老的access_token的过期时间戳更新为当前时间戳。

(4)返回新的access_token给开发者。

这里以图示的方式说明一下,新旧token交替过程:

从上图需要注意的几点:

(1)公众平台存储层只会存储新老两个access_token,意味着假设开发者重复调用3次接口,则会导致最早的access_token立刻失效。

(2)虽然请求新的access_token后,老的access_token过期时间会更新为当前时间,但也不会立刻失效,原理请参考 【2.2 access_token 的逐渐失效性】

(3)出于信息安全考虑,公众平台并不会明文存储appsecret,仅存储appid以及appsecret的哈希值。因此开发者要妥善保管appsecret。当appsecret疑似泄露时,需要及时登录mp.weixin.qq.com重置appsecret。

2.2 access_token 的逐渐失效性

从【access_token的时效性】了解到,当开发者请求获取新的access_token时,老的access_token过期时间会被更新为当前时间,但此时不会立刻失效,因为公众平台会提供【5分钟的新老access_token交替缓冲时间】,因此也称为access_token

的逐渐失效性。

实现的原理是:

  1. 由于老的access_token过期时间戳已被刷新,所以在API接口请求期间,带上的access_token解开后,过期时间戳会加上5分钟,然后和当前设备时间进行比对,若超过当前设备时间,判断为失效。
  2. 公众平台的设备会保持时钟同步,但设备之间仍然可能会存在1-2分钟的时间差异,所以【5分钟】并非绝对的时间值。当开发者获取到新的access_token后应该尽快切换到新的access_token。

从上图需要注意的几点:

(1)由于存在设备时间同步的差异,可能会导致开发者遇到拿着老的access_token请求API接口,部分请求成功,部分请求失败的情况,建议开发者获取到新的access_token后尽快使用。

(2)通过理解两个图示,对开发者来说,access_token是相当关键且不能乱调的接口,建议开发者统一管理access_token,以免造成多次请求导致access_token失效。

三、access_token的统一管理

  1. access_token的更新交给定时触发器完成
  2. 所有用到access_token的接口调用,不传入access_token,交由后端从数据库中读取

下面以小程序云函数端统一管理access_token代码为例展示

index.js 请求并更新access_token 如果在其他端,需要传入APPID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const timeutil = require('./timeutil');
// 需要修改的配置项
const APPSECRET =  ''
const axios = require('axios');
const db = cloud.database();
// 定时刷新获取配置信息
const CONFIG = 'cloud-token';
// 获取TOKEN
const URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'
function getAccessToken(APPID,APPSECRET){
  let url = URL;
  url = url.replace('{APPID}',APPID)
  url = url.replace('{APPSECRET}',APPSECRET)
  return new Promise(function(resolve,reject){
    axios.get(url).then(function (response) {
      console.log(response);
      resolve(response)
    })
    .catch(function (error) {
      console.log(error);
      reject(error)
    });
  })
}
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  // 自动获取当前应用APPID
  var APPID = wxContext.APPID;
  return new Promise(function(resolve,reject){
    getAccessToken(APPID,APPSECRET).then(async res=>{
      console.log(res)
      let access_token = res.data.access_token;
      let ans =  await db.collection(CONFIG).doc('access_token').set({
        data:{
          value:access_token,
          _updateTime:timeutil.TimeCode()
        }
      })
      resolve(ans)
    })
  }) 
}

config.json 定时触发器 每小时触发一次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "triggers": [
    {
      "name": "myTrigger",
      "type": "timer",
      "config": "0 0 * * * * *"
    }
  ]
}

timeutil.js 时间工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function TimeCode() {
  var date = new Date();
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
//获取日期
function _formatTime(time) {
  var date = time.getFullYear() + '年' + time.getMonth() + '月' + time.getDate() + '日'
  var ftime = time.getHours() + '时' + time.getMinutes() + '分' + time.getSeconds() + '秒'
  return date + ftime;
}
function TimeCodeYmd(){
  var date = new Date();
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  return [year, month, day].map(formatNumber).join('-');
}
function formatNumber(n) {
  n = n.toString()
  return n[1] ? n : '0' + n
}
module.exports={
  TimeCode,
  TimeCodeYmd
}

其他云函数中使用到access_token的地方,通过查询数据库进行获取,二者通过数据库进行逻辑耦合。

access_token 查询使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const TOKEN = 'cloud-token';
//获取access_token 
  try {
    let tres = await db.collection(TOKEN).doc('access_token').get();
    access_token = tres.data.value;
    console.log(access_token)
  } catch (error) {
    console.log('--无token记录--')
    return {
      errCode:-1,
      errMsg:'数据库中无TOKEN信息'
    }
  }

参考文档 【1】公众平台/小程序服务端API的access_token的内部设计 | 微信开放社区 (qq.com) 【2】auth.getAccessToken | 微信开放文档 (qq.com) 【3】微信小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等) - Kindear - 博客园 (cnblogs.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信开发如何保证access_token/jsapi_ticket长期有效
为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。
似水的流年
2018/01/14
1.2K0
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数据。本文以小程序云开发使用百度API接口为例,介绍access_token定时刷新和请求机制。
Kindear
2020/03/19
1.6K0
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
微信开发获取AccessToken的方式
对于暂时没有这些权限的微信公众号,开发者可以申请测试账号来体验和测试微信公众平台的所有高级接口功能
SmileNicky
2019/01/17
2K0
WxJava | weixin-java-mp组件核心源码剖析+access_token管理的最佳实践
在微信公众号管理平台建设中,主要涉及两个场景: 1、调微信API执行相关操作 2、接收微信的回调并执行相关操作。
烟雨平生
2023/11/07
4.9K0
WxJava | weixin-java-mp组件核心源码剖析+access_token管理的最佳实践
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.4K4
微信小程序 接口调用讲解 (AccessToken、小程序码登录)
♘ 通过微信小程序实现扫码登录 ♘【网页版】使用小程序码登录 ♘ 通过扫小程序码实现网站登录功能
泥豆芽儿 MT
2022/05/10
18.9K0
微信小程序 接口调用讲解 (AccessToken、小程序码登录)
独立开发微信公众号服务的一次复盘
上篇文章主要分享了异步编程的一些经验。主要包括回调函数,发布订阅,Promise,async await以及yield关键字。
terrence386
2022/07/14
4560
独立开发微信公众号服务的一次复盘
微信小程序 ---- 从短信、邮件、微信外网页等场景打开小程序
测试地址 复制地址到短信、邮件、或者其他浏览器:http://read.yajunliang.com/quanyi 1. 文档 《URL Scheme打开小程序》 2. 《获取 access_t
Rattenking
2021/02/01
2.2K0
使用laf云函数进行微信公众号全局access_token缓存
平时会用laf云做一些小工具,最近在做公众号相关调研时遇到了缓存token的问题,每天只允许调用2000次,所以需要将公众平台的API调用所需的access_token缓存下来。
薛定喵君
2023/07/24
3980
.Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
  因为接下来会有几篇关于微信JS-SDK功能使用的文章,主要会对微信分享,获取设备信息,获取地理位置,微信扫一扫这几个功能进行讲解。而这几个功能都是围绕着微信JS-SDK实现的,首先使用微信JS-SDK时我们需要生成对应的配置信息,才能够成功的调用微信JS-SDK。看了下微信官方文档对于accessToken和jsapi_ticket的生成示例代码并没有看到咱们大.Net的,所以为了帮助那些刚接触微信开发的同学,在这里我会把自己在使用微信JS-SDK的一些步骤和配置信息生成的方法展示出来,希望能够和大家相互学习共同进步。
追逐时光者
2019/08/28
2.2K0
.Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
koa框架实现的刷新微信全局access_token服务
使用node的request库请求微信接口,将获取的token及设定的有效期存入本地json文件 请求时判断当前时间是否在设定的有效期(这里暂定为1小时)内,有效则返回缓存在json文件的token,无效则重新请求微信接口返回token并写入本地json
薛定喵君
2020/05/28
1K0
koa框架实现的刷新微信全局access_token服务
【微信生态圈】微信体系中的access_token有哪些?
access_token是公众号/小程序的全局唯一接口调用凭据,公众号/小程序调用各接口时都需使用access_token。开发者需要进行妥善保存。 access_token的存储至少要保留512个字符空间。 access_token的有效期目前为2个小时,需定时刷新。
烟雨平生
2023/09/22
9160
【微信生态圈】微信体系中的access_token有哪些?
【愚公系列】2022年09月 微信小程序-微信小程序实现网页一键登录功能
如果微信小程序要获取微信登录的用户信息,需要拿到code去后台换取用户信息,具体步骤又如下:
愚公搬代码
2022/10/05
1.7K0
微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以。
全栈程序员站长
2022/09/06
3K0
微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
手把手做一个公众号GPT智能客服(三)客服消息
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html
Maynor
2023/09/28
3380
微信小程序模板消息实现(PHP+ 小程序)
参考官方文档和部分资料,总结小程序模板消息推送以及相关注意事项,楼主踩过的坑,特来与大家分享。
ITer.996
2019/08/28
6K0
微信小程序模板消息实现(PHP+ 小程序)
微信个人公众号开发--(5)获取Token并自定义菜单
微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 access_token是公众号的全局唯一票据,公众号
浩Coding
2019/07/02
1.3K0
微信个人公众号开发--(5)获取Token并自定义菜单
聊聊微信分享的前端实现
之前对分享功能的实现也知道个七七八八,但一直没有在业务中实现过。今年参与的盲盒类产品正好用到了分享功能,包括:
前端森林
2022/01/24
1.7K0
聊聊微信分享的前端实现
access_token获取和缓存进行2小时刷新
做微信相关开发,基本上离不开access_token,只要是使用它的资源类api基本上必不可少,之前都是直接存进数据库了,但随着做的产品过多,使用数据库得办法很累赘,所以直接使用php函数进行处理,更方便。
许坏
2019/07/09
1.6K0
access_token获取和缓存进行2小时刷新
php实现微信小程序消息通知「建议收藏」
接入消息通知指引地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/callback_help.html
全栈程序员站长
2022/09/29
2.2K0
php实现微信小程序消息通知「建议收藏」
推荐阅读
相关推荐
微信开发如何保证access_token/jsapi_ticket长期有效
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验