频道栏目
首页 > 微信学院 > 微信公众平台开发 > 正文
最简单实用微信公众号永久获取accesstoken
2017-08-15 11:53:00      个评论    来源:u011128775的博客  
收藏   我要投稿

最简单实用微信公众号永久获取accesstoken,微信AccessToken的有效时长为2小时,而每天获取的次数有限制,所以,把AccessToken保存起来,可以做到防止超过获取次数,永不失效。

1.项目结构目录(用的是intellij idea编辑器)

\

2.新建工具类AccessTokenUtil,源码如下:(请注意:用的是fastjson.jar工具类对json数据进行转换)

还有一点需要注意的是,项目工程WxTokenUtil.properties文件所在的路径,如果路径不在资源目录下,可能会获取不到

package com.cn.jyf.weixin.util;

import com.alibaba.fastjson.JSONObject;
import com.cn.jyf.weixin.poji.AccessToken;


import javax.net.ssl.HttpsURLConnection;
import java.io.*;

import java.net.URL;
import java.util.Properties;

/**
        * 获取微信APPID和secret工具类
        */

public  class AccessTokenUtil {

   //实用synchronized static可以防止同时被多实例化
    public synchronized static String getAccessToken() {
        //保存access_token文件名字
        String FileName = "WxTokenUtil.properties";
        try {
            // 从文件中获取token值及时间
            Properties prop = new Properties();// 属性集合对象
             //获取文件流
            InputStream fis = AccessTokenUtil.class.getClassLoader().getResourceAsStream(FileName);
            prop.load(fis);// 将属性文件流装载到Properties对象中
            fis.close();// 关闭流
            //获取Appid,APPsecret
            String APPID = prop.getProperty("APPID");
            String APPSECRET = prop.getProperty("APPSECRET");
            // 获取accesstoken,初始值为空,第一次调用之后会把值写入文件
            String access_token = prop.getProperty("access_token");
            String expires_in = prop.getProperty("expires_in");
            String last_time = prop.getProperty("last_time");

            int int_expires_in = 0;
            long long_last_time = 0;

            try {
                int_expires_in = Integer.parseInt(expires_in);
                long_last_time = Long.parseLong(last_time);

            } catch (Exception e) {

            }
            //得到当前时间
            long current_time = System.currentTimeMillis();

            // 每次调用,判断expires_in是否过期,如果token时间超时,重新获取,expires_in有效期为7200
            if ((current_time - long_last_time) / 1000 >= int_expires_in) {
                //获取token url
                String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                        + APPID + "&secret=" + APPSECRET;
                //发送http请求得到json流
                JSONObject jobject = httpRequest(url);
                //从json流中获取access_token
                String  j_access_token = (String) jobject.get("access_token");
                String  j_expires_in = (String) jobject.get("expires_in");

                //保存access_token
                if (j_access_token != null && j_expires_in != null) {
                    prop.setProperty("access_token", j_access_token);
                    prop.setProperty("expires_in", j_expires_in);
                    prop.setProperty("last_time", System.currentTimeMillis() + "");

                    URL url_ = AccessTokenUtil.class.getClassLoader().getResource(FileName);
                    FileOutputStream fos = new FileOutputStream(new File(url_.toURI()));
                    prop.store(fos, null);
                    fos.close();// 关闭流
                }
                //如果已经过期返回获取到的access_token
                return j_access_token;
            } else {
                //如果没有过期,返回从文件中读取的access_token
                return access_token;
            }
        } catch (Exception e) {
            return null;
        }


    }

    // 获取accesstoken
    public synchronized static JSONObject httpRequest(String requestUrl) {
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        try {

            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url
                    .openConnection();

            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            httpUrlConn.setRequestMethod("GET");

            httpUrlConn.connect();

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(
                    inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            // 释放资源
            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();
            jsonObject = JSONObject.parseObject(buffer.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }

        return jsonObject;
    }
}

3.WxTokenUtil.properties 文件(请注意在文件里面修改成自己的APPID和APPSECRET)

\

4.在任意类中一条语句就可以调用工具类获取Accesstoken:

String acesstoken=AccessTokenUtil.getAccessToken();
点击复制链接 与好友分享!回本站首页
上一篇:微信开发中的消息验证与消息回复
下一篇:微信小程序中显示倒计时
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站