项目中调用微信公众平台的接口时,因为获取到的accessToken及jsapiTicket有效时长只有两个小时,需要不断更新。

所以做了个定时任务,记录一下。

.SpringTask实现有两种方式,一种是注解,一种是配置。我这个是配置xml实现的,实现步骤具体如下:

第一步:新建spring-task.xml,并配置定时任务。(先获取accessToken,在随即获取jsapiTicket)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:task="http://www.springframework.org/schema/task"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-4.2.xsd
  11. http://www.springframework.org/schema/task
  12. http://www.springframework.org/schema/task/spring-task-4.2.xsd">
  13.  
  14. <!-- 自动扫描的包名 -->
  15. <context:component-scan base-package="com.wfcm.wxUitls" />
  16. <task:annotation-driven /><!-- 定时器开关-->
  17.  
  18. <bean id="taskJob" class="com.wfcm.wxUitls.TaskJob"/><!-- 指向定时执行的类-->
  19. <task:scheduled-tasks>
  20. <task:scheduled ref="taskJob" method="getAccessToken" cron="0 0 0/1 * * ?"/><!--每小时执行一次: ref指任务类bean的id , method定时执行的方法,corn定时设置-->
  21. </task:scheduled-tasks>
  22. <task:scheduled-tasks>
  23. <task:scheduled ref="taskJob" method="getJsapiTicket" cron="1 0 0/1 * * ?"/>
  24. </task:scheduled-tasks>
  25. </beans>

记得扫描.xml

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>
  4. classpath:spring-task.xml
  5. </param-value>
  6. </context-param>

cron="0/2 * * * * ? //每两秒执行一次,测试的时候用。关于Spring Task 的 cron表达式,请参见另一篇博客:摆脱Spring 定时任务的@Scheduled cron表达式的困扰

第二步:接下来就是写任务类:(测试用)

  1. public class TaskJob {
  2.  
  3. public void job1() {
  4. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  5. Date now = new Date();
  6. System.out.println("******************任务进行中****************"+sdf.format(now));
  7. }
  8.  
  9. public void job2() {
  10. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  11. Date now = new Date();
  12. System.out.println("******************任务进行中****************"+sdf.format(now));
  13. }
  14. }

第三步:具体业务实现,其中access和jsapiticket存在同一张表中。

  1. package com.xxxx.wxUitls;public class TaskJob {
  2.  
  3. private static Logger log = LoggerFactory.getLogger(TokenThread.class);
  4.  
  5. @Autowired
  6. WfWxShareService wxShareService;
  7.  
  8. // 第三方用户唯一凭证
  9. //appid/appsecret为微信app ; 配置获取access_token所需参数appid和appsecret
  10. public static String appid = "wxbxxxxxxxxxx";
  11. // 第三方用户唯一凭证密钥
  12. public static String appsecret = "4cfaxxxxxxxxxxxxxxxxx";
  13.  
  14. public void getAccessToken() {
  15. WfWxShareEntity accessToken = new WfWxShareEntity();
  16. accessToken = WxUtil.getAccessToken(appid, appsecret);
  17. if (null != accessToken ) {
  18. log.info("获取access_token成功,有效时长{}秒 token:{}", accessToken.getContent());
  19. wxShareService.update(accessToken);
  20. }
  21. }
  22.  
  23. public void getJsapiTicket() {
  24. WfWxShareEntity accessToken = new WfWxShareEntity();
  25. accessToken = wxShareService.queryObject(1);
  26.  
  27. JSONObject jsonObj= FastJSONUtils.getJSONObject(accessToken.getContent());
  28. String access_token = jsonObj.getString("access_token");
  29.  
  30. WfWxShareEntity jsapiTicket = new WfWxShareEntity();
  31. jsapiTicket = WxUtil.getTicket(access_token);
  32. if (null != jsapiTicket ) {
  33. log.info("获取jsapiTicket成功,有效时长{}秒 token:{}", jsapiTicket.getContent());
  34. }
  35. wxShareService.update(jsapiTicket);
  36. }
  37.  
  38. }

工具类:WXUtil.java

  1. package com.xxxx.utils;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import java.util.List;
  8. import java.util.Map;
  9.  
  10. import com.xxxx.entity.WfWxShareEntity;
  11.  
  12. public class WxUtil {
  13.  
  14. /**
  15. * 向指定URL发送GET方法的请求
  16. *
  17. * 发送请求的URL
  18. * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  19. * @return URL 所代表远程资源的响应结果
  20. */
  21. public static WfWxShareEntity getAccessToken(String appid, String appsecret) {
  22. WfWxShareEntity accessToken = new WfWxShareEntity();
  23.  
  24. String result = "";
  25. BufferedReader in = null;
  26. try {
  27. String urlNameString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +appid+ "&secret=" + appsecret;
  28.  
  29. URL realUrl = new URL(urlNameString);
  30. // 打开和URL之间的连接
  31. URLConnection connection = realUrl.openConnection();
  32. // 设置通用的请求属性
  33. connection.setRequestProperty("accept", "*/*");
  34. connection.setRequestProperty("connection", "Keep-Alive");
  35. connection.setRequestProperty("user-agent",
  36. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  37. // 建立实际的连接
  38. connection.connect();
  39. // 获取所有响应头字段
  40. Map<String, List<String>> map = connection.getHeaderFields();
  41. // 遍历所有的响应头字段
  42. for (String key : map.keySet()) {
  43. System.out.println(key + "--->" + map.get(key));
  44. }
  45. // 定义 BufferedReader输入流来读取URL的响应
  46. in = new BufferedReader(new InputStreamReader(
  47. connection.getInputStream()));
  48. String line =null;
  49. while ((line = in.readLine()) != null) {
  50. result += line;
  51. }
  52. // JSONObject jsonObj= FastJSONUtils.getJSONObject(result);
  53. /* String access_token = jsonObj.getString("access_token");
  54. long expires_in = Long.valueOf(jsonObj.getString("expires_in"));*/
  55. accessToken.setId(1);
  56. accessToken.setName("access_token");
  57. accessToken.setContent(result);
  58. } catch (Exception e) {
  59. System.out.println("发送GET请求出现异常!" + e);
  60. e.printStackTrace();
  61. }
  62. // 使用finally块来关闭输入流
  63. finally {
  64. try {
  65. if (in != null) {
  66. in.close();
  67. }
  68. } catch (Exception e2) {
  69. e2.printStackTrace();
  70. }
  71. }
  72. return accessToken ;
  73. }
  74.  
  75. /**
  76. * 向指定URL发送GET方法的请求
  77. * 发送请求的URL
  78. * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  79. * @return URL 所代表远程资源的响应结果
  80. */
  81. public static WfWxShareEntity getTicket(String access_token) {
  82. WfWxShareEntity jsapiTicket = new WfWxShareEntity();
  83. String result = "";
  84. BufferedReader in = null;
  85. try {
  86. String urlNameString = " https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" +access_token+ "&type=jsapi";
  87.  
  88. URL realUrl = new URL(urlNameString);
  89. // 打开和URL之间的连接
  90. URLConnection connection = realUrl.openConnection();
  91. // 设置通用的请求属性
  92. connection.setRequestProperty("accept", "*/*");
  93. connection.setRequestProperty("connection", "Keep-Alive");
  94. connection.setRequestProperty("user-agent",
  95. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  96. // 建立实际的连接
  97. connection.connect();
  98. // 获取所有响应头字段
  99. Map<String, List<String>> map = connection.getHeaderFields();
  100. // 遍历所有的响应头字段
  101. for (String key : map.keySet()) {
  102. System.out.println(key + "--->" + map.get(key));
  103. }
  104. // 定义 BufferedReader输入流来读取URL的响应
  105. in = new BufferedReader(new InputStreamReader(
  106. connection.getInputStream()));
  107. String line =null;
  108. while ((line = in.readLine()) != null) {
  109. result += line;
  110. }
  111. /* JSONObject jsonObj= FastJSONUtils.getJSONObject(result);
  112. String tiket = jsonObj.getString("ticket");
  113. long expires_in = Long.valueOf(jsonObj.getString("expires_in"));
  114. accessToken.setAccessToken(tiket);
  115. accessToken.setExpirationTime(expires_in);*/
  116. jsapiTicket.setId(2);
  117. jsapiTicket.setName("jsapi_ticket");
  118. jsapiTicket.setContent(result);
  119. } catch (Exception e) {
  120. System.out.println("发送GET请求出现异常!" + e);
  121. e.printStackTrace();
  122. }
  123. // 使用finally块来关闭输入流
  124. finally {
  125. try {
  126. if (in != null) {
  127. in.close();
  128. }
  129. } catch (Exception e2) {
  130. e2.printStackTrace();
  131. }
  132. }
  133. return jsapiTicket ;
  134. }
  135.  
  136. }

实体类:WxSharEntity.java

  1. package com.xxx.entity;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5.  
  6. /**
  7. * 微信分享
  8. *
  9. * @author xlf
  10. * @email xlfbe696@gmail.com
  11. * @date 2018-02-01 19:44:58
  12. */
  13. public class WfWxShareEntity implements Serializable {
  14. private static final long serialVersionUID = 1L;
  15.  
  16. //
  17. private Integer id;
  18. //名称
  19. private String name;
  20. //内容
  21. private String content;
  22.  
  23. /**
  24. * 设置:
  25. */
  26. public void setId(Integer id) {
  27. this.id = id;
  28. }
  29. /**
  30. * 获取:
  31. */
  32. public Integer getId() {
  33. return id;
  34. }
  35. /**
  36. * 设置:名称
  37. */
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41. /**
  42. * 获取:名称
  43. */
  44. public String getName() {
  45. return name;
  46. }
  47. /**
  48. * 设置:内容
  49. */
  50. public void setContent(String content) {
  51. this.content = content;
  52. }
  53. /**
  54. * 获取:内容
  55. */
  56. public String getContent() {
  57. return content;
  58. }
  59. }

 

SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】的更多相关文章

  1. JAVA折腾微信公众平台(Token验证)[转]

    JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...

  2. Java获取微信公众号新增用户事件

    一.新建项目工程 新建一个spring项目 填写 Group 和 Artifact 信息 这步可以直接跳过,后面再按需导入 选择工程地址 二.配置 pom.xml <dependencies&g ...

  3. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...

  4. 使用Java开发微信公众平台(二)——消息的接收与响应

    上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...

  5. 使用Java开发微信公众平台(四)——消息的接收与响应

    上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...

  6. 荒废了很久的java以及微信公众平台今天拿起来看了看:这里有很好的教程

    我的微信公众号刚刚起步: ,感兴趣可以关注一下. 关于java开发微信公众号有一个很好的教程博客:推荐一下:http://blog.csdn.net/lyq8479/article/details/8 ...

  7. 运用Java对微信公众平台二次开发技术——开发者模式接入

    当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWe ...

  8. java版微信公众平台自定义菜单创建代码实现

    微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...

  9. 使用java开发微信公众平台(1)

    目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...

随机推荐

  1. Python判断网络是否可以访问

    import urllib url = "http://www.baidu.com" try: status = urllib.urlopen(url).code print st ...

  2. javaweb action无法跳转、表单无法跳转的解决方法

    action无法跳转,表单无法跳转的解决方法 刚在网上搜索了一下,发现我的这篇文章已被非常多人转载了去其他站点.暗爽,只是还是希望大家注明出处. 顺便说明一下.下面是在struts2中通过測试的 ac ...

  3. [转载]威力导演14旗舰破解版(中文简体)|取消30天限制CyberLink&nb

               2015月9月15日(当地时间),CyberLink讯连科技发布新一代视频编辑软件 — PowerDirector威力导演14,融合了上个版本发布以来的多次更新升级,威力导演依旧 ...

  4. 【python】获取列表中最长连续数字

    最近开发遇到一个功能需求,目的是要获取一个AI分析结果中最长连续帧,比如一个视频中连续3帧有人,那么我认为这个视频就是有人,我就要判断这个视频帧列表中是否有连续的三帧有人.本质就是获取列表中的最长连续 ...

  5. Eclipse部署项目的时候抛异常【Multiple Contexts have a path of "/cdcpm".】

    Eclipse部署项目的时候抛异常[Multiple Contexts have a path of "/cdcpm".]重新clean .删除server都不好使.查看一下tom ...

  6. hive与hbase

    作者:有点文链接:https://www.zhihu.com/question/21677041/answer/185664626来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  7. Hadoop单机搭建

    单机Hadoop搭建 1.下载hadoop-2.7.3.tar.gz http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/h ...

  8. hdu1010感想

    杭电这道题是用dfs走迷宫问题,一直wa是因为没有将走过的地方标记,所以如果遇到走迷宫的问题一定要将走过的地方标记,如下: &&nx<n&&ny>=& ...

  9. uiwebview 加载本地js、css、img,html从网站加载

    资源文件都是放在根目录下 1.index.html <html> <head> <title>My test Page</title> <link ...

  10. zookeeper分布式锁的问题

    分布式锁的流程: 在zookeeper指定节点(locks)下创建临时顺序节点node_n 获取locks下所有子节点children 对子节点按节点自增序号从小到大排序 判断本节点是不是第一个子节点 ...