java使用springmvc开发微信公众平台的中控服务器
上一节我们说到微信公众平台的token获取,关于token的获取微信官方文档已经说得很清楚,不要由客户端请求来获取,因为每个公众账号每天可以获取的token有次数的限制,那么为了可以获得token,微信的问题提到一个中控服务器的概念,关于这个中控服务器,其实就是一个定时刷新token的逻辑,当token差不多要过期的时候,这个中控服务器会主动的去微信服务器获取新的token,从而保证可以一直获取到新的数据,关于微信的公众平台的更多知识,欢迎订阅我的头条号:一点热,www.yeehot.com
上一章节快速入口:
java使用spring mvc开发微信公众号获取token
了解了中控服务器的大致功能和原理后,我们主要就从定时刷新这里入手,定时刷新我们可以有很多种方法,比如是任务式,比如定时器,又比如队列等等,总之方法有很多,我这里只关心如何实现,那么,我就选择比较常见的而且也比较简单易用的定时器,对于定时器,之前我也写过了一篇文章,是使用quartz来实现社交软件如何在springmvc项目实现每天排名每周每月排名,也写过一篇使用Async进行异步延迟操作,不过这个可能都比较麻烦和不够清晰,那么我这里直接使用spring 自带的定时器。
在spring的配置文件xml加入task定时器
...... xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 上面的 接着我们写一个中控服务器的任务类ZhongKongTask public class ZhongKongTask { public void ZhongKong(){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s"); System.out.println("timer1 : "+format.format(new Date())); } } 写完了上面的定时器后,测试一下,看看控制台是不是打印了相关的时间信息, 接着,我们可以再回顾上一节已经了解过的获取token的相关信息,我们从微信服务器获取到的数据包含了token,和有效时间。 {"access_token":"ACCESS_TOKEN","expires_in":7200} 我们设置一个当单例AccessToken,这样我们可以全局访问到这个token和可以看看token是不有效的。我们在这里做一个标志,就是判断当前的时间是否有效isCanuse,里面的判断有效时间我们可以自行设置,我是设置了一个添加token的时间,和微信返回的过去时间,那么判断有效就是添加token的时间的毫秒数+微信返回token的过去时间(由于单位是秒,需要转换成毫秒)减去当前时间的毫秒数是否大于0,其实最好就判断大于0的数字,这样可以提前更新数据。 /** * Created by yeehot.com on 16/7/28. */ public class AccessToken { private static AccessToken ourInstance = new AccessToken(); public static AccessToken getInstance() { return ourInstance; } private String token; private long addtime; private long expires_in; private boolean canuse; public boolean isCanuse() { if (getAddtime()<=0||getExpires_in()<=0){ return false; } if ((getAddtime()+getExpires_in()*1000L)-System.currentTimeMillis()>0) { System.out.print("返回真"); return true; } return false; } public long getAddtime() { return addtime; } public void setAddtime(long addtime) { this.addtime = addtime; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public long getExpires_in() { return expires_in; } public void setExpires_in(long expires_in) { this.expires_in = expires_in; } private AccessToken() { } } 接着我们把上一节获取微信token的方法修改一下,可以让我们在任务器里面调用 public static String getWXToken( ){ Map param.put("grant_type", "client_credential"); param.put("appid", appid); param.put("secret", secret); param.put("grant_type", grant_type); OkHttpClient client = new OkHttpClient(); StringBuilder sb=new StringBuilder(); int keylenght=0; for (String key : param.keySet()) { if (keylenght sb.append(key).append("=").append(param.get(key)).append("&"); } else { sb.append(key).append("=").append(param.get(key)); } keylenght++; } String url=tokenurl+"?"+sb.toString(); System.out.print(url); Request request = new Request.Builder() .url(url) .get() .build(); Response response = null; try { response = client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } if (response != null) { try { String resStr = response.body().string(); response.body().close(); return resStr; } catch (IOException e) { e.printStackTrace(); return null; } } else { return null; } } 接着我们将定时器修改一下 public void ZhongKong(){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s"); System.out.println("timer1 : "+format.format(new Date())); AccessToken token=AccessToken.getInstance(); if (token.getToken()==null){ System.out.print("进入这里"); String info= TokenController.getWXToken(); if (info.contains("access_token")) { try { JSONObject jsonObject=new JSONObject(info); token.setToken(jsonObject.getString("access_token")); token.setAddtime(System.currentTimeMillis()); token.setExpires_in(jsonObject.getLong("expires_in")); } catch (JSONException e) { e.printStackTrace(); } } // System.out.print(info); } System.out.print("是否可以用"+token.isCanuse()); // System.out.print(token.getToken()); } } 这样我们就可以在全局自定义的更新token了。这里我们判断token是否有效的方法没有用到,主要是由于我们使用了定时器,定时器已经设置了一定时间来进入到这个方法中去更新token,所以我这里没有判断是否过期。不过主要用在其他地方的。 今天就讲到这里,欢迎继续关注我的头条号:一点热,yeehot.com,如果有什么问题,欢迎留言咨询,我看到之后会第一时间回复大家的。
com.yeehot.task.ZhongKongTask,是我定义的一个中控服务器的任务类,然后将它加入的定时计数器中,每隔一定的时间操作一下,然后method="ZhongKong",是ZhongKongTask里面的一个方法。这里需要指出的是,由于我是在测试,所以我设定每隔两分钟刷新一下token,主要是验证是不是保证定时器定时启动。在真实的环境中大家可以设置1个小时,对于设置一个小时的方法,大家可以看看定期器时间的设置,cron="0 0/2 * * * ?"