微信公众号开发中最常遇到的就是调用接口时候需要有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. Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能

    AutoCompleteTextView 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开 ...

  2. 关于asp:login控件和验证码的问题?(转)

    1.验证码页面添加.2.将这验证码页面添加到login控件中:拖曳一Login控件,将之切换到模式下,在Html源文件中在表格中密码那行后添加: <tr>    <td style= ...

  3. 1.jdk、Tomcat、solr的安装和配置

    1.jdk安装和配置 1)根据电脑类型,到官网下载相应的jdk版本 2)双击jdk-8u5-windows-x64.exe安装包,一直点下一步就可以了,注意记住jdk和jre的安装目录. 3)环境变量 ...

  4. Highcharts属性

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. SQL Server -SET ANSI_NULLS

    当ANSI_NULLS 为ON时,遵循SQL92的标准,只能使用IS NULL 来判断值是否为NULL, 而不能使用=或<>来与NULL做比较,任何值包括NULL值与NULL值做=或< ...

  6. ES6 let和const命令

    一.let定义变量 { let a = 1;} console.log(a);只在let所在的代码块有效,console的结果是a is not defined,报错. 不存在var的变量提升,即使用 ...

  7. Windows7上FTP服务器建立

    1. FTP服务器建立 注意:千万不能使用FTP和ftp建立用户,否则无法登陆ftp服务器. 1.1本地机器上创建一个用户 这个用户是用来登录到FTP的.我的电脑右键->管理->本地用户和 ...

  8. Unity3D自定义地形的笔刷,刷出别样地形

    ​ 是不是很简单呀,大家可以发挥想象刷出特殊的地形,小鸡呀,或者其他的logo之类(顶视图看上去效果很棒)的地形. 最后把我找的笔刷上传,Gizmos 注意: 如果文件夹及图片导入后,地形系统的笔刷无 ...

  9. ASP.NET用户自定义控件配置

    一直以来开发中碰到要写自定义控件的时候总是习惯性的找度娘,而没有自己记住,结果今天就悲剧了,找了半天才找到,想想还是自己积累起来吧! 第一种配置方式: 配置写在webconfig文件中,位置如下: w ...

  10. Java程序员需要学习的知识点

    Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你 ...