博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TNW-获取微信公众号的 access_token
阅读量:6980 次
发布时间:2019-06-27

本文共 4004 字,大约阅读时间需要 13 分钟。

简介

TNW: TypeScript(The) + Node.js(Next) + WeChat 微信公众号开发脚手架,支持 http 模块扩展、支持任何 Node.js 的服务端框架(Express、NestJS、eggjs 等)

概述

access_token 是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_token。开发者需要进行妥善保存。access_token 的存储至少要保留 512 个字符空间access_token 的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。

公众平台的API调用所需的 access_token 的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;

2、目前 access_token 的有效期通过返回的 expire_in 来传达,目前是 7200 秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token都可用,这保证了第三方业务的平滑过渡;

3、access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发access_token 的刷新流程。

公众号和小程序均可以使用 AppId 和 AppSecret 调用本接口来获取 access_token。AppId 和 AppSecret 可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。**调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器 IP 地址添加到 IP 白名单中,否则将无法调用成功。**小程序无需配置IP白名单。

以上内容来自

划重点:

  • 调用 access_token 接口需要在微信公众平台配置 IP 白名单
  • access_token 有效期为 7200 秒
  • 可以提前刷新 access_token ,此时公众平台后台会保证在5分钟内新老 access_token 都可用

TNW 中获取 access_token

export class AccessTokenApi {    private static url: string = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";    /**     * 获取 acces_token      * 1、先从缓存中获取,如果可用就直接返回     * 2、如果缓存中的已过期就调用刷新接口来获取新的 acces_token      */    public static async getAccessToken() {        let ac: ApiConfig = ApiConfigKit.getApiConfig;        let accessToken: AccessToken | undefined = this.getAvailableAccessToken(ac);        if (accessToken) {            if(ApiConfigKit.isDevMode) console.log("缓存中的 accesstoken");            return accessToken;        }        if(ApiConfigKit.isDevMode) console.log("刷新 accesstoken");        return await this.refreshAccessToken(ac);;    }    /**     * 通过 appId 从缓存中获取 acces_token     * @param apiConfig      */    private static getAvailableAccessToken(apiConfig: ApiConfig): AccessToken | undefined {        let result: AccessToken | undefined;        let accessTokenCache: IAccessTokenCache = ApiConfigKit.getAccessTokenCache;        let accessTokenJson: string = accessTokenCache.get(apiConfig.getAppId);        if (accessTokenJson) {            result = new AccessToken(accessTokenJson);        }        if (result && result.isAvailable()) {            return result;        } else {            return undefined;        }    }    /**     * 获取新的 acces_token 并设置缓存     * @param apiConfig      */    public static async refreshAccessToken(apiConfig: ApiConfig) {        let url = util.format(this.url, apiConfig.getAppId, apiConfig.getAppScrect);        let data = await HttpKit.getHttpDelegate.httpGet(url);        if (data) {            let accessToken: AccessToken = new AccessToken(data)            let accessTokenCache: IAccessTokenCache = ApiConfigKit.getAccessTokenCache;            accessTokenCache.set(apiConfig.getAppId, accessToken.getCacheJson);            return accessToken;        } else {            new Error("获取accessToken异常");        }    }}复制代码

默认 access_token 缓存在内存中,但这有一个缺点,当应用关闭后又得重新获取。所以 TNW 中提供了设置缓存的扩展。

缓存扩展

access_token 缓存接口 IAccessTokenCache

export interface IAccessTokenCache {    get(key: string): string;    set(key: string, jsonValue: string): void;    remove(key: string): void;}复制代码

默认实现 DefaultAccessTokenCache

export class DefaultAccessTokenCache implements IAccessTokenCache {    private map: Map
= new Map
(); get(key: string): string { return this.map.get(key) || ''; } set(key: string, jsonValue: string) { this.map.set(key, jsonValue); } remove(key: string) { this.map.delete(key); }}复制代码

设置替换默认缓存

DefaultAccessTokenCache 替换为你的实现类即可 比如:缓存至文件、Redis 等

ApiConfigKit.setAccessTokenCache(new DefaultAccessTokenCache());复制代码

遗留问题

直接传入接口的实现类会出现异常 待解决

开源推荐

  • TNW 微信公众号开发脚手架:
  • IJPay 让支付触手可及:
  • SpringBoot 微服务高效开发 mica 工具集:
  • Avue 一款基于 vue 可配置化的神奇框架:
  • pig 宇宙最强微服务(架构师必备):
  • SpringBlade 完整的线上解决方案(企业开发必备):

转载于:https://juejin.im/post/5cc860775188252dd918539d

你可能感兴趣的文章
7.14. revision
查看>>
第 175 章 Open Source Requirements Management Tool
查看>>
CentOS7安装配置redis-3.0.0
查看>>
SQL server 专业词汇
查看>>
Selenium2+python自动化25-js处理日历控件(修改readonly属性)
查看>>
ArcGIS制图之Sub Points点抽稀
查看>>
[高中作文赏析]假如真的有时光隧道
查看>>
selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python2&3)
查看>>
thinkphp pathinfo nginx 无法加载模块:Index
查看>>
如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
查看>>
单例模式
查看>>
iOS多线程编程之NSOperation和NSOperationQueue的使用
查看>>
SAP QM 'QM System' 有什么控制作用?
查看>>
Health Check in eShop -- 解析微软微服务架构Demo(五)
查看>>
项目沟通管理计划
查看>>
[20160608]自治事务引起死锁.txt
查看>>
AliGenie AR Fuels the Ali New Retail Strategy - Interactive Marketing Activities
查看>>
一个最简单的通过WireShark破解SSL加密网络数据包的方法
查看>>
教你用TensorFlow和自编码器模型生成手写数字(附代码)
查看>>
荣之联“云桥OneBridge”让IT运维事半功倍
查看>>