今日代码分享 | 中控服务器统一获取和刷新微信 Access Token

本文主要是介绍今日代码分享 | 中控服务器统一获取和刷新微信 Access Token,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在开发基于微信公众号或小程序的应用时,微信 Access Token 是调用微信 API 接口的必要凭证。为了避免在多个服务中频繁地请求微信服务器,造成不必要的资源浪费和性能瓶颈,通常会采用中控服务器统一获取和刷新微信 Access Token 的方式。本文将介绍如何在中控服务器中实现统一获取和刷新微信 Access Token 的方案。

先上代码:

//ip鉴权,只有指定的ip才可以进行获取token  
String remoteAddr = request.getHeader("X-Forwarded-For");if (StrUtil.isBlank(remoteAddr)) {remoteAddr = request.getRemoteAddr();
}else {remoteAddr = remoteAddr.split(SymbolConstant.COMMA)[0];
}log.info("访问地址 ====> {}", remoteAddr);String passUrl = commonProperties.getPassUrl();
if (StrUtil.isBlank(passUrl)) {log.info("没有配置允许访问的ip!!!!!");return "";
}
if (!passUrl.contains(remoteAddr)) {log.info("该ip: {} 不允许访问,运行访问的ip为 {}", remoteAddr, passUrl);return "";
}
//============================================//token已经存在,直接返回
if (redisUtil.hasKey(RedisConstant.WX_TOKEN)) {//计算该token的实时过期时间,实现逻辑是:缓存获取token的时间,然后与现在的时间进行对比Date now = new Date();Object obj = redisUtil.get(RedisConstant.WX_TOKEN);JSONObject res = JSONUtil.parseObj(obj);String createTime = res.getStr("createTime");DateTime createDate = DateUtil.parse(createTime, "yyyy-MM-dd HH:mm:ss");res.put("expires_in",  Long.valueOf(res.getStr("expires_in")) - (Math.abs(now.getTime() - createDate.getTime()) / 1000));res.remove("createTime");return res.toString();
}
//请求微信的接口
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + commonProperties.getDsAppId() + "&secret=" + commonProperties.getDsSecret();
String body = HttpUtil.createGet(url).execute().body();
if (StrUtil.isBlank(body)) {log.info("response body is null");return null;
}
try {//解析token,并缓存JSONObject res = JSONUtil.parseObj(body);log.info("微信返回的结果: {}", res.toString());String accessToken = res.getStr("access_token");String expiresIn = res.getStr("expires_in");if (!StrUtil.isAllNotBlank(accessToken, expiresIn)) {log.info("返回的参数有误~   {}", res.toString());return null;}//缓存获取token的时间res.put("createTime", DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));redisUtil.set(RedisConstant.WX_TOKEN, res, Long.valueOf(expiresIn) - (5 * 60));res.remove("createTime");return res.toString();
} catch (Exception e) {log.error("获取token失败", e);
}return null;

1. 中控服务器的角色

中控服务器通常是一个独立的服务,负责管理微信 Access Token 的获取和刷新。其他业务服务需要调用微信 API 时,可以向中控服务器请求 Access Token,而无需直接与微信服务器通信。这样一来,可以避免多个业务服务频繁请求微信服务器,降低对微信服务器的压力。

2. 获取和缓存微信 Access Token

在中控服务器中,可以通过向微信服务器发送 HTTP 请求获取 Access Token,并将其缓存起来,以备后续使用。为了确保 Access Token 的有效性,需要定时刷新缓存中的 Access Token。以下是获取和缓存微信 Access Token 的基本流程:

  • 中控服务器接收请求,检查缓存中是否存在有效的 Access Token。
  • 如果存在有效的 Access Token,则直接返回给客户端。
  • 如果缓存中不存在有效的 Access Token,或者 Access Token 已过期,则向微信服务器请求新的 Access Token。
  • 获取到新的 Access Token 后,更新缓存,并返回给客户端。
  • 返回的token还可以动态的更新expires_in,让第三方服务器准确的知道token的有效时间。

3. Access Token 的定时刷新

由于微信 Access Token 的有效期较短(通常为两小时),需要定时刷新缓存中的 Access Token,以确保业务服务始终能够获取到有效的 Access Token。可以通过定时任务或者定时触发器实现 Access Token 的定时刷新,例如每隔一段时间(如1小时55分钟)自动向微信服务器请求新的 Access Token,并更新缓存中的值。

4. 安全性考虑

在中控服务器中管理微信 Access Token 时,需要考虑安全性问题。建议采用 HTTPS 协议进行通信,确保数据传输的安全性。另外,可以通过限制访问来源 IP 或者添加访问权限验证等方式,保障中控服务器的安全性。

5. 总结

通过中控服务器统一获取和刷新微信 Access Token,可以有效地降低对微信服务器的请求次数,提高应用的性能和稳定性。同时,合理的缓存策略和定时刷新机制能够确保业务服务始终能够获取到有效的 Access Token,从而保障应用的正常运行。在实际应用中,可以根据业务需求和安全考虑,灵活地调整和优化中控服务器的实现方案。

这篇关于今日代码分享 | 中控服务器统一获取和刷新微信 Access Token的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824003

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单