zoukankan      html  css  js  c++  java
  • 使用 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);
  • 相关阅读:
    Python 写Windows Service服务程序
    关于Python 获取windows信息收集
    Pyqt 获取windows系统中已安装软件列表
    Python 打开目录与指定文件
    【转载】Pyqt 编写的俄罗斯方块
    Python win32api提取exe图标icon
    Pyqt QListWidget之缩略图列表
    Pyqt 时时CPU使用情况
    Python 的三目运算
    Chrome Crx 插件下载
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/10196102.html
Copyright © 2011-2022 走看看