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

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

首先我创建了一个数据表,来存放access_token

  1. CREATE TABLE `t_token` (                   
  2.    `id` int(11) NOT NULL AUTO_INCREMENT,    
  3.    `access_token` varchar(120) NOT NULL,    
  4.    `expires_in` int(11) NOT NULL,       
  5.    `createTime` datetime NOT NULL,          
  6.    PRIMARY KEY (`id`)                       
  7.  ) ENGINE=InnoDB DEFAULT CHARSET=UTF8;  
接下来,请大家看WeixinManager.java
  1. package com.ansitech.weixin4j.demo;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9. import java.util.Date;  
  10. import org.weixin4j.Configuration;  
  11. import org.weixin4j.Weixin;  
  12. import org.weixin4j.WeixinException;  
  13. import org.weixin4j.http.OAuthToken;  
  14.   
  15. /** 
  16.  * 优化的Weixin获取管理类 
  17.  * 
  18.  * 有的人喜欢叫WeixinHelp,有的人喜欢叫WeixinUtil 
  19.  * 
  20.  * 不管叫什么都无所谓,根据个人喜好起名字 
  21.  * 
  22.  * @author weixin4j@ansitech.com 
  23.  */  
  24. public class WeixinManager {  
  25.   
  26.     private static Weixin weixin = null;  
  27.     private static String accessToken = null;  
  28.     private final static String url = "jdbc:mysql://127.0.0.1:3306/weixin4j";  
  29.     private final static String name = "root";  
  30.     private final static String pwd = "12344";  
  31.     private final static String driver = "com.mysql.jdbc.Driver";  
  32.       
  33.     public static Weixin getWeixin() throws WeixinException {  
  34.         //获取配置  
  35.         String appId = Configuration.getOAuthAppId();  
  36.         String secret = Configuration.getOAuthSecret();  
  37.         if (weixin == null || accessToken == null) {  
  38.             if (Configuration.isDebug()) {  
  39.                 System.out.println("第一次运行,初始化Weixin对象");  
  40.             }  
  41.             //1.初始化Weixin对象  
  42.             weixin = new Weixin();  
  43.             //先从数据库查询,是否有未过期的access_token  
  44.             OAuthToken oauthToken = getOAuthToken();  
  45.             //判断,如果为null,则说明已过期,需要重新登录获取  
  46.             if (oauthToken == null) {  
  47.                 if (Configuration.isDebug()) {  
  48.                     System.out.println("从数据库中,未读取到Token或已过期!");  
  49.                 }  
  50.                 if (Configuration.isDebug()) {  
  51.                     System.out.println("准备访问微信服务器,进行access_token获取!");  
  52.                 }  
  53.                 //2.第一次初始化,需要进行登录  
  54.                 oauthToken = weixin.login(appId, secret);  
  55.                 //重置  
  56.                 accessToken = oauthToken.getAccess_token();  
  57.                 if (Configuration.isDebug()) {  
  58.                     System.out.println("访问微信服务器,获取access_token成功!");  
  59.                 }  
  60.                 if (Configuration.isDebug()) {  
  61.                     System.out.println("准备保存到数据库!");  
  62.                 }  
  63.                 //3.保存Token  
  64.                 saveOAuthToken(oauthToken.getAccess_token(), oauthToken.getExpires_in());  
  65.                 if (Configuration.isDebug()) {  
  66.                     System.out.println("保存到数据库成功!");  
  67.                 }  
  68.             } else {  
  69.                 if (Configuration.isDebug()) {  
  70.                     System.out.println("从数据库中,读取到Token,直接初始化!");  
  71.                 }  
  72.                 //2.初始化  
  73.                 weixin.init(oauthToken.getAccess_token(), appId, secret, oauthToken.getExpires_in());  
  74.             }  
  75.         } else {  
  76.             if (Configuration.isDebug()) {  
  77.                 System.out.println("已存在Weixin对象,准备验证Token是否过期!");  
  78.             }  
  79.             //2.已经初始化,直接登录,如果未过期,默认不重新获取,如果重新获取则会改变accessToken,需要重新保存到数据库  
  80.             OAuthToken oauthToken = weixin.login(appId, secret);  
  81.             //如果相等,则不相同则说明重新获取过,需要保存到数据库  
  82.             if (!oauthToken.getAccess_token().equals(accessToken)) {  
  83.                 if (Configuration.isDebug()) {  
  84.                     System.out.println("Weixin对象Token已过期,已重新获取access_token,准备保存到数据库!");  
  85.                 }  
  86.                 //重置  
  87.                 accessToken = oauthToken.getAccess_token();  
  88.                 //3.保存Token  
  89.                 saveOAuthToken(oauthToken.getAccess_token(), oauthToken.getExpires_in());  
  90.                 if (Configuration.isDebug()) {  
  91.                     System.out.println("保存到数据库成功!");  
  92.                 }  
  93.             } else {  
  94.                 if (Configuration.isDebug()) {  
  95.                     System.out.println("Weixin对象Token未过期,直接返回Weixin对象!");  
  96.                 }  
  97.             }  
  98.         }  
  99.         return weixin;  
  100.     }  
  101.   
  102.     //获取Accesstoken  
  103.     private static OAuthToken getOAuthToken() {  
  104.         OAuthToken token = null;  
  105.         try {  
  106.             //加载驱动  
  107.             Class.forName(driver);  
  108.         } catch (ClassNotFoundException ex) {  
  109.             System.out.println("加载驱动异常!");  
  110.         }  
  111.         Connection conn = null;  
  112.         Statement st = null;  
  113.         ResultSet rs = null;  
  114.         try {  
  115.             //创建数据库链接  
  116.             conn = DriverManager.getConnection(url, name, pwd);  
  117.             //创建处理器  
  118.             st = conn.createStatement();  
  119.             //查询Token,读取1条记录  
  120.             rs = st.executeQuery("select * from t_token order by createTime desc limit 0,1");  
  121.             if (rs.next()) {  
  122.                 String access_token = rs.getString("access_token");  
  123.                 int expires_in = rs.getInt("expires_in");  
  124.                 java.sql.Timestamp createTime = rs.getTimestamp("createTime");  
  125.                 //先直接判断是否过期,获取当前时间毫秒数  
  126.                 //为了防止1秒前未过期,1秒后过期  
  127.                 //我们设定,初始化是,如果再5分钟内,算未过期,超过1分钟则重新获取  
  128.                 long now = new Date().getTime() + (1 * 60 * 1000);  
  129.                 //过期时间 = 创建时间 + (过期秒数 * 1000)  
  130.                 long exprexpiredTime = createTime.getTime() + (expires_in * 1000);  
  131.                 if (now < exprexpiredTime) {  
  132.                     //计算剩余过期时间  
  133.                     long expires = now - exprexpiredTime - (1 * 60 * 1000);  
  134.                     //没有过期,初始化后返回  
  135.                     token = new OAuthToken(access_token, (int) (expires / 1000));  
  136.                 }  
  137.             }  
  138.         } catch (SQLException ex) {  
  139.             System.out.println("数据库操作异常:" + ex.getMessage());  
  140.         } finally {  
  141.             if (rs != null) {  
  142.                 try {  
  143.                     rs.close();  
  144.                 } catch (SQLException ex) {  
  145.                     System.out.println("关闭数据集异常:" + ex.getMessage());  
  146.                 }  
  147.             }  
  148.             if (st != null) {  
  149.                 try {  
  150.                     st.close();  
  151.                 } catch (SQLException ex) {  
  152.                     System.out.println("关闭处理器异常:" + ex.getMessage());  
  153.                 }  
  154.             }  
  155.             if (conn != null) {  
  156.                 try {  
  157.                     conn.close();  
  158.                 } catch (SQLException ex) {  
  159.                     System.out.println("关闭数据库链接异常:" + ex.getMessage());  
  160.                 }  
  161.             }  
  162.         }  
  163.         return token;  
  164.     }  
  165.   
  166.     //保存Accesstoken  
  167.     private static void saveOAuthToken(String access_token, int expires_in) {  
  168.         try {  
  169.             //加载驱动  
  170.             Class.forName(driver);  
  171.         } catch (ClassNotFoundException ex) {  
  172.             System.out.println("加载驱动异常!");  
  173.         }  
  174.         Connection conn = null;  
  175.         PreparedStatement pst = null;  
  176.         try {  
  177.             //创建数据库链接  
  178.             conn = DriverManager.getConnection(url, name, pwd);  
  179.             //创建预处理器  
  180.             pst = conn.prepareStatement("insert into t_token(access_token,expires_in,createTime)values(?,?,?)");  
  181.             pst.setString(1, access_token);  
  182.             pst.setInt(2, expires_in);  
  183.             long now = new Date().getTime();  
  184.             pst.setTimestamp(3new java.sql.Timestamp(now));  
  185.             pst.execute();  
  186.         } catch (SQLException ex) {  
  187.             System.out.println("数据库操作异常:" + ex.getMessage());  
  188.         } finally {  
  189.             if (pst != null) {  
  190.                 try {  
  191.                     pst.close();  
  192.                 } catch (SQLException ex) {  
  193.                     System.out.println("关闭预处理器异常:" + ex.getMessage());  
  194.                 }  
  195.             }  
  196.             if (conn != null) {  
  197.                 try {  
  198.                     conn.close();  
  199.                 } catch (SQLException ex) {  
  200.                     System.out.println("关闭数据库链接异常:" + ex.getMessage());  
  201.                 }  
  202.             }  
  203.         }  
  204.     }  
  205. }  
当然少不了使用演示DEMO啦:
  1. package com.ansitech.weixin4j.demo;  
  2.   
  3. import java.util.List;  
  4. import org.weixin4j.Data;  
  5. import org.weixin4j.Followers;  
  6. import org.weixin4j.Weixin;  
  7. import org.weixin4j.WeixinException;  
  8.   
  9. /** 
  10.  * 如何实例化Weixin对象 
  11.  * 
  12.  * @author weixin4j<weixin4j@ansitech.com> 
  13.  */  
  14. public class WeixinDemo {  
  15.   
  16.     public static void main(String[] args) throws WeixinException {  
  17.         //1.获取微信操作对象  
  18.         Weixin weixin = WeixinManager.getWeixin();  
  19.         //接下来就可以调用Weixin对象的其他方法了  
  20.         //3.获取关注者列表  
  21.         Followers followers = weixin.getUserList(null);  
  22.         //打印:关注者总数  
  23.         System.out.println("关注者总数:" + followers.getTotal());  
  24.         //打印:本次获取关注者记录数量  
  25.         System.out.println("本次获取关注者数量:" + followers.getCount());  
  26.         //打印:关注者openId数据  
  27.         Data data = followers.getData();  
  28.         if (data != null) {  
  29.             //获取openId集合  
  30.             List<String> openIdList = data.getOpenid();  
  31.             //打印:前3条记录  
  32.             for (int i = 0; i < openIdList.size(); i++) {  
  33.                 if (i > 2) {  
  34.                     break;  
  35.                 }  
  36.                 System.out.println("第" + i + "条 " + openIdList.get(i));  
  37.             }  
  38.         }  
  39.     }  
  40. }  
看看运行截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值