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

xiaoxiao2021-02-28  139

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

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

[sql] view plain copy print ? 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 [java] view plain copy print ? 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(3new 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啦: [java] view plain copy print ? 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下载

转载请注明原文地址: https://www.6miu.com/read-31365.html

最新回复(0)