美文网首页技术干货让前端飞
Node.js 轻松搞定微信 access_token ( js

Node.js 轻松搞定微信 access_token ( js

作者: ELSS | 来源:发表于2017-09-29 20:17 被阅读0次

    access_token

    微信文档里存在两种access_token:普通 access_token 和 网页授权 access_token。具体区别参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

    以下提到的 access_token 均为普通的 access_token

    1. 首先我们先去看看是如何请求 access_token 的? 微信公众平台技术文档

    GET请求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}
    错误返回:{"errcode":40013,"errmsg":"invalid appid"}

    2. 所以获取 access_token 的代码如下:
    const request = require('request')    // 请安装第三方包 request
    
    request.get({
            uri: 'https://api.weixin.qq.com/cgi-bin/token',
            json: true,
            qs: {
                grant_type: 'client_credential',
                appid: APPID,    // APPID请换成你的 appid
                secret: APPSECRET    // APPSECRET请换成你的 appsecret
            }
        }, (err, res, body) => {
            if (err) {
                console.log(err)
                return
            }
            console.log(body)
            if (body.errcode) {
                // 返回错误时的处理
                return
            }
    })
    
    3. guard_dog 实现数据持久化和定时刷新
    • guard_dog 会生成 .dog 文件,每个文件对应一个KEY
    const guard_dog = require('guard_dog')    // 请安装第三方包 guard_dog
    
    guard_dog.init(KEY, (handler) => {    // KEY是guard_dog存取数据的键名
        // 拿到数据后调用 handler
        handler(DATA, EXPIREDS_IN)    // DATA是要持久化的数据,EXPIREDS_IN是数据的有效时间,单位是秒
    }, DIR)    // DIR是 .dog 文件的存放目录,这个参数可以不传
    
    4. 现在把以上两块代码合并起来就是我们要的效果
    const request = require('request')
    const guard_dog = require('guard_dog')
    
    guard_dog.init('ACCESS_TOKEN', (handler) => {
        request.get({
            uri: 'https://api.weixin.qq.com/cgi-bin/token',
            json: true,
            qs: {
                grant_type: 'client_credential',
                appid: APPID,    // APPID请换成你的 appid
                secret: APPSECRET    // APPSECRET请换成你的 appsecret
            }
        }, (err, res, body) => {
            if (err) {
                console.log(err)
                return
            }
            console.log(body)
            if (body.errcode) {
                return
            }
            handler(body.access_token, body.expires_in)
        })
    })    // 如有需要指定目录,可以再给 guard_dog.init 多传个参数
    
    5. guard_dog 初始化这个 key 之后,获取到的都是有效的值了。guard_dog 获取值代码如下:
    guard_dog.get('ACCESS_TOKEN', (data) => {    // 上面初始化时用的键名为'ACCESS_TOKEN',所以这里取值也要用这个键名
        // 在这里拿到的 data 就是 access_token 了
    })
    
    6.如果想用着方便点,可以直接封装成一个模块

    access_token.js

    const request = require('request')
    const guard_dog = require('guard_dog')
    // 加载这个模块的时候给 ACCESS_TOKEN 这个键名初始化
    guard_dog.init('ACCESS_TOKEN', (handler) => {
        request.get({
            uri: 'https://api.weixin.qq.com/cgi-bin/token',
            json: true,
            qs: {
                grant_type: 'client_credential',
                appid: APPID,    // APPID请换成你的 appid
                secret: APPSECRET    // APPSECRET请换成你的 appsecret
            }
        }, (err, res, body) => {
            if (err) {
                console.log(err)
                return
            }
            console.log(body)
            if (body.errcode) {
                return
            }
            handler(body.access_token, body.expires_in)
        })
    }) 
    // 只要向外暴露一个获取值的方法就可以了
    module.exports = function (callback) {
        guard_dog.get('ACCESS_TOKEN', callback)
    }
    

    使用:

    const access_token = require('./access_token')    // 这里把这个模块与 access_token 模块当成在同一目录下来作为例子。
    access_token((data) => {
        // 这个 data 就是 access_token
    })
    

    jsapi_ticket

    jsapi_ticket 官方文档说明
    上面关于 access_token 的例子已经说得很详细了,jsapi_ticket 处理起来也大同小异,所以下面直接贴代码了:

    (需要注意一点:获取 jsapi_ticket 需要依赖 access_token,下面的代码直接依赖了上面所写的 access_token.js)

    jsapi_ticket.js

    const request = require('request')
    const guard_dog = require('guard_dog')
    const access_token = require('./access_token')
    
    guard_dog.init('JSAPI_TICKET', (handler) => {
        access_token((access_token) => {
            request.get({
                uri: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
                json: true,
                qs: {
                    access_token: access_token,
                    type: 'jsapi'
                }
            }, (err, res, body) => {
                if (err) {
                    console.log(err)
                    return
                }
                console.log(body)
                if (body.errcode) {
                    return
                }
                handler(body.ticket, body.expires_in)
            })
        })
    })
    
    module.exports = function (callback) {
        guard_dog.get('JSAPI_TICKET', callback)
    }
    

    使用:

    const jsapi_ticket = require('./jsapi_ticket')
    jsapi_ticket((data) => {
        // 这个 data 就是 jsapi_ticket
    })
    

    相关文章

      网友评论

        本文标题:Node.js 轻松搞定微信 access_token ( js

        本文链接:https://www.haomeiwen.com/subject/ekybextx.html