java的微信公众号开发(文件存取access_token代码记录篇)

本文为代码记录,是最开始写的文件存取access_token方法,代码是否好使未经过验证。复用需谨慎。

package com.weixin.model.Dispatcher;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.google.gson.Gson;
import com.weixin.model.Po.WechatUserinfo;
/**
 * 
 * @author xx
 *作用:获取token的工具类
 */

public class AccessToken {
	
	WechatUserinfo accessToken;
	
	//获得新的access_token
	public String getAccessToken(String APPID,String APPSECRET) {
		APPID="wxe47ae801a9375665";
		APPSECRET="f2ae94a7c20ac5c0bb5956f2431a5393";
		//1.拼接api要求的获取access_token 的httpsurl链接
	    String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
	            + APPID + "&secret=" + APPSECRET;
	   
	    URL reqURL=null;
	    HttpsURLConnection httpsConn=null;
	    InputStreamReader isr=null;
		try {
			 //2.创建一个url对象
			reqURL = new URL(urlString);
			 
			try {
				//3.获取一个链接
				httpsConn= (HttpsURLConnection) reqURL.openConnection();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    // 4.取得该连接的输入流,用来读取响应内容
		    try {
				isr = new InputStreamReader(httpsConn.getInputStream());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    // 4.1读取服务器的响应内容并显示
		    // 4.2 InputStreamReader的int read(char []cbuf);//将读取到的字符存到数组中。返回读取的字符数。
		    char[] chars = new char[1024];
		    String reslut = "";
		    int len;
		    try {
		    	//拼接字符串
				while ((len = isr.read(chars)) != -1) {
				    reslut += new String(chars, 0, len);
				}
				isr.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    /*
		     * 5.将获取的json转化为java中的bean。引入了第三方jar:GSON
		     */
		    // 5.1 实例化一个Gson对象
		    Gson gson = new Gson();
		    // 5.2gson.formJson()两个参数,一个是字符串,一个是要转换成的对象的类型
		    //AccessToken access_token是一个自己创建的javabean
		   WechatUserinfo accessToken = gson.fromJson(reslut, WechatUserinfo.class);
		    //如果值不为空,返回access_token
		    if (accessToken.getAccess_token() != null) {
		        return accessToken.getAccess_token();
		    	
		    } else {
		        System.out.println("获取access_token失败,请检查");
		        return null;
		    }
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	//获得已经有的access_token
	public String getOldaccesstoken(String APPID,String APPSECRET) {
		final long MAX_TIME = 7200 * 1000;
		Gson gson=new Gson();
		String Accesstoken=null;
		//1.创建一个路径对象,用来保存access_token
		File file = new File("temp_access_token.temp");
		//2.如果文件不存在
		try {
		if(!file.exists()) {
			//2.1创建文件
			file.createNewFile();
		}
			//2.2如果文件大小等于0,说明第一次使用,存入Access_token
		if (file.length() == 0) {
		        	//2.2.1得到access_token
		        	Accesstoken = getAccessToken(APPID,APPSECRET);
		        	//2.2.2实例化一个FileOutputStream对象, 不允许追加
		            FileOutputStream fos = new FileOutputStream(file, false);
		            //2.2.3实例化一个AccessToken,将access_token和当前时间存进去
		             WechatUserinfo accessToken=new WechatUserinfo();
		            accessToken.setAccess_token(Accesstoken);
		            accessToken.setExpires_in(System.currentTimeMillis() + "");
		            //2.2.4转换成json格式的字符串
		            String json = gson.toJson(accessToken);
		            //2.2.5将字符串写入到file文件中,getBytes()将字符串转换成字节数组byte[]
		            fos.write((json).getBytes());
		            fos.close();
		            //2.2.6 返回token值
		            return Accesstoken;
		}else {
		        	//2.3如果文件大小不等于0
		            //2.3.1实例化FileInputStream对象
		            FileInputStream fis = new FileInputStream(file);
		            //2.3.2定义一个数组
		            byte[] b = new byte[2048];
		            //2.3.3InputStreamReader的int read(char []cbuf);//将读取到的字符存到数组中。返回读取的字符数。
		            int len = fis.read(b);
		            //2.3.4读取到的文件内容
		            String mJsonAccess_token = new String(b, 0, len);
		            //2.3.5将json字符串转换成AccessToken类的对象
		           WechatUserinfo accessToken = gson.fromJson(mJsonAccess_token,WechatUserinfo.class);
		            //2.3.6如果expires_in不等于零,进行比较
		            if (accessToken.getExpires_in() != null) {
		            	//获取存入时的时间毫秒数
		                long saveTime = Long.parseLong(accessToken.getExpires_in());
		                //获取现在时间的毫秒数
		                long nowTime = System.currentTimeMillis();
		                //做差值
		                long remianTime = nowTime - saveTime;
		                //如果差值小于MAX_TIME,token值
		                if (remianTime < MAX_TIME) {
		                	/*AccessToken at = gson.fromJson(mJsonAccess_token,AccessToken.class);*/
		                	Accesstoken = accessToken.getAccess_token();
		                	fis.close();
		                	//返回token
		                	return Accesstoken;
		                } else {
		                	//如果大于MAX_TIME,重新获取token
		                	Accesstoken = getAccessToken(APPID,APPSECRET);
		                    FileOutputStream fos = new FileOutputStream(file, false);// 不允许追加
		                    WechatUserinfo accessToken=new WechatUserinfo();
		                    accessToken.setAccess_token(Accesstoken);
		                    accessToken.setExpires_in(System.currentTimeMillis() + "");
		                    String json = gson.toJson(accessToken);
		                    fos.write((json).getBytes());
		                    fos.close();
		                    return Accesstoken;
		                }
		            }
		            fis.close();
		       }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40877388/article/details/80322433