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);
  • 相关阅读:
    delphi 随意将函数执行权限提高到Ring0源代码
    delphi 使电脑睡眠代码
    delphi 监控文件系统
    在Delphi中使用系统对应文件类型的图标
    Panel
    delphi 读写记录类型文件Record
    C# winform 一次只能允许一个应用(使用mutex)
    winform捕获全局异常
    观察者模式实践-实现winform 窗体之间传值(事件实现)
    在wpf中利用异步lambda编程,模拟数据库连接,防止界面假死
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/10196102.html
Copyright © 2011-2022 走看看