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安装solr
solr官网下载地址为:http://mirror.bit.edu.cn/apache/lucene/solr/ 以7.6.0版本作为实践 1.下载 wget http://mirror.bit.ed ...
- centos 6.5 gogs迁移外部仓库报错
安装gogs git软件后,使用迁移外部仓库功能,提示“你没有获得导入本地仓库的权限”,发现是因为使用的ssh的链接进行导入 目前gogs咱不支持,随后使用github的https链接导入,依然报错 ...
- js深度克隆对象
js深度克隆对象 js深度克隆对象简单的记录一下,如下代码: var obj = { typeOf: function(obj) { const toString = Object.prototype ...
- webview与JS的交互
webview与JS的交互 一:hybird app, web app 和 native app 的区别 Web App Hybird App 混合Native App 开发成本 低 中 高 维护 ...
- protobuf可变长编码的实现原理
protobuf中的整数,如int32.int64.uint32.uint64.sint32.sint64.bool和enum,采用可变长编码,即varints. 这样做的好处是,可以节省空间.根据整 ...
- easyui datagrid JS加载样式 表头乱
解决方案,找了下资料,加一个遮罩层,提升用户体验. <script type="text/javascript"> var width = document.docum ...
- Sublime3 - 插件cssrem
一个CSS的px值转rem值的Sublime Text 3自动完成插件. 插件效果如下: 安装: 1. 现在本地clone一份: git clone https://github.com/hyb628 ...
- 关于LED效率,这4点你应该知道
关于LED效率,这4点你应该知道 发布时间:2017-08-22 12:09:35 原创:中国LED网 内容概要: 1. 这些灯的一些光通过转换器或磷光体转换成较长波长(绿色.黄色和红色光)的光,将所 ...
- 苹果与Windows双系统时间不同步的解决办法
步骤:打开C盘>Windows>System32,找到cmd.exe,右键以管理员的身份运行. Reg add HKLM\SYSTEM\CurrentControlSet\Control\ ...
- excel的宏与VBA入门——代码调试
直接介绍重点: 常用的操作是导航栏的逐句与断点: 添加断点:调试->切换断点 单步运行:调试->逐句 查看变量的窗口:视图->本地窗口