node.js 微信开发之定时获取access_token


Posted in Javascript onFebruary 07, 2020

什么是access_token

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效

当你的多个微信开发相关服务并存时,多个服务各自去获取 access_token ,最后导致其中一些服务会不能正常访问.
所以这种情况下,应该设置一个获取 access_token 的中控服务器.
因为 access_token 的有效期为 2个小时,
所以你的中控服务器必须能够定时去拉取最新的 access_token .

下面我们设置一个非常简单的中控服务器

此中控服务器需要有以下几个特点:

1.可以定时执行
2.拉取到最新 access_token 可以持久化
3.持久化的access_token 可以被其他相关服务访问到.

node.js下定时任务

我们采用 node-schedule

npm install node-schedule --save

schedule.scheduleJob(A,B)

scheduleJob 方法接收2个参数, A 为日期规则 (多长时间执行)   B 为回调方法 (当日期符合条件时,将要做什么)

先来看下参数 A :

##六颗星方式

‘* * * * * *'

┬     ┬    ┬    ┬    ┬    ┬
│    │    │    │    │     |
│    │    │    │    │    └ 星期几 (0 - 7) ( 0 或者 7 表示星期日 )
│    │    │    │    └───── 月份 (1 - 12)
│    │    │    └────────── 日期 (1 - 31)
│    │    └─────────────── 小时 (0 - 23)
│    └──────────────────── 分钟 (0 - 59)
└───────────────────────── 秒 (0 - 59)

下面用此方式我们约定在 8月30日0点0分0秒 执行程序.
对应的参数A 设置如下:
‘0 0 0 30 8 *'

var m= schedule.scheduleJob('0 0 0 30 8 *',function(){
  getToken();
});

上面的 getToken() 是我自定义的一个获取微信 access_token 的方法,下面会有说明.

设置每30秒执行一次定时任务
‘30 * * * * *'

设置每1分30秒执行一次任务
‘30 1 * * * *'

设置凌晨0点1分30秒执行任务
‘30 1 0 * * *'

RecurrenceRule 方式

//定义一个时间规则
var rule = new schedule.RecurrenceRule();
  // rule.dayOfWeek = 0;
  // rule.month = 0;
  // rule.dayOfMonth = 0;
  // rule.hour = 0;
  // rule.minute = 0;
  rule.second = 0;
  
schedule.scheduleJob(rule, function(){
    getToken();
});

创建了一个 RecurrenceRule 对象,它有6个属性,分别对应 星期,月份,日期,小时,分钟,秒
通过各个参数来设置你的时间规则器.

上面介绍了  node.js 下使用 node-schedule 来执行定时任务,下面我们来看下如何获取微信 access_token

获取微信 access_token

GET 请求方式:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}

注意上面的 {APPID} 和 {APPSECRET} 要登录微信公众后台获取.

下面我们使用 request 来提交一个get 请求即可:

npm install request --save

我们还用到了 redis , npm install redis --save

var client=redis.createClient({
  "host":"127.0.0.1",
  "port":"6379"
});

var getToken=function(){
var url=util.format('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s',wechat.appid,wechat.secret);

  request(url,function(error, response, body){

    if (!error && response.statusCode == 200) {
      var bodyToken=JSON.parse(body);
      if(bodyToken&&bodyToken.access_token){
        setToken(bodyToken.access_token);
      }
    }
  })
}

var setToken=function(token){
  if(token){
    client.set("YG-WECHAT-TOKEN",token);
  }
}

每小时执行一次定时任务 getToken()
拿到最新 access_token 后存储在 redis 中,key 为 YG-WECHAT-TOKEN

获取 access_token

上面的流程我们已经每小时让定时任务拿到了最新的 access_token,并且持久化到了 redis 中.
其他服务如何获取 access_token 呢?
直接连接 redis 服务,根据 key 获取对应的 token.
当然你也可以写一个统一的接口,通过接口拿到 access_token.

Javascript 相关文章推荐
javascript列表框操作函数集合汇总
Nov 28 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
JQuery中的事件及动画用法实例
Jan 26 Javascript
浅谈javascript的调试
Jan 28 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
Bootstrap fileinput文件上传组件使用详解
Jun 06 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
jQuery操作选中select下拉框的值代码实例
Feb 07 #jQuery
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 #Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 07 #Javascript
vue-cli设置css不生效的解决方法
Feb 07 #Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 #Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 #Javascript
JavaScript实现Excel表格效果
Feb 07 #Javascript
You might like
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
PHP实现的日历功能示例
2018/09/01 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
图解javascript作用域链
2019/05/27 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
Python fileinput模块使用实例
2015/05/28 Python
详解python进行mp3格式判断
2016/12/23 Python
matplotlib绘制动画代码示例
2018/01/02 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
QML使用Python的函数过程解析
2019/09/26 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
火车的故事教学反思
2014/02/11 职场文书
大专生找工作自荐书
2014/06/10 职场文书
横幅标语大全
2014/06/17 职场文书
酒后驾车标语
2014/06/30 职场文书
新闻人物通讯稿
2014/10/09 职场文书
2014年财务科工作总结
2014/11/11 职场文书
慈善募捐倡议书
2015/04/27 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
如何在Python中创建二叉树
2021/03/30 Python
OpenCV全景图像拼接的实现示例
2021/06/05 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL