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 相关文章推荐
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
详解iframe与frame的区别
Jan 13 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
Mar 22 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
Apr 29 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
IntelliJ IDEA 安装vue开发插件的方法
Nov 21 Javascript
jQuery选择器之层次选择器用法实例分析
Feb 19 jQuery
js实现录音上传功能
Nov 22 Javascript
vue在响应头response中获取自定义headers操作
Jul 24 Javascript
vue 实现element-ui中的加载中状态
Nov 11 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的socket通信原理
2016/12/03 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
python实现数据图表
2017/07/29 Python
浅析python协程相关概念
2018/01/20 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
python实现控制台输出颜色
2021/03/02 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
某科技软件测试面试题
2013/05/19 面试题
应用心理学个人求职信范文
2013/12/11 职场文书
高中生职业规划范文
2014/03/09 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python