使用 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);

 

posted @ 2018-12-29 15:10  吃饭睡觉打豆豆o  阅读(815)  评论(0编辑  收藏  举报