SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】
项目中调用微信公众平台的接口时,因为获取到的accessToken及jsapiTicket有效时长只有两个小时,需要不断更新。
所以做了个定时任务,记录一下。
.SpringTask实现有两种方式,一种是注解,一种是配置。我这个是配置xml实现的,实现步骤具体如下:
第一步:新建spring-task.xml,并配置定时任务。(先获取accessToken,在随即获取jsapiTicket)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.2.xsd"> <!-- 自动扫描的包名 -->
<context:component-scan base-package="com.wfcm.wxUitls" />
<task:annotation-driven /><!-- 定时器开关--> <bean id="taskJob" class="com.wfcm.wxUitls.TaskJob"/><!-- 指向定时执行的类-->
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="getAccessToken" cron="0 0 0/1 * * ?"/><!--每小时执行一次: ref指任务类bean的id , method定时执行的方法,corn定时设置-->
</task:scheduled-tasks>
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="getJsapiTicket" cron="1 0 0/1 * * ?"/>
</task:scheduled-tasks>
</beans>
记得扫描.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-task.xml
</param-value>
</context-param>
cron="0/2 * * * * ? //每两秒执行一次,测试的时候用。关于Spring Task 的 cron表达式,请参见另一篇博客:摆脱Spring 定时任务的@Scheduled cron表达式的困扰
第二步:接下来就是写任务类:(测试用)
public class TaskJob {
public void job1() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date now = new Date();
System.out.println("******************任务进行中****************"+sdf.format(now));
}
public void job2() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date now = new Date();
System.out.println("******************任务进行中****************"+sdf.format(now));
}
}
第三步:具体业务实现,其中access和jsapiticket存在同一张表中。
package com.xxxx.wxUitls;public class TaskJob {
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
@Autowired
WfWxShareService wxShareService;
// 第三方用户唯一凭证
//appid/appsecret为微信app ; 配置获取access_token所需参数appid和appsecret
public static String appid = "wxbxxxxxxxxxx";
// 第三方用户唯一凭证密钥
public static String appsecret = "4cfaxxxxxxxxxxxxxxxxx";
public void getAccessToken() {
WfWxShareEntity accessToken = new WfWxShareEntity();
accessToken = WxUtil.getAccessToken(appid, appsecret);
if (null != accessToken ) {
log.info("获取access_token成功,有效时长{}秒 token:{}", accessToken.getContent());
wxShareService.update(accessToken);
}
}
public void getJsapiTicket() {
WfWxShareEntity accessToken = new WfWxShareEntity();
accessToken = wxShareService.queryObject(1);
JSONObject jsonObj= FastJSONUtils.getJSONObject(accessToken.getContent());
String access_token = jsonObj.getString("access_token");
WfWxShareEntity jsapiTicket = new WfWxShareEntity();
jsapiTicket = WxUtil.getTicket(access_token);
if (null != jsapiTicket ) {
log.info("获取jsapiTicket成功,有效时长{}秒 token:{}", jsapiTicket.getContent());
}
wxShareService.update(jsapiTicket);
}
}
工具类:WXUtil.java
package com.xxxx.utils; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map; import com.xxxx.entity.WfWxShareEntity; public class WxUtil { /**
* 向指定URL发送GET方法的请求
*
* 发送请求的URL
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static WfWxShareEntity getAccessToken(String appid, String appsecret) {
WfWxShareEntity accessToken = new WfWxShareEntity(); String result = "";
BufferedReader in = null;
try {
String urlNameString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +appid+ "&secret=" + appsecret; URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line =null;
while ((line = in.readLine()) != null) {
result += line;
}
// JSONObject jsonObj= FastJSONUtils.getJSONObject(result);
/* String access_token = jsonObj.getString("access_token");
long expires_in = Long.valueOf(jsonObj.getString("expires_in"));*/
accessToken.setId(1);
accessToken.setName("access_token");
accessToken.setContent(result);
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return accessToken ;
} /**
* 向指定URL发送GET方法的请求
* 发送请求的URL
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static WfWxShareEntity getTicket(String access_token) {
WfWxShareEntity jsapiTicket = new WfWxShareEntity();
String result = "";
BufferedReader in = null;
try {
String urlNameString = " https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" +access_token+ "&type=jsapi"; URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line =null;
while ((line = in.readLine()) != null) {
result += line;
}
/* JSONObject jsonObj= FastJSONUtils.getJSONObject(result);
String tiket = jsonObj.getString("ticket");
long expires_in = Long.valueOf(jsonObj.getString("expires_in"));
accessToken.setAccessToken(tiket);
accessToken.setExpirationTime(expires_in);*/
jsapiTicket.setId(2);
jsapiTicket.setName("jsapi_ticket");
jsapiTicket.setContent(result);
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return jsapiTicket ;
} }
实体类:WxSharEntity.java
package com.xxx.entity; import java.io.Serializable;
import java.util.Date; /**
* 微信分享
*
* @author xlf
* @email xlfbe696@gmail.com
* @date 2018-02-01 19:44:58
*/
public class WfWxShareEntity implements Serializable {
private static final long serialVersionUID = 1L; //
private Integer id;
//名称
private String name;
//内容
private String content; /**
* 设置:
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取:
*/
public Integer getId() {
return id;
}
/**
* 设置:名称
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取:名称
*/
public String getName() {
return name;
}
/**
* 设置:内容
*/
public void setContent(String content) {
this.content = content;
}
/**
* 获取:内容
*/
public String getContent() {
return content;
}
}
SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】的更多相关文章
- JAVA折腾微信公众平台(Token验证)[转]
JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...
- Java获取微信公众号新增用户事件
一.新建项目工程 新建一个spring项目 填写 Group 和 Artifact 信息 这步可以直接跳过,后面再按需导入 选择工程地址 二.配置 pom.xml <dependencies&g ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...
- 使用Java开发微信公众平台(二)——消息的接收与响应
上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...
- 使用Java开发微信公众平台(四)——消息的接收与响应
上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...
- 荒废了很久的java以及微信公众平台今天拿起来看了看:这里有很好的教程
我的微信公众号刚刚起步: ,感兴趣可以关注一下. 关于java开发微信公众号有一个很好的教程博客:推荐一下:http://blog.csdn.net/lyq8479/article/details/8 ...
- 运用Java对微信公众平台二次开发技术——开发者模式接入
当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWe ...
- java版微信公众平台自定义菜单创建代码实现
微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...
- 使用java开发微信公众平台(1)
目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...
随机推荐
- python多进程编程(一)
multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Pyt ...
- 我的Android进阶之旅------>Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- 一起talk C栗子吧(第七十八回:C语言实例--创建进程)
各位看官们,大家好.上一回中咱们说的是DIY ls命令续的样例.这一回咱们说的样例是:创建进程.闲话休提.言归正转. 让我们一起talk C栗子吧! 看官们.关于进程的概念,我们简单做个简单的介绍:进 ...
- spring 登录提示 Bad credentials
spring 日志输出:Authentication failed: password does not match stored value in spring security 3.2,检查密码发 ...
- 我的第三个Python小程序
99乘法表: # Author: fansik # Description: 99 times table # method 1 num1 = 0 num2 = 0 while num1 < 9 ...
- C#多线程基础,适合新手了解
一.创建线程 在整个系列文章中,我们主要使用Visual Studio 2015作为线程编程的主要工具.在C#语言中创建.使用线程只需要按以下步骤编写即可: 1.启动Visual Studio 201 ...
- Python之异常处理(Day27)
一.错误和异常 part1: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def test: pass #语法错 ...
- PsySH——PHP交互式控制台
PsySH PsySH is a runtime developer console, interactive debugger and REPL for PHP. PsySH是一个PHP的运行时开发 ...
- 机器学习算法之:KNN
基于实例的学习方法中,最近邻法和局部加权回归法用于逼近实值或离散目标函数,基于案例的推理已经被应用到很多任务中,比如,在咨询台上存储和复用过去的经验:根据以前的法律案件进行推理:通过复用以前求解的问题 ...
- CSR1010 sdk蓝牙
转:http://blog.csdn.net/lorain_lynies/article/details/52038640CSR1010 I/O开发须知:关于I/O操作的函数库被定义在头文件<p ...