weixin4j开发—为大家提供一个获取Weixin对象的工具类
2015-04-27 12:05
441 查看
如果大家下载了weixin4j的话,那么这个工具类对大家使用weixin4j将是一个非常好用的工具类。
首先我创建了一个数据表,来存放access_token
您可以加入我们的官方QQ群:365736353,专业人为您解答各种技术问题。
转载至:http://www.weixin4j.org/article/weixin-manager.html
更多文章,请关注:http://www.weixin4j.org/
其他文章推荐
手把手教您开发JAVA微信SDK-新手接入
JAVA微信开发weixin4j新手接入之Servlet方式接入
手把手教您开发JAVA微信SDK-接受消息
手把手教您开发JAVA微信SDK-发送消息
weixin4j-0.0.1.jar下载
首先我创建了一个数据表,来存放access_token
CREATE TABLE `t_token` ( `id` int(11) NOT NULL AUTO_INCREMENT, `access_token` varchar(120) NOT NULL, `expires_in` int(11) NOT NULL, `createTime` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8;接下来,请大家看WeixinManager.java
package com.ansitech.weixin4j.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; import org.weixin4j.Configuration; import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.http.OAuthToken; /** * 优化的Weixin获取管理类 * * 有的人喜欢叫WeixinHelp,有的人喜欢叫WeixinUtil * * 不管叫什么都无所谓,根据个人喜好起名字 * * @author weixin4j@ansitech.com */ public class WeixinManager { private static Weixin weixin = null; private static String accessToken = null; private final static String url = "jdbc:mysql://127.0.0.1:3306/weixin4j"; private final static String name = "root"; private final static String pwd = "12344"; private final static String driver = "com.mysql.jdbc.Driver"; public static Weixin getWeixin() throws WeixinException { //获取配置 String appId = Configuration.getOAuthAppId(); String secret = Configuration.getOAuthSecret(); if (weixin == null || accessToken == null) { if (Configuration.isDebug()) { System.out.println("第一次运行,初始化Weixin对象"); } //1.初始化Weixin对象 weixin = new Weixin(); //先从数据库查询,是否有未过期的access_token OAuthToken oauthToken = getOAuthToken(); //判断,如果为null,则说明已过期,需要重新登录获取 if (oauthToken == null) { if (Configuration.isDebug()) { System.out.println("从数据库中,未读取到Token或已过期!"); } if (Configuration.isDebug()) { System.out.println("准备访问微信服务器,进行access_token获取!"); } //2.第一次初始化,需要进行登录 oauthToken = weixin.login(appId, secret); //重置 accessToken = oauthToken.getAccess_token(); if (Configuration.isDebug()) { System.out.println("访问微信服务器,获取access_token成功!"); } if (Configuration.isDebug()) { System.out.println("准备保存到数据库!"); } //3.保存Token saveOAuthToken(oauthToken.getAccess_token(), oauthToken.getExpires_in()); if (Configuration.isDebug()) { System.out.println("保存到数据库成功!"); } } else { if (Configuration.isDebug()) { System.out.println("从数据库中,读取到Token,直接初始化!"); } //2.初始化 weixin.init(oauthToken.getAccess_token(), appId, secret, oauthToken.getExpires_in()); } } else { if (Configuration.isDebug()) { System.out.println("已存在Weixin对象,准备验证Token是否过期!"); } //2.已经初始化,直接登录,如果未过期,默认不重新获取,如果重新获取则会改变accessToken,需要重新保存到数据库 OAuthToken oauthToken = weixin.login(appId, secret); //如果相等,则不相同则说明重新获取过,需要保存到数据库 if (!oauthToken.getAccess_token().equals(accessToken)) { if (Configuration.isDebug()) { System.out.println("Weixin对象Token已过期,已重新获取access_token,准备保存到数据库!"); } //重置 accessToken = oauthToken.getAccess_token(); //3.保存Token saveOAuthToken(oauthToken.getAccess_token(), oauthToken.getExpires_in()); if (Configuration.isDebug()) { System.out.println("保存到数据库成功!"); } } else { if (Configuration.isDebug()) { System.out.println("Weixin对象Token未过期,直接返回Weixin对象!"); } } } return weixin; } //获取Accesstoken private static OAuthToken getOAuthToken() { OAuthToken token = null; try { //加载驱动 Class.forName(driver); } catch (ClassNotFoundException ex) { System.out.println("加载驱动异常!"); } Connection conn = null; Statement st = null; ResultSet rs = null; try { //创建数据库链接 conn = DriverManager.getConnection(url, name, pwd); //创建处理器 st = conn.createStatement(); //查询Token,读取1条记录 rs = st.executeQuery("select * from t_token order by createTime desc limit 0,1"); if (rs.next()) { String access_token = rs.getString("access_token"); int expires_in = rs.getInt("expires_in"); java.sql.Timestamp createTime = rs.getTimestamp("createTime"); //先直接判断是否过期,获取当前时间毫秒数 //为了防止1秒前未过期,1秒后过期 //我们设定,初始化是,如果再5分钟内,算未过期,超过1分钟则重新获取 long now = new Date().getTime() + (1 * 60 * 1000); //过期时间 = 创建时间 + (过期秒数 * 1000) long exprexpiredTime = createTime.getTime() + (expires_in * 1000); if (now < exprexpiredTime) { //计算剩余过期时间 long expires = now - exprexpiredTime - (1 * 60 * 1000); //没有过期,初始化后返回 token = new OAuthToken(access_token, (int) (expires / 1000)); } } } catch (SQLException ex) { System.out.println("数据库操作异常:" + ex.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { System.out.println("关闭数据集异常:" + ex.getMessage()); } } if (st != null) { try { st.close(); } catch (SQLException ex) { System.out.println("关闭处理器异常:" + ex.getMessage()); } } if (conn != null) { try { conn.close(); } catch (SQLException ex) { System.out.println("关闭数据库链接异常:" + ex.getMessage()); } } } return token; } //保存Accesstoken private static void saveOAuthToken(String access_token, int expires_in) { try { //加载驱动 Class.forName(driver); } catch (ClassNotFoundException ex) { System.out.println("加载驱动异常!"); } Connection conn = null; PreparedStatement pst = null; try { //创建数据库链接 conn = DriverManager.getConnection(url, name, pwd); //创建预处理器 pst = conn.prepareStatement("insert into t_token(access_token,expires_in,createTime)values(?,?,?)"); pst.setString(1, access_token); pst.setInt(2, expires_in); long now = new Date().getTime(); pst.setTimestamp(3, new java.sql.Timestamp(now)); pst.execute(); } catch (SQLException ex) { System.out.println("数据库操作异常:" + ex.getMessage()); } finally { if (pst != null) { try { pst.close(); } catch (SQLException ex) { System.out.println("关闭预处理器异常:" + ex.getMessage()); } } if (conn != null) { try { conn.close(); } catch (SQLException ex) { System.out.println("关闭数据库链接异常:" + ex.getMessage()); } } } } }当然少不了使用演示DEMO啦:
package com.ansitech.weixin4j.demo; import java.util.List; import org.weixin4j.Data; import org.weixin4j.Followers; import org.weixin4j.Weixin; import org.weixin4j.WeixinException; /** * 如何实例化Weixin对象 * * @author weixin4j<weixin4j@ansitech.com> */ public class WeixinDemo { public static void main(String[] args) throws WeixinException { //1.获取微信操作对象 Weixin weixin = WeixinManager.getWeixin(); //接下来就可以调用Weixin对象的其他方法了 //3.获取关注者列表 Followers followers = weixin.getUserList(null); //打印:关注者总数 System.out.println("关注者总数:" + followers.getTotal()); //打印:本次获取关注者记录数量 System.out.println("本次获取关注者数量:" + followers.getCount()); //打印:关注者openId数据 Data data = followers.getData(); if (data != null) { //获取openId集合 List<String> openIdList = data.getOpenid(); //打印:前3条记录 for (int i = 0; i < openIdList.size(); i++) { if (i > 2) { break; } System.out.println("第" + i + "条 " + openIdList.get(i)); } } } }看看运行截图:
您可以加入我们的官方QQ群:365736353,专业人为您解答各种技术问题。
转载至:http://www.weixin4j.org/article/weixin-manager.html
更多文章,请关注:http://www.weixin4j.org/
其他文章推荐
手把手教您开发JAVA微信SDK-新手接入
JAVA微信开发weixin4j新手接入之Servlet方式接入
手把手教您开发JAVA微信SDK-接受消息
手把手教您开发JAVA微信SDK-发送消息
weixin4j-0.0.1.jar下载
相关文章推荐
- weixin4j开发—为大家提供一个获取Weixin对象的工具类
- 在windows平台工作和开发的伙伴们,发现一个很牛B的公司Sysinternals,提供的一些工具大家可以看看是否可以用
- 如何设计一个软件的架构,使它可以提供二次开发的功能?
- 一个经典的对象级别插件的开发
- 【蛙蛙推荐】想设计一个关于软件开发的元搜索引擎,希望大家支持
- 代码调用DruidDataSource来管理conn连接,同时声明了ThreadLocal对象来保存每次线程请求所获取的连接,这样可以避免每个new一个JDBC
- 设计技巧27:代理 Proxy 为另外一个对象提供替身或者站位符以控制对对象的访问
- JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用
- Windows Phone 8.1开发:如何从ListView中,获取ScrollViewer对象
- 分享一个js对象开发组件写法
- 给大家免费提供一个QQ邮件智能搜捕器
- EL表达式获取数据/执行运算/获取web开发中的对象
- Visual Studio 2013开发 mini-filter driver step by step 获取可执行文件名称 - 实现process monitor的一个功能 (10)
- 根据CR获取CR下的开发对象
- 【游戏服务器开发-准备篇】对象Json序列化工具类
- 用asp.net开发的一个系统,如何给用户提供数据库备份和恢复的功能?
- 安卓获取context是一个null对象的引用所出现的其中一种情况!坑
- 提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
- 一个简单的java对象序列化工具类
- 怎样获取一个集合中不同对象的同一个属性?