java使用springmvc开发微信公众平台的中控服务器

createh52个月前 (02-27)技术教程28

上一节我们说到微信公众平台的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">

上面的
com.yeehot.task.ZhongKongTask,是我定义的一个中控服务器的任务类,然后将它加入的定时计数器中,每隔一定的时间操作一下,然后method="ZhongKong",是ZhongKongTask里面的一个方法。这里需要指出的是,由于我是在测试,所以我设定每隔两分钟刷新一下token,主要是验证是不是保证定时器定时启动。在真实的环境中大家可以设置1个小时,对于设置一个小时的方法,大家可以看看定期器时间的设置,cron="0 0/2 * * * ?"

接着我们写一个中控服务器的任务类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 = new HashMap();

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,如果有什么问题,欢迎留言咨询,我看到之后会第一时间回复大家的。

相关文章

「穷酸」文科生和天坑专业人,正在争夺码农Offer

封面图逃离“天坑专业”,拿下那个码农Offer一次“极大的震撼”,让经济学二本毕业的李晓晨,萌生了必须转行做码农的想法。大四实习期间,她在广西一家私企做过一段时间HR,整理工资单时她发现——3年工作经...

java使用spring mvc开发微信公众号验证开发者步骤

这几年微信公众平台开发比较热门,但是微信公众平台的SDK和java的sample比较少,很多都是靠自己摸索,首先进行微信公众号的开发,你必须得有个公众号或者测试号,有了这些条件后,你可以在后台里面进行...

Spring Boot 开发微信公众号_spring boot开发微信小程序

在讲微信公众号开发之前,先来大概了解一下微信公众号。微信公众号大体上可以分为服务号和订阅号,订阅号和服务号的区别如下:服务号可以申请微信支付功能。服务号只能由企业申请,订阅号可以由企业或个人申请。订阅...

wechatty-project 一个基于JAVA的微信公众号的开发框架

GitHub - chensheng/wechatty-project: Wechattty Project是一个基于JAVA的微信公众号(包括服务号和订阅号)和微信企业号的开发框架,封装良好的API...

青岛的程序员,能去哪里混口饭吃?

原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处。十一前,Hydra的一个好朋友离职去了北京那边的一家公司,说真的,我们打心底替他感到高兴,年轻人就应该出去闯荡一...

invalid weapp pagepath hint,微信公众号模板消息的“巨坑”

如果对微信公众号开发不了解的,可以移步 ˃˃˃初认识,Java 微信公众号开发今天我要吐槽下模板消息中加入小程序跳转的坑,做这个功能,掉了不少头发。最终实现的效果点击“看点直播”小程序跳转指定页面,不...