您的位置:首页 > 其它

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

2017-07-10 16:11 621 查看
如果大家下载了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(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啦:

[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下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: