Nodejs开发微信公众号--获取access_token
為了梳理代碼,我單獨給微信的接口進(jìn)行了一些封裝。這是前面認(rèn)證接口的內(nèi)容。
封裝接口用到了request
npm install --save request封裝的 js 結(jié)構(gòu)大致是這樣的
var request = require('request'); var crypto = require('crypto');function WeChat(config) {this.config = configthis.accessToken = nullthis.getAccessTokenTimer = null }WeChat.prototype.Authenticate = function(req, res) {//1.獲取微信服務(wù)器Get請求的參數(shù) signature、timestamp、nonce、echostrvar signature = req.query.signature,//微信加密簽名timestamp = req.query.timestamp,//時間戳nonce = req.query.nonce,//隨機數(shù)echostr = req.query.echostr;//隨機字符串//2.將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序var array = [this.config.token,timestamp,nonce];array.sort();//3.將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密var tempStr = array.join('');const hashCode = crypto.createHash('sha1'); //創(chuàng)建加密類型 var resultCode = hashCode.update(tempStr,'utf8').digest('hex'); //對傳入的字符串進(jìn)行加密//4.開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信if(resultCode === signature){res.send(echostr);}else{res.send('mismatch');} }module.exports.WeChat = WeChat;扯多了,回到正題access_token
access_token是公眾號的全局唯一接口調(diào)用憑據(jù),公眾號調(diào)用各接口時都需使用access_token。開發(fā)者需要進(jìn)行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
因此,我繼續(xù)封裝了GetAccessToken方法。
WeChat.prototype.GetAccessToken = function() {var self = thislet option = {url: 'https://api.weixin.qq.com/cgi-bin/token',qs: {grant_type: 'client_credential',appid: this.config.App_Id,secret: this.config.App_Secret},method: 'GET',headers: {"content-type": "application/json"}}return new Promise((resolve, reject) => {request(option, function(error, response, body) {console.log(error, body)var data = JSON.parse(body)if (error) {reject(error)} else {switch(data.errcode) {case 45009:console.log('token調(diào)用上限')reject(data)breakcase 0:self.accessToken = {access_token: data.access_token,expires_in: data.expires_in}console.log('當(dāng)前access_token', JSON.stringify(self.accessToken))// 定時重新獲取access_tokenclearTimeout(this.getAccessTokenTimer)this.getAccessTokenTimer = setTimeout(() => {self.GetAccessToken()}, (data.expires_in - 60) * 1000 || 60000)resolve(data)break}}})}) }并在express服務(wù)啟動的時候調(diào)用GetAccessToken,調(diào)用成功后會依據(jù) expires_in 起定時器重新獲取。
var wechat = new WeChat(config) wechat.GetAccessToken().then(success => {console.log('初始化獲取accessToken成功') }, failure => {console.log('初始化獲取accessToken失敗') })2018.10.17
考慮到每次重啟服務(wù)器都會調(diào)用GetAccessToken,會導(dǎo)致頻繁調(diào)用。因此想到一個修改方法,將accessToken作為屬性存在wechat對象中的同時,還將其寫入到本地文件token.json中。這樣服務(wù)器重啟時,就可以先讀取token.json文件中的access_token及expires_in,先判斷是否過期,如果過期了,則直接進(jìn)行access_token更新操作,否則計算出過期時間,用定時器控制在過期時間時進(jìn)行access_token更新操作。
總結(jié)
以上是生活随笔為你收集整理的Nodejs开发微信公众号--获取access_token的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 音视频开发(二):使用
- 下一篇: 新媒体运营教程:如何用直播进行裂变+转化