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 ...
随机推荐
- layui关闭弹出层
layui关闭弹出层,今天我在vscode中使用p parent.layer.closeAll()发现没效果 换成layer.closeAll()就解决了这个问题. 由此我觉得关闭layui关闭弹出层 ...
- <数据结构与算法分析>读书笔记--运行时间计算
有几种方法估计一个程序的运行时间.前面的表是凭经验得到的(可以参考:<数据结构与算法分析>读书笔记--要分析的问题) 如果认为两个程序花费大致相同的时间,要确定哪个程序更快的最好方法很可能 ...
- <操作系统>并发
相关术语 进程的交互:根据进程相互之间知道对方的程度分类为如下几个等级. 进程间的资源竞争.并发进程访问同一资源的时候,会发生冲突.当两个进程访问同一资源的时候,由于并不知道对方的存在,两者之间没有信 ...
- Web安全入门学习
前言 最近在公司做Linux下的PHP开发,所以乘此机会学习了下Web安全,了解了常见的Web安全漏洞,以及对应的防御方法(使用DVWA进行学习). 暴力破解 场景 在类似用户登陆界面 ...
- [06] JSTL标准标签库
1.JSTL概述 之前在<[03-01] JSP自定义标签>中已经说明了自定义标签的概况,而JSTL也是一套标签库,不过是厂商已经定义好的标签库,我们不再需要自行进行定制,直接使用即可. ...
- 从0移植uboot (一) _配置分析
来源:Linux社区 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141018.htm 和绝大多数源码编译安装一样,uboot的 ...
- 办公室的远程传文件 的命令三种方式linux
不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...
- 生成、查看文件的MD5、SHA、SHA256值
生成文件的MD5.SHA.SHA256 Linux系统生成MD5.SHA.SHA256 md5sum file1.zip >> MD5.txt sha1sum file1.zip > ...
- 【php增删改查实例】第十七节 - 用户登录(1)
新建一个login文件,里面存放的就是用户登录的模块. <html> <head> <meta charset="utf-8"> <sty ...
- 汇编 SETG,SETL ,SETGE, SETLE指令
一.SETG SETZ(SETE) //取ZF标志位值 放到寄存器里 SETNZ(SETNE) == > SETG //setg cl//ZF==0 并 SF==0 并 OF==0 时 cl=1 ...