微信处理access_token全局缓存的问题
最早的时候,因为不需要太多微信jsapi的支持,使用access_token的机会很少, 所以一直没有有处理缓存的问题。但是后来添加微信分享和扫描二维码的时候,token的使用量激增导致有时候调试2,3个小时, token得访问上线就打到了 。 本来是想将token存到库中 , 每次读库这样实现。但是在网上看到别人说可以用单例的方式来实现, 既简单又方便。使用时 ,直接从map中取出参数就可以。 尝试一下非常好用。现将代码分享出来。
1 public class TokenSingleton { 2 //缓存accessToken 的Map ,map中包含 一个accessToken 和 缓存的时间戳 3 //当然也可以分开成两个属性咯 4 5 public final static String weixin_jssdk_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; 6 7 private Map<String, String> map = new HashMap<>(); 8 9 private TokenSingleton() { 10 } 11 12 private static TokenSingleton single = null; 13 14 // 静态工厂方法 15 public static TokenSingleton getInstance() { 16 if (single == null) { 17 single = new TokenSingleton(); 18 } 19 return single; 20 } 21 22 public Map<String, String> getMap(WeixinAccountServiceI weixinAccountService) { 23 String time = map.get("time"); 24 String accessToken = map.get("access_token"); 25 Long nowDate = new Date().getTime(); 26 27 if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 3000 * 1000) { 28 // result = accessToken; 29 System.out.println("accessToken存在,且没有超时 , 返回单例"); 30 } else { 31 System.out.println("accessToken 超时 , 或者不存在 , 重新获取"); 32 System.out.println("weixinAccountService : " + weixinAccountService); 33 String access_token=weixinAccountService.getNewAccessToken("gh_ab6e37102f85"); 34 //"这里是直接调用微信的API去直接获取 accessToken 和Jsapi_ticket 获取"; 35 String jsapi_token = getJsapiToken(access_token); 36 //"获取jsapi_token"; 37 map.put("time", nowDate + ""); 38 map.put("access_token", access_token); 39 map.put("jsapi_token", jsapi_token); 40 // result = access_token; 41 } 42 43 return map; 44 } 45 46 public void setMap(Map<String, String> map) { 47 this.map = map; 48 } 49 50 public static TokenSingleton getSingle() { 51 return single; 52 } 53 54 public static void setSingle(TokenSingleton single) { 55 TokenSingleton.single = single; 56 } 57 58 59 public String getJsapiToken(String accessToken){ 60 //获取jsapi_ticket 61 System.out.println("获取jsapi_ticket"); 62 String jsapi_Url = weixin_jssdk_ticket_url.replace("ACCESS_TOKEN", accessToken); 63 String jsapi_ticket = null; 64 net.sf.json.JSONObject jsonObject = WeixinUtil.httpRequest(jsapi_Url, "GET", null); 65 66 System.out.println("请求返回数据: " + jsonObject); 67 68 // 如果请求成功 69 if (null != jsonObject) { 70 System.out.println("jsapi_ticket : "+jsonObject); 71 jsapi_ticket=jsonObject.getString("ticket"); 72 } 73 74 return jsapi_ticket; 75 } 76 77 78 }
标签:
access_token
, jsapi_token
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY