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 自定义事件初探
Aug 21 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
jQuery不兼容input的change事件问题解决过程
Dec 05 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
iframe中使用jquery进行查找的方法【案例分析】
Jun 17 Javascript
第六篇Bootstrap表格样式介绍
Jun 21 Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 Javascript
ES11屡试不爽的新特性,你用上了几个
Oct 21 Javascript
vue 图片裁剪上传组件的实现
Nov 12 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
php 保留小数点
2009/04/21 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
python查询sqlite数据表的方法
2015/05/08 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
制冷与电控专业应届生求职信
2013/11/11 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
公司仓库管理制度
2015/08/04 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android