node搭建微信平台(三)-获取access_token
2016-12-07 11:50
411 查看
这篇文章我们就说说node是如何获取access_token的。
我们先说说根据微信公众平台文档获取access_token 的具体步骤。
首先我们需要appID, appsecret这两个信息。
接着我们根据官方文档给的API的连接来获取access_token.(https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET)
但是我们获取的access_token是有一个时间限制的7200秒,而且每天获取上线一般是2000次,如果我们一直重复调用的话,这肯定是不够的,所以我们需要将access_token 存储在文件夹或者是数据库中,这样我们在调用的时候就可以判断,如果这个access_token 没有过期的话,我们就接着调用上一次获取到的access_token,那么我们就需要通过代码来实现这个逻辑,现在我们不妨先想想要实现这个逻辑我们应该怎么办?
首先我们需要获取一下以前获取到的access_token,这个时候我们就需要一个getAccessToken函数,在实现这个函数的时候我们先是需要判断以前的access_token是否过期的函数isValidAccessToken()如果没有过期,我们就把以前存的access_token取出来即可。如果access_token已经过期,那么我们就需要一个updateAccessToken函数来新生成一个access_token,生成之后我们把它存储起来,又需要一个函数saveAccessToken来进行存储。下面我们就通过代码来看看是如何实现的。
先是入口文件app.js:
下面是wechat/g.js的代码:
还有辅助代码libs/util.js代码:
我们先说说根据微信公众平台文档获取access_token 的具体步骤。
首先我们需要appID, appsecret这两个信息。
接着我们根据官方文档给的API的连接来获取access_token.(https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET)
但是我们获取的access_token是有一个时间限制的7200秒,而且每天获取上线一般是2000次,如果我们一直重复调用的话,这肯定是不够的,所以我们需要将access_token 存储在文件夹或者是数据库中,这样我们在调用的时候就可以判断,如果这个access_token 没有过期的话,我们就接着调用上一次获取到的access_token,那么我们就需要通过代码来实现这个逻辑,现在我们不妨先想想要实现这个逻辑我们应该怎么办?
首先我们需要获取一下以前获取到的access_token,这个时候我们就需要一个getAccessToken函数,在实现这个函数的时候我们先是需要判断以前的access_token是否过期的函数isValidAccessToken()如果没有过期,我们就把以前存的access_token取出来即可。如果access_token已经过期,那么我们就需要一个updateAccessToken函数来新生成一个access_token,生成之后我们把它存储起来,又需要一个函数saveAccessToken来进行存储。下面我们就通过代码来看看是如何实现的。
先是入口文件app.js:
'use strict' var Koa = require('koa')//我们用的是koa框架,所以先要把koa给导进来 var path = require('path')//我们用文件来存储access_token所以需要把path模块导入进来 var wechat = require('./wechat/g')//这个是微信获取access_token的代码逻辑 var util = require('./libs/util')//这个辅助代码的实现 //在这里我们需要新建一个文件夹config,里面新建一个wechat.txt var wechat_file = path.join(__dirname, './config/wechat.txt') //这个是配置文件 var config = { wechat: { appID: 'wx5aa48e96c3571a1a', appSecret: '3a6e13093a6c0fa18be70ba2a32fe1b0', token: 'vhmake', getAccessToken: function () { //通过这个来实现获取access_token return util.readFileAsync(wechat_file) }, saveAccessToken: function (data) { data = JSON.stringify(data) //通过这个来保存access_token return util.writeFileAsync(wechat_file,data) } } } var app = new Koa()//实例化框架 app.use(wechat(config.wechat))//调用中间件,来实现里面的微信逻辑 app.listen(8080)//监听8080端口,来启动程序 console.log('Listening is 81080')
下面是wechat/g.js的代码:
'use strict' var sha1 = require('sha1'); var Promise = require('bluebird');//导入这个模块来调用Promise,来实现数据继续往下传 var request = Promise.promisify(require('request'));//因为我们用到了Promise,所以在调用request的时候需要这样导入 var prefix = 'https://api.weixin.qq.com/cgi-bin/';//因为这一部分API是固定的,所以我们单独拿出来 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; //按照上面我们讲的逻辑来实现getAccessToken this.getAccessToken() .then(function (data) { try { data = JOSN.parse(data); } catch(e) { return that.updateAccessToken(); } 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; return new Promise(function (resolve, reject) { request({url: url, json: true}, function (error, response, body) { if (!error && response.statusCode === 200) { var data = body; var now = (new Date().getTime()); var expires_in = now + (data.expires_in - 20) * 1000; data.expires_in = expires_in; resolve(data); console.log(data); } else { reject() } }); }) } module.exports = function (opts) { var wechat = new Wechat(opts);//我们实例化一下Wechat,就可以在中间件中直接调用了 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 + ''; } else { this.body = 'wrong'; } } }
还有辅助代码libs/util.js代码:
'use strict' var fs = require('fs')//因为我们需要对文件来进行操作,所以导入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, content) { if (err) reject(err) else resolve() }) }) }
相关文章推荐
- 【Node.js 微信公众号实战】2.Node.js access_token的获取、存储及更新
- 微信公众号的搭建-第四天(2)-获取并缓存access_token
- 微信公众号开发-开发环境搭建并通过java代码获取微信access_token
- 详解Node.js access_token的获取、存储及更新
- 微信平台开发者 获取access_token
- 微信asp+sqlser开发实例——获取access_token
- 微信开发者-主动请求-实际开发-(3)获取access_token(C#)
- php微信2 获取自定义菜单中的access_token
- 百度PCS快速获取access_token的方法
- 新浪微博Android开发获取Access_token的步骤
- C#微信公众平台开发—access_token的获取存储与更新
- php微信2 获取自定义菜单中的access_token
- 模拟登录获取新浪微博的access_token
- 百度PCS快速获取access_token的方法
- 关于新浪微博获取access_token
- 微信开发-获取access_token
- java微信接口之——获取access_token
- 用户名_密码获取Access_Token
- 新浪开放平台---用code获取access_token(oauth2)
- 微信公众账户的开发者模式(一) 部分细节access_token的获取等