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 ...
随机推荐
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...
- Intel CPU 漏洞分析
Intel CPU漏洞分析报告 预备知识 存储分级 由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级.所以处理器会将用到的数 ...
- pacman详解及常见问题
安装软件包:软件包有很多可选依赖,是为软件提供额外功能, 安装软件时pacman 会输出可选依赖, 但不会在 pacman.log中,浏览安装软件的可选以来可用pacman -Si得到可选依赖的简短描 ...
- C# 判断一个文本文件的编码格式(转载)
文件的字符集在Windows下有两种,一种是ANSI,一种Unicode.对于Unicode,Windows支持了它的三种编码方式,一种是小尾编码(Unicode),一种是大尾编码(BigEndian ...
- China Intelligent Office Summit(2018.11.21)
时间:2018.11.21地点:中关村软件园国际会议中心
- @media响应式的屏幕适配
当页面小于960px的时候执行 @media screen and (max-width: 960px){ body{ background: #000; } } 等于960px尺寸的代码 @medi ...
- Codeforces 999D Equalize the Remainders (set使用)
题目连接:Equalize the Remainders 题意:n个数字,对m取余有m种情况,使得每种情况的个数都为n/m个(保证n%m=0),最少需要操作多少次? 每次操作可以把某个数字+1.输出最 ...
- DOS文件转换成UNIX文件格式详解
转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...
- Linux常用命令行
实时查看日志runtime.log最后100行 tail -f -n 100 runtime.log
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】
文章目录 前情概要 上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法. 使用controllerName.actionN ...