广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >小程序开发实现access_token统一管理
  • 681
分享到

小程序开发实现access_token统一管理

2024-04-02 19:04:59 681人浏览 独家记忆
摘要

目录TOKEN 定时刷新器二、access_token的内部设计2.1 access_token的时效性2.2 access_token 的逐渐失效性三、access_token的统

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

的逐渐失效性。

实现的原理是:

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

从上图需要注意的几点:

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

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

三、access_token的统一管理

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

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

index.js 请求并更新access_token

如果在其他端,需要传入APPID


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 定时触发器

每小时触发一次


{
  "triggers": [
    {
      "name": "myTrigger",
      "type": "timer",
      "config": "0 0 * * * * *"
    }
  ]
}

timeutil.js 时间工具


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 查询使用


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)

到此这篇关于小程序开发实现access_token统一管理的文章就介绍到这了,更多相关小程序 access_token统一管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 小程序开发实现access_token统一管理

本文链接: https://www.lsjlt.com/news/130350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 小程序开发实现access_token统一管理
    目录TOKEN 定时刷新器二、access_token的内部设计2.1 access_token的时效性2.2 access_token 的逐渐失效性三、access_token的统...
    99+
    2022-11-12
  • 小程序开发怎么实现token统一管理
    这篇文章主要讲解了“小程序开发怎么实现token统一管理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序开发怎么实现token统一管理”吧!TOKEN 定时刷新器一、背景对于使用过公众平...
    99+
    2023-06-08
  • 微信小程序开发之实现一个跑步小程序
    目录地图组件当前位置开始跑步按钮GPS定位设置前后台允许获取定位开启前后台定位绘制路线自己动手实现一个跑步小程序 用到的方法:wx.onLocationChange,监听实时地理位置...
    99+
    2022-11-13
  • 摇一摇小程序系统如何开发
    这篇文章主要介绍“摇一摇小程序系统如何开发”,在日常操作中,相信很多人在摇一摇小程序系统如何开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”摇一摇小程序系统如何开发”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-26
  • Android开发实现的Log统一管理类
    本文实例讲述了Android开发实现的Log统一管理类。分享给大家供大家参考,具体如下:public class Logger{ private Logger() { throw new UnsupportedOperat...
    99+
    2023-05-30
  • 微信小程序开发session如何管理
    这篇文章主要介绍“微信小程序开发session如何管理”,在日常操作中,相信很多人在微信小程序开发session如何管理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信小程序开发session如何管理”的疑...
    99+
    2023-06-26
  • 智慧物业管理小程序如何开发
    这篇文章主要介绍“智慧物业管理小程序如何开发”,在日常操作中,相信很多人在智慧物业管理小程序如何开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”智慧物业管理小程序如何开发”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-26
  • 微信小程序开发中如何实现仿电影影评小程序开发
    这篇文章将为大家详细讲解有关微信小程序开发中如何实现仿电影影评小程序开发,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  首先如图建立文件夹和page页面  然后app.json页面更新代码如下:  { ...
    99+
    2023-06-26
  • 微信小程序开发之实现食堂点餐系统
    目录一、项目展示二、操作流程和核心代码三、效果展示一、项目展示 这是一款娱乐性的小程序 目的是为了解决大学生吃饭的选择困难症 用户可以选择不同的院校 并设置不同餐厅的概率 可以随机选...
    99+
    2023-01-14
    微信小程序实现食堂点餐系统 小程序实现食堂点餐系统 小程序点餐系统
  • 物业管理小程序需要开发哪些功能
    这篇文章主要介绍了物业管理小程序需要开发哪些功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。物业管理小程序开发的功能有哪些?社区信息物业会定期更新相关的社区信息,并在线介绍...
    99+
    2023-06-27
  • 酒店管理小程序需要开发哪些功能
    这篇文章主要介绍酒店管理小程序需要开发哪些功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!众所周知,小程序分为前端和后端。前端是给用户看的,展示酒店房间,价格,介绍信息等。后端是给酒店商家看的,用来管理小程序,包括...
    99+
    2023-06-27
  • 微信小程序开发实现轮播图
    小程序,移动端离不开轮播图的功能,下面就写一个小程序的轮播图功能分享给大家 效果图: 1.页面代码 <!--index.wxml--> <view class="...
    99+
    2022-11-13
  • HBuilderX开发一个简单的微信小程序的实现步骤
    目录一、配置二、运行一、配置 在微信开发者工具的设置中开启,如图: 在HBuilderX中新建项目,选择uni-app,如图: 在HBuilderX中编写代码 目录结构如图: ...
    99+
    2022-11-13
  • 小区物业管理小程序开发有哪些功能和好处
    本篇内容介绍了“小区物业管理小程序开发有哪些功能和好处”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、开发一个小区物业管理小程序有什么好处...
    99+
    2023-06-27
  • Android 实例开发一个学生管理系统流程详解
    目录效果演示实现功能总览代码登录与忘记密码界面 一、添加布局文件二、添加标题文字三、绑定适配器注册界面 一、创建两个Drawable文件 二、将其添加数组内三、动态变化背景考勤界面 ...
    99+
    2022-11-12
  • Servlet | Servlet原理、开发第一个带有Java小程序Servlet
    ✅作者简介:一位材料转码农的选手,希望一起努力,一起进步!  📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:Web后端 | Servlet 目录 一:模拟实现Servlet 二:开发第一个带有...
    99+
    2023-09-01
    servlet tomcat java
  • 微信小程序开发之实现记账本
    目录一、项目展示二、首页三、效果图一、项目展示 这是一款简易的记账本小程序 用户可以记录自己平日里的借入和借出的金额 此外可以手动删除记录(右滑记录) 二、首页 首页划分为资产金...
    99+
    2023-01-13
    微信小程序实现记账本 小程序实现记账本 小程序记账本
  • 小程序如何实现客服消息开发
    这篇文章主要为大家展示了“小程序如何实现客服消息开发”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现客服消息开发”这篇文章吧。近日,微信官方小游戏开放客服消息能力,下面是官方开发文档...
    99+
    2023-06-26
  • 利用CRM系统小程序实现业务流程自动化管理
    随着数字化时代的到来,企业管理逐渐从传统的纸张记录转向了信息化管理。在这个过程中,CRM系统作为一种有效的工具,已经广泛应用于企业中。然而,对于许多企业来说,他们还在使用传统的CRM系统,而忽略了其强大的功能,如通过小程序实现业务流程自动化...
    99+
    2023-11-20
    业务流程 程序 系统
  • 物业管理小程序开发需要具备哪些功能
    今天小编给大家分享一下物业管理小程序开发需要具备哪些功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。  物业管理小程序开发...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作