曲振飞的个人博客

专注于Web全栈开发、APP设计、网站建设

当前位置 : 主页 > 后端开发 > Node.js获取票据access_token与设置过期值expires_in

Node.js获取票据access_token与设置过期值expires_in

时间:2016-12-16 22:55:49 栏目:后端开发 作者:曲振飞 点击: 186

access_token是微信公众号开发的全局唯一票据,注意以下几点:

1.access_token它每2个小时自动失效,需要重新获取

2.只要更新了access_token,之前那个就不能用了.

3.票据的获取每天上限为2000次

文件目录结构:

blob.png

需要安装的模块:

npm install koa
npm install sha1
npm install bluebird
npm install request
npm install fs

下面写下access_token的获取与处理

app.js 入口文件

'use strict'

var Koa = require('koa');
var wechat = require('./wechat/g');
var util = require('./libs/util');
var path = require('path');
var wechat_file = path.join(__dirname,'./config/wechat.txt');
var config = {
	wechat:{
		appID:'wx5f5185a728bfaec6',
		appSecret:'56fffbc7504c8a302cc9ea4a8a9c8bdc',
		token:'quzhenfei',
		getAccessToken:function(){
			return util.readFileAsync(wechat_file);
		},
		saveAccessToken:function(data){
			data = JSON.stringify(data); //转成字符串
			console.log("saveAccessToken数据:  "+data);
			return util.writeFileAsync(wechat_file,data);
		}
	}
}
var app = new Koa();
app.use(wechat(config.wechat));  //传入配置参数
app.listen(1234);
console.log('start on 1234');

g.js

'use strict'
var sha1 = require('sha1');
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var Promise = require('bluebird');
var request = Promise.promisify(require('request'));
var api = {
	accessToken:prefix+'token?grant_type=client_credential'
}
function WeChat(opts){ // 构造函数
	var that = this;
	this.appID = opts.appID;
	this.appSecret = opts.appSecret;
	this.getAccessToken = opts.getAccessToken; //获取票据
	this.saveAccessToken = opts.saveAccessToken; //存储票据

	this.getAccessToken()
	.then(function(data){
		try{
			data = JSON.parse(data);
		}catch(e){
			return that.updateAccessToken(data); //获取票据失败,返回更新数据
		}
		//如果拿到票据 判断其合法性 是否在有效期.
		if (that.isValidAccessToken(data)) {
			Promise.resolve(data); //将这个票据传递下去
		}else{
			return that.updateAccessToken();
		}
	})
	.then(function(data){ //此时拿到一个合法的票据
		that.access_token = data.access_token;
		that.expires_in = data.expires_in; //拿到一个过期的字段
		that.saveAccessToken(data);
	})
}
//票据验证方法
WeChat.prototype.isValidAccessToken = function(data){
	if(!data || !data.access_token || !data.expires_in){
		return false;
	}
	var access_token = data.access_token;
	var expires_in = data.expires_in;
	var now = (new Date().getTime());
	if (now < expires_in) { //判断当前时间是否小于 过期时间
		return true;
	}else{
		return false;
	}
}
//票据更新方法
WeChat.prototype.updateAccessToken = function(){
	var appID = this.appID;
	var appSecret = this.appSecret;
	// 请求票据的地址
	var url = api.accessToken + '&appid=' + appID +'&secret='+appSecret;
	//request 也是对http get post 封装好的一个库 
	return new Promise(function(resolve,reject){
		request({url:url,json:true}).then(function(response){
			var data = response.body;
			var now = (new Date().getTime());
			//生成一个新的过期时间
			//让这个票据提前20秒刷新 考虑到网络延迟,服务器的计算时间
			var expires_in = now + (data.expires_in - 20)*1000;
			data.expires_in = expires_in; //把新的这个票据时间 赋给这个data对象
			resolve(data);
		})
	});
}
/*
* 这个中间件是用来处理事件 推送的数据 用来返回信息
* var wechat = new WeChat(opts); wechat这个实例用来管理和微信的接口,票据的更新、票据的存储、并且拿到
*最新票据
* 对他进行一个有效信息的检查。
*/
module.exports = function(opts){
	//初始化构造函数
	var wechat = new WeChat(opts);
	return function *(next){
		console.log(this.query);
		var token = opts.token;
		var signature = this.query.signature;
		var nonce = this.query.nonce;
		// 时间戳
		var timestamp = this.query.timestamp;
		var echostr = this.query.echostr;
		//字典排序
		var str = [token,timestamp,nonce].sort().join('');
		//加密
		var sha = sha1(str);
		//判断加密后的值 是否等于签名值
		if (sha === signature) {
			this.body = echostr + '';
			console.log('echostr: '+echostr);
		}else{
			this.body = 'wrong';
			console.log('wrong');
		}
	}
}

util.js 通过fs模块实现对access_token票据进行读取和写入

'use strict'

var fs = require('fs');
var Promise = require('bluebird');
exports.readFileAsync = function(fpath,encoding){
	return new Promise(function(resolve,reject){
		fs.readFile(fpath,encoding,function(err,content){
			if(err){
				reject(err);
			}else{
				resolve(content);
			}
		});
	});
}
exports.writeFileAsync = function(fpath,content){
	return new Promise(function(resolve,reject){
		fs.writeFile(fpath,content,function(err){
			if(err){
				reject(err);
			}else{
				resolve();
			}
		});
	});
}


关键字: 票据,access_token

关于站长

曲振飞,一个热忠、从事于互联网的90后青年.专注于网站建站、网站设计及优化.以用户体验、WEB标准为主旨,将网站的整体设计与网页设计的相关原理紧密结合.