使用 nodeJs 开发微信公众号,获取access_token

要使用微信提供的功能接口,就需要获取到access_token,这是开发公众号必不可少的一部

access_token有效期20分钟,建议保存起来,过期后在重新获取

获取流程如下:

我将微信相关的操作封装在 lib/wechat.js 中,同时在同级目录下新建 token.txt 用于保存获取到的access_token

const wxConfig = require(\'../config/wx.js\')
const fs = require(\'fs\')
const path = require(\'path\')
const sha1 = require(\'sha1\')
const request = require(\'request\')

function Wechat(){
    this.appId = wxConfig.appId,
    this.appSecret = wxConfig.appSecret,
    this.token = wxConfig.token
}

//校验请求是否来自微信
Wechat.prototype.init = function(req, res, next) {
    var token = wxConfig.token
    var signature = req.query.signature
    var nonce = req.query.nonce
    var timestamp = req.query.timestamp
    var echostr = req.query.echostr
    var str = [token, timestamp, nonce].sort().join(\'\')
    var sha = sha1(str)

    if (sha === signature) {
        next()
    }else{
        res.send(\'error\')
    }

};

//获取access_token
Wechat.prototype.getAccessToken = function(){
    var data = fs.readFileSync(path.resolve(__dirname, \'./token.txt\'))
    try{
        accessToken = JSON.parse(data)
        if(accessToken.expires_in > Date.parse(new Date())){
            return Promise.resolve(accessToken.access_token)
        }else{
            //已过期
            return this.updateAccessToken()
        }
    }
    catch(err){
        //文件为空
        return this.updateAccessToken()
    }
}

//从微信重新拉取access_token
Wechat.prototype.updateAccessToken = function(){
    const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${this.appId}&secret=${this.appSecret}`
    // 返回accesstoken格式如下
    // {
    //     "access_token":"string",
    //     "expires_in":7200
    // }
    return new Promise((resolve, reject) => {
        request(url, function(err, response, body){
            var accessToken = JSON.parse(response.body)
            accessToken[\'expires_in\'] = Date.parse(new Date())+((7200 - 20)*1000)
            fs.writeFileSync(path.resolve(__dirname, \'./token.txt\') , JSON.stringify(accessToken))
            resolve(accessToken.access_token)
        })        
    })
}


module.exports = new Wechat()

在app.js中调用wechat.js下的 getAccessToken 方法获取,然后保存在全局对象中,这样其他文件中可以直接调用

var wechat = require(\'./lib/wechat\');
wechat.getAccessToken().then(token => {
    global.accessToken = token
})
//校验请求
app.use(wechat.init);