Java微信二次开发(六)
Token定时获取
需要导入库:添加log4j(slf4j-api-1.5.10.jar,slf4j-log4j12-1.5.10.jar,log4j-1.2.15.jar,并且在src下添加log4j.properties),json-lib-2.2.1-jdk15.jar
第一步:新建包com.wtz.vo,新建类Token.java,添加接口访问凭证类
package com.wtz.vo; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午2:30:52
* <p>version:1.0</p>
* <p>description:接口访问凭证类</p>
*/
public class Token {
//接口访问凭证
private String accessToken;
//接口有效期,单位:秒
private int expiresIn; public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
第二步:找到包com.wtz.util,新建类MyX509TrustManager.java类,这个类是用来做https请求的证书信任管理器
package com.wtz.util; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午2:40:51
* <p>version:1.0</p>
* <p>description:证书信任管理器(用于https请求)</p>
*/
public class MyX509TrustManager implements X509TrustManager{ @Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub } @Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub } @Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
第三步:在src下添加log4j.properties
log4j.rootLogger=info,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %m%n
第四步:找到包com.wtz.util,新建类WeixinUtil.java
package com.wtz.util; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException; import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager; import net.sf.json.JSONObject; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wtz.vo.Token; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午5:08:02
* <p>version:1.0</p>
* <p>description:通用https请求工具类</p>
*/
public class WeixinUtil {
//需要导入库slf4j-api-1.5.10.jar和slf4j-log4j12-1.5.10.jar以及log4j-1.2.15.jar和log4j.properties
private static Logger log = LoggerFactory.getLogger(WeixinUtil.class); //凭证获取(GET)
public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; /**
* 发送https请求
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET/POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpsRequest(String requestUrl,String requestMethod,String outputStr){
//需要导入库json-lib-2.2.1-jdk15.jar
JSONObject jsonObject = null; //创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager()};
try {
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); //从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); connection.setSSLSocketFactory(ssf); connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false); //设置请求方式(GET/POST)
connection.setRequestMethod(requestMethod); //当outputStr不为null时向输出流写入数据
if(null != outputStr){
OutputStream outputStream = connection.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
} //从输入流读取返回内容
InputStream inputStream = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while((str = bufferedReader.readLine()) != null){
buffer.append(str);
} //释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
connection.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException e) {
log.error("连接超时:{}",e);
} catch (NoSuchAlgorithmException e) {
log.error("https请求异常:{}",e);
} catch (NoSuchProviderException e) {
log.error("https请求异常:{}",e);
} catch (KeyManagementException e) {
log.error("https请求异常:{}",e);
} catch (MalformedURLException e) {
log.error("https请求异常:{}",e);
} catch (IOException e){
log.error("https请求异常:{}",e);
} catch (Exception e) {
log.error("https请求异常:{}",e);
} return jsonObject;
} /**
* 获取接口访问凭证
*
* @param appid
* @param appsecret 密钥
* @return
*/
public static Token getToken(String appid,String appsecret){
Token token = null;
String requestUrl = token_url.replace("APPID", appid).replace("APPSecret", appsecret); //发起GET请求获取凭证
JSONObject jsonObject = httpsRequest(requestUrl,"GET",null); if(null != jsonObject){
token = new Token();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
} return token;
}
}
第五步:找到包com.wtz.util下的Parameter.java类,修改增加appSecret
package com.wtz.util; /**
* @author wangtianze QQ:864620012
* @date 2017年4月21日 下午9:27:50
* <p>version:1.0</p>
* <p>description:参数api</p>
*/
public class Parameter {
//token
public static String token = "wangtianze";
//随机戳
public static String encodingAESKey = "X78dYU3MXpijKArRbiozTRq0jZZnjxxvuB4n8KJwRH1";
//应用AppID
public static String appId = "wx9621c31e147dfdf9";
//密钥
public static String appSecret = "a8eec7e642ecece4294daa18c8747035";
}
第六步:找到包com.wtz.util,新建类TokenThread.java类
package com.wtz.util; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wtz.vo.Token; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午9:30:53
* <p>version:1.0</p>
* <p>description:定义线程定时获取微信access_token</p>
*/
public class TokenThread implements Runnable{
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
//第三方用户唯一凭证
public static String appid = "wx9621c31e147dfdf9";
//第三方用户唯一凭证密钥
public static String appsecret = "a8eec7e642ecece4294daa18c8747035"; public static Token accessToken = null; public static Token getAccessToken() {
return accessToken;
} public static void setAccessToken(Token accessToken) {
TokenThread.accessToken = accessToken;
} public void run(){
while(true){
accessToken = WeixinUtil.getToken(appid,appsecret);
try{
if(null != accessToken){
log.info("获取access_token成功,有效时长{}秒 token:{}",accessToken.getExpiresIn(),accessToken.getAccessToken());
//休眠7000秒
Thread.sleep((accessToken.getExpiresIn() - 200)*1000);
}else{
//如果accessToken为null,则60秒后再获取
Thread.sleep(60*1000);
}
} catch(InterruptedException e) {
try{
Thread.sleep(60*1000);
} catch(InterruptedException e1) {
log.error("{}",e1);
}
log.error("{}",e);
}
}
}
}
第七步:修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>weixinValidation</display-name> <servlet>
<servlet-name>InitGetTokenServlet</servlet-name>
<servlet-class>com.wtz.service.InitGetTokenServlet</servlet-class>
<init-param>
<param-name>appid</param-name>
<param-value>wx9621c31e147dfdf9</param-value>
</init-param>
<init-param>
<param-name>appsecret</param-name>
<param-value>a8eec7e642ecece4294daa18c8747035</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet> <servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.wtz.service.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/api/login</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
第八步:找到包com.wtz.service,新建类InitGetTokenServlet.java类
package com.wtz.service; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wtz.util.TokenThread; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午8:21:28
* <p>version:1.0</p>
* <p>description:初始化定期获取Token的线程</p>
*/
public class InitGetTokenServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(InitGetTokenServlet.class);
@Override
public void init() throws ServletException {
//修改web.xml中配置的参数
TokenThread.appid = getInitParameter("appid");
TokenThread.appsecret = getInitParameter("appsecret"); log.info("微信 api appid:{}",TokenThread.appid);
log.info("微信 api appsecret:{}",TokenThread.appsecret); //未配置appid和appsecret时给出提示
if("".equals(TokenThread.appid) || "".equals(TokenThread.appsecret)){
log.error("appid and appsecret配置错误,请仔细检查!");
}else{
//启动定时获取access_token的线程
new Thread(new TokenThread()).start();
}
}
}
Token定时获取完成
Java微信二次开发(六)的更多相关文章
- Java微信二次开发(一)
准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...
- Java微信二次开发(五)
消息加密 需要到入库:commons-io-2.4.jar,commons-codec-1.9.jar(在官网的Java微信加密demo下) 第一步:访问https://mp.weixin.qq.co ...
- Java微信二次开发(七)
自定义菜单 第一步:新建包com.wtz.menu,新建类Button.java package com.wtz.menu; /** * @author wangtianze QQ:864620012 ...
- Java微信公众平台开发(六)--微信开发中的token获取
转自:http://www.cuiyongzhi.com/post/44.html (一)token的介绍 引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access ...
- Java微信二次开发(十)
生成带参数的二维码以及长链接转短链接 第一步:找到包com.wtz.vo,新建类WeixinQRCode.java package com.wtz.vo; /** * @author wangtian ...
- Java微信二次开发(三)
各种类型消息的封装 第一步:找到com.wtz.message.response包,新建类Image.java package com.wtz.message.response; /** * @aut ...
- Java微信二次开发(九)
多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...
- Java微信二次开发(八)
高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...
- Java微信二次开发(二)
第二天,做微信文本消息接口请求与发送 需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar 第一步:新建包com.wtz.message.response,新建类BaseMe ...
随机推荐
- Linux系统学习之网络管理
网络接口配置 使用ifconfig检查和配置网卡 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ...
- Java相关框架资料及其基础资料、进阶资料、测试资料之分享
个人说明:只为分享,不为其他,愿所有的程序员们在编程的世界自由翱翔吧! 在我看来,只有不断实战,不断学习,不断积累,不断归纳总结,形成自己的核心竞争力,方能在未来竞争中脱颖而出! 程序员谨记!重要的事 ...
- hibernate validator 动态返回国际化提示
一.说明 以下方法实现了读取指定国际化文件的校验器. 1. MyMessages是自定义的国际化文件,放置在src的根目录下 例如有MyMessages_en_US.properties.MyMess ...
- Python2.7-内置类型
1.布尔型:True.False 2.数值型:int.float.long.complex 3.迭代器型:有 __iter__() 方法和 next() 方法,生成器也是其中一种 4.序列型(sequ ...
- Django ORM相关
1. ORM 外键关联查询和多对多关系正反向查询 Class Classes(): name = CF class Student(): name = CF class = FK(to="C ...
- Saltstack学习之二:target与模块方法的运行
对象的管理 saltstack系统中我们的管理对象叫做target,在master上我们可以采用不同的target去管理不同的minion,这些target都是通过去管理和匹配minion的id来做的 ...
- 液晶屏MIPI接口与LVDS接口区别(总结)
液晶屏接口类型有LVDS接口.MIPI DSIDSI接口(下文只讨论液晶屏LVDS接口,不讨论其它应用的LVDS接口,因此说到LVDS接口时无特殊说明都是指液晶屏LVDS接口),它们的主要信号成分都是 ...
- Luogu4700 CEOI2011 Traffic Tarjan、搜索
传送门 题意:给出平面上$N$个点,它们一定在左下角为$(0,0)$,右上角为$(A,B)$的一个矩形内的整点上(包括边界),而且会给出$M$条呈直线的边,其中有有向边也有无向边,保证任意两条边不会在 ...
- Java 面试题 队列
Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. Q ...
- 线程中join()的用法
Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public static void main(String[] args) throws Interrupted ...