为大家提供一个获取Weixin对象的工具类

如果大家下载了weixin4j的话,那么这个工具类对大家使用weixin4j将是一个非常好用的工具类。

首先我创建了一个数据表,来存放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.javapackage 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_tokenOAuthToken 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.保存TokensaveOAuthToken(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.保存TokensaveOAuthToken(oauthToken.getAccess_token(), oauthToken.getExpires_in());if (Configuration.isDebug()) {System.out.println("保存到数据库成功!");}} else {if (Configuration.isDebug()) {System.out.println("Weixin对象Token未过期,直接返回Weixin对象!");}}}return weixin;}//获取Accesstokenprivate 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;}//保存Accesstokenprivate 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));}}}}看看运行截图:灿烂甜美!那一瞬的激-情绽放,催人奋进!胜利,永远属于为梦想奋斗的人新乐吧

为大家提供一个获取Weixin对象的工具类

相关文章:

你感兴趣的文章:

标签云: