微信公众号开发中最常遇到的就是调用接口时候需要有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的更多相关文章

  1. 微信Access Token 缓存方法

    微信Access Token默认缓存是2小时,但是需要特别强调,微信服务号和微信企业号缓存并不相同. (1)微信公众号号:每次Http请求Access Token 系统会返回不同的Token,并附带超 ...

  2. 微信公众平台开发(112) 自动更新微信access token

    关键字:Memcache access_token 更新 存储 7200 本文介绍如何存储及更新 access token的方法. 一.Access Token access_token是公众号的全局 ...

  3. 使用缓存Memcache存储更新微信access token

    关键字:Memcache access_token 更新 存储 7200 本文介绍如何使用缓存Memcache存储及更新 access token的方法. 一.Access Token access_ ...

  4. 微信access token过期

    两台服务器使用同一个微信账号(同一个app id) 时,当其中一台服务器向微信请求access token时,会造成另一台服务器的access token过期

  5. C# v3微信 access token 过期处理的问题

    //记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...

  6. 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单

    1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...

  7. 微信公众平台开发 ACCESS TOKEN

    获取access token 返回 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将 ...

  8. iOS实现OAuth2.0中刷新access token并重新请求数据操作

    一.简要概述 OAuth2.0是OAuth协议的下一版本,时常用于移动客户端的开发,是一种比较安全的机制.在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的r ...

  9. OAuth 白话简明教程 4.刷新 Access Token

    转自:http://www.cftea.com/c/2016/11/6705.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

随机推荐

  1. CSS---------------之文本颜色

    CSS2支持如下名字的颜色 注意点: 你的浏览器有可能支持更多名字,但是在实际用的过程中尽量少使用名字的,因为各个浏览器对颜色的会存在差异:查看颜色可以参考 对于更多地颜色,你可以使用代表红,绿,蓝三 ...

  2. Git应用于Android项目的入门知识:我的理解

    Git应用于Android项目的基本知识.     常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要.     repo是Go ...

  3. mysql截取字符串

    mysql 字符串截取1.从左开始截取字符串left(str,length)被截取字段,截取长度select left('admin1213',5) from table 2.从右开始截取字符串rig ...

  4. django中使用json.dumps处理数据时,在前台遇到字符转义的问题

    django后台代码: import json ctx['dormitory_list'] = json.dumps([{", "is_checked": 1}, {&q ...

  5. Super Jumping! Jumping! Jumping!(hdu 1087 LIS变形)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  6. hdu 1428 漫步校园

    http://acm.hdu.edu.cn/showproblem.php?pid=1428 dijstra+dp; #include <cstdio> #include <queu ...

  7. 电子工程师名片——SPI NOR Flash

    使用了MX25L512的SPI接口的Flash 电路连接图: 总的大小512kb,即64kB,sector的大小为256 Bytes,block的大小为4k Bytes 调试时出现的问题: 1.Fla ...

  8. 原创:应用串行NOR闪存提升内存处理能力

    在嵌入式系统中,NOR闪存一直以来仍然是较受青睐的非易失性内存,NOR器件的低延时特性可以接受代码执行和数据存储在一个单一的产品.虽然NAND记忆体已成为许多高密度应用的首选解决方案,但NOR仍然是低 ...

  9. 点击Winform右下角图标,在最前端展示窗口

    //调用Windows API 展示窗口到最前端 SwitchToThisWindow(this.Handle, true);//窗体的句柄 this.Handle     SwitchToThisW ...

  10. android 控件的移动

    android 控件的移动 1. Java代码 imagebutton.setOnTouchListener(newOnTouchListener(){ int[]postion=newint[]{0 ...