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实现TCP服务端的并发
    python程序中的线程操作
    jmeter命令行执行脚本_动态参数设置
    App客户端性能测试点总结
    App功能测试点总结
    jmeter中生成UUID作为唯一标识符
    Python Unittest进行接口测试的简单示例
    jmeter接口测试中的用例数据分离
    博客园看板娘的简单添加
    (转)后端服务性能压测实践
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/10196102.html
Copyright © 2011-2022 走看看