定时排程刷新微信access-token
微信公众号开发中最常遇到的就是调用接口时候需要有API的access-token(非网页授权的access-token),有了这个token之后,才可以发生模板消息等。
这里的做法主要是用nodejs的later模块是实现每隔一个小时去微信上刷新一次token,获取到最新的access-token之后保存到数据库之中。其他的业务需要用到这个token,再去数据库中抓取最新的access-token。
WechatTokenTask.js代码如下:
var later = require('later'),
mysql = require('mysql'),
https = require('https'),
moment = require('moment'); var connection = mysql.createConnection({
host: '112.74.***.*',
port: 3306,
user: 'root',
password: '****',
database: 'lz***'
}); var appid = "wx082bc0*********",
appsecret = "d3c24a08d03b4*****************"; // will fire every 5 minutes
//var textSched = later.parse.text('every 1 min');
var textSched = later.parse.cron('0 */1 * * *');
//var textSched = later.parse.text('every 1 hours');
//var occurrences = later.schedule(textSched).next(10); //for (var i = 0; i < 10; i++) {
// console.log(occurrences[i]);
//} // execute logTime for each successive occurrence of the text schedule
later.setInterval(dotask, textSched); setTimeout(dotask, 100);//fire when app start run function dotask() {
var options = {
hostname: 'api.weixin.qq.com',
path: '/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + appsecret
};
var req = https.get(options, function (res) {
//console.log("statusCode: ", res.statusCode);
//console.log("headers: ", res.headers);
var bodyChunks = '';
res.on('data', function (chunk) {
bodyChunks += chunk;
}).on('end', function () {
var body = JSON.parse(bodyChunks);
//console.dir(body);
if (body.access_token) {
var access_token = body.access_token;
saveAccessToken(access_token);
//console.log(access_token);
} else {
console.dir(body);
}
})
}); req.on('error', function (e) {
console.log('ERROR: ' + e.message);
});
} /* Save access token to DB*/
function saveAccessToken(accessToken) {
var postData = {
AccessToken: accessToken,
Date: moment().format('YYYY-MM-DD HH:mm:ss')
}; connection.connect();
connection.query('INSERT INTO `WeChatToken` SET ?', postData, function (err, result) {
// Neat!
if (err) {
console.log(JSON.stringify(err));
connection.end();
} if (result && result.affectedRows == 1) {
console.log("success");
}
});
connection.end();
}
table scheme如下:
CREATE TABLE `WeChatToken` (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`Date` DATETIME NOT NULL ,
AccessToken VARCHAR(255) NOT NULL
) ;
业务里可以用通过以下语法获取最新有效的access-token
SELECT AccessToken FROM WeChatToken ORDER BY Id DESC LIMIT 1;
该服务发布在CentOS 7, 用PM2管理。
pm2 start lzone6/WechatTokenTask.js -i 1 --name GetTokenService
定时排程刷新微信access-token的更多相关文章
- 微信Access Token 缓存方法
微信Access Token默认缓存是2小时,但是需要特别强调,微信服务号和微信企业号缓存并不相同. (1)微信公众号号:每次Http请求Access Token 系统会返回不同的Token,并附带超 ...
- 微信公众平台开发(112) 自动更新微信access token
关键字:Memcache access_token 更新 存储 7200 本文介绍如何存储及更新 access token的方法. 一.Access Token access_token是公众号的全局 ...
- 使用缓存Memcache存储更新微信access token
关键字:Memcache access_token 更新 存储 7200 本文介绍如何使用缓存Memcache存储及更新 access token的方法. 一.Access Token access_ ...
- 微信access token过期
两台服务器使用同一个微信账号(同一个app id) 时,当其中一台服务器向微信请求access token时,会造成另一台服务器的access token过期
- C# v3微信 access token 过期处理的问题
//记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...
- 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单
1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...
- 微信公众平台开发 ACCESS TOKEN
获取access token 返回 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将 ...
- iOS实现OAuth2.0中刷新access token并重新请求数据操作
一.简要概述 OAuth2.0是OAuth协议的下一版本,时常用于移动客户端的开发,是一种比较安全的机制.在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的r ...
- OAuth 白话简明教程 4.刷新 Access Token
转自:http://www.cftea.com/c/2016/11/6705.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...
随机推荐
- 在本地调试微信项目(C#)
之前一人负责微信的项目,那时2014年LZ还没毕业..啥都不懂,为此特别感谢@SZW,没有你的框架,我可能都无从下手 当时做项目最麻烦的就是调试,因为很多页面都要使用 网页授权获取用户信息 在电脑上打 ...
- asp.net 页面上传文件控件后台代码Request.Files获取不到
今天开发中遇到页面文件上传控件选择了文件,而后台Request.Files.Count取值为0,之前开发中遇到过几次,老是忘掉,今天记下来. html: <input type="fi ...
- Python学习笔记5(字符串与正则表达式)
1.字符串 1.1字符串的格式化 #格式化语法 "%s" % str1 "%s %s" % (str1,str2) #格式化字符串 str1 = "v ...
- 简单的php数据库操作类代码(增,删,改,查)
这几天准备重新学习,梳理一下知识体系,同时按照功能模块划分做一些东西.所以.mysql的操作成为第一个要点.我写了一个简单的mysql操作类,实现数据的简单的增删改查功能. 数据库操纵基本流程为: 1 ...
- Sumblime Text 2 常用插件以及安装方法
1.直接安装 安装Sublime text 2插件很方便,可以直接下载安装包解压缩到Packages目录(菜单->preferences->packages). 2.使用Package C ...
- dede调用指定栏目的标签
{dede:type typeid='1'} <a href="[field:typelink /]">[field:typename /]</a> {/d ...
- php在cli和cgi方式下获取服务器ip的实例
php cli方式下获取服务器ip php内核没有提供这样的命令,需要借助linux中的命令ifconfig来实现,如下两个函数代码: function getServerIp(){ ...
- arcpy批量打印地图
有个处理数据的需求是把一个图层中的要素单独显示在底图上,设置固定的比例尺,并打印出图片. 考虑到后续会有重复的大量的数据要处理,决定使用arcpy处理. 首先新建一个mxd底图文档,把需要打印的地图都 ...
- php 中const和 define的区别
在php中定义常量时,可用到const与define这两种方法,那他们到底有什么区别呢? 1.const用于类成员变量的定义,一经定义,不可修改.define不可用于类成员变量的定义,可用于全局常量. ...
- 开心菜鸟系列学习笔记------javascript(4)
一.全局上下文中的变量对象: 1)全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象:这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的 ...