微信公众号开发如何获取 access_token

一、微信公众号获取 access_token
  1. access_token 是微信调用接口全局唯一的凭据。它的特点是唯一的,有效期为2 小时,提前 5分钟请求,接口权限,每天 2000 次。它的请求地址是 https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,请求方式是 GET 方式。

  2. 对于获取 access_token,可以分析一下设计思路

  • 首次本地没有,发送请求获取 access_token,保存下来,本地文件
  • 第二次或以后,先去本地读取文件,判断它是否过期。过期了, 重新请求获取 access_token,保存下来覆盖之前的文件,保证文件是唯一的。没有过期,直接使用。
  1. 对此,我们可以整理一下思路
  • 读取本地文件 (readAccessToken)
  • 本地有文件,判断它是否过期 (isValidAccessToken)。过期了, 重新请求获取 access_token (getAccessToken),保存下来覆盖之前的文件,保证文件是唯一的, (saveAccessToken)。没有过期,直接使用。
  • 本地没有文件,发送请求获取 access_token (getAccessToken),保存下来 (saveAccessToken),本地文件,直接使用。
  1. 引入 config.js 文件,里面包括tokenappIDappsecret。引入 request-promise-native,通过 npm i request-promise-native命令进行下载。引入 fs 文件模块,代码如下所示:
const { appID, appsecret } = require('../config')
const rp = require('request-promise-native')
const { writeFile, readFile} = require('fs')
  1. 定义一个类 WeChat,获取 access_token,在里面可以定义一些方法。定义getAccessToken 方法,用来获取 access_token。定义请求的地址,发送请求,得到的 res 结果包括两个值,access_token 微信调用接口全局唯一的凭据 和 expires_in 过期时间。设置 access_token 的过期时间,将 promise 对象状态修改为成功的状态,代码如下所示:
// 用来获取 access_token
    getAccessToken () {
        const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appID}&secret=${appsecret}`
        
        return new Promise((resolve, reject) => {
            rp({method: 'GET', url, json: true}).then(res => {
                console.log(res)
                res.expires_in = Date.now() + (res.expires_in - 300) * 1000
                resolve(res)

            }).catch(err => {
                console.log(err)
                reject('getAccessToken方法出了问题:'+ err)
            })
        })
        
    }
  1. 在这个类 WeChat中,定义 saveAccessToken 方法,用来保存 access_token, access_token 是保存的凭据。将对象转化 json字符串,将 access_token 保存为一个文件,代码如下所示:
// 用来保存 access_token, access_token 是保存的凭据
    saveAccessToken (accessToken) {
        accessToken = JSON.stringify(accessToken)
        return new Promise((resolve, reject) => {
            writeFile('./accessToken.txt', accessToken, err => {
                if (!err) {
                    console.log('文件保存成功')
                    resolve()
                } else {
                    reject('saveAccessToken方法出了问题:' + err)
                }
            })
        })
    }

  1. 在这个类 WeChat中,定义 readAccessToken 方法,用来读取 access_token。读取本地文件中的 access_token,通过 readFile 方法,将 json 字符串转化为 js 对象,代码如下所示:
 //  用来读取 access_token
    readAccessToken () {
        return new Promise((resolve, reject) => {
            readFile('./accessToken.txt', (err, data) => {
                if (!err) {
                    console.log('文件读取成功')
                    data = JSON.parse(data)
                    resolve(data)
                } else {
                    reject('readAccessToken方法出了问题:' + err)
                }
            })
        })
    }
  1. 在这个类 WeChat中,定义 isValidAccessToken 方法,用来检测 access_token 是否是有效的,检测传入的参数是否是有效的。如果没有 data,没有 access_token 以及没有 expires_in,说明传入的 access_token 是无效的。 过期时间大于当前时间,说明没有过期,返回 true,代码如下所示:
//  用来检测 access_token 是否是有效的
    isValidAccessToken (accessToken) {  
        if (!data && !data.access_token && data.expires_in) {
            return false
        }

        return data.expires_in > Data.now()
    }

  1. 在这个类 WeChat中,定义 fetchAccessToken 方法,用来获取没有过期的 access_token,传递参数就是 Promise 对象。先判断有没有 access_tokenexpires_in以及
    是否有效。如果有效,说明之前保存过 access_token,并且没有过期,可以直接使用。读取本地有文件,判断它是否过期。如果有效的,直接返回 access_token。如果无效的,发送请求获取 access_token ,保存下来 ,本地文件,直接使用,将请求回来的 access_token 返回出去。如果本地无文件,发送请求获取 access_token,保存下来 ,本地文件,直接使用,将请求回来的 access_token 返回出去。最后,将 access_tokenexpires_in 挂载到 this 上,返回 res 包装了一层 promise 对象,此对象为成功后的状态,是this.readAccessToken 最终的返回值,代码如下所示:
// 用来获取没有过期的 access_token,
    fetchAccessToken () {
            if (this.access_token && this.expires_in && this.isValidAccessToken(res)) {
                return Promise.resolve({
                    access_token: this.access_token,
                    expires_in: this.expires_in
                })
            } 


            return this.readAccessToken().then(async res => {
                if (this.isValidAccessToken(res)) {
                    return Promise.resolve(res)
                } else {
                    const res = await this.getAccessToken()
                    await this.saveAccessToken(res)
                    return Promise.resolve(res)
                }
        
            }).catch(async err => {
                const res = await this.getAccessToken()
                await this.saveAccessToken(res)
                return Promise.resolve(res)

            }).then(res => {

                this.access_token = res.access_token
                this.expires_in = res.expires_in

                return Promise.resolve(res)
            })
        
        
    }
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值