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 相关文章推荐
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
jQuery判断iframe中元素是否存在的方法
May 11 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
深入学习JavaScript对象
Oct 13 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
Apr 19 Javascript
详解webpack的proxyTable无效的解决方案
Jun 15 Javascript
vue 设置路由的登录权限的方法
Jul 03 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 Javascript
Javascript中window.name属性详解
Nov 19 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
PHP4引用文件语句的对比
2006/10/09 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
py中的目录与文件判别代码
2008/07/16 Python
Python判断操作系统类型代码分享
2014/11/22 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
快速创建python 虚拟环境
2020/11/28 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
思想汇报范文
2013/11/04 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
务虚会发言材料
2014/12/25 职场文书
单独二胎证明
2015/06/24 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
redis数据一致性的实现示例
2022/03/18 Redis
CSS的calc函数用法小结
2022/06/25 HTML / CSS