jsapi_ticket更新-accesstoken更新

微信JSSDK开发中涉及到了accesstoken和jsapi_ticket的更新,而且二者都有2小时的失效限制,本方法提供了更新二者的方法,而且要注意,一定是accesstoken更新在先,jsapi_ticket更新在后,而且在实际应用中二者应该保存在数据库中,使用定时任务扫描该任务。本文同时提供了IP限制(如果获取的IP是127.0.0.1 请查阅文章),以及IP代理的方法。
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.json.JSONObject;


public class UpdateAccesstoken {
	
	
	
	
	private String ServicePort_shezhi="0";//是否使用代理:0-NO,1-YES
	private String proxyHost="192.168.1.1";//代理IP
	private String proxyPort="8080";//代理端口

	/**
	 * 2016年04月19日 
	 * 
	 * 1、提供更新accesstoken的公共方法
	 * 2、提供更新jsapi_ticket的公共方法
	 * 
	 * 注意事项:
	 * @throws UnknownHostException 
	 */
	
	/*
	 * 定时任务调用的主方法-仅允许一台服务器运行,需要进行ip限制
	 */
	public void updateAccesstokenTask() throws UnknownHostException{
		BasicCxAction bca=new BasicCxAction(basicService);
		
		String ip = (InetAddress.getLocalHost().getHostAddress()==null?"0.0.0.0":InetAddress.getLocalHost().getHostAddress());
		//将定时任务只放在指定服务器上执行,新增服务器不执行定时任务。
		String triggerIp = bca.gettriggerIp();
		if(!ip.equals(triggerIp)){//如果服务器IP和指定IP不相等,不执行定时任务,  !是必要的
			System.out.println("本服务器IP为【"+ip+"】,与指定服务器IP【"+triggerIp+"】不符,不执行定时更新accesstoken和jsapi_ticket的服务");
				
		}else{
			

			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			System.out.println("运行了定时任务"+sdf.format(new Date()));
			
			
			String appid="123456780";
			String appsecret="1234567890";//appsecret
			
			System.out.println("appid="+appid+"  appsecret=**********");
			String accesstoken="";
			String jsapiticket="";
			
			accesstoken=forAccesstoken(appid,appsecret);
			System.out.println("accesstoken="+accesstoken);
			if(!"limit".equals(accesstoken.trim())){
				jsapiticket=forJsapiticket(accesstoken);
				
				if(!"limit".equals(jsapiticket.trim())){
					System.out.println("jsapiticket="+jsapiticket);
					//查询实体-更新accesstoken-更新jsapiticket
					if(true)){//这里换成保存数据库的动作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
						System.out.println("database更新-success");
					}else{
						System.out.println("database更新-false");
					}
				
				}else{
					System.out.println("定时任务失败,jsapiticket获取失败");
				}
			}else{
				System.out.println("定时任务失败,accesstoken获取失败");
			}

			
		}

		
		
				
		
	}
	
	/*
	 * 更新accesstoken的方法
	 */
	public String  forAccesstoken(String appid,String appsecret){
		
		String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret;
		
		//调用微信更新accesstoken接口
		String result=sendHttpURLConnection(url);
		if(result==""||result==null){
			//如果是交互不正常,那么就继续交互
			 forAccesstoken(appid,appsecret);
		}
		if(result.indexOf("errcode")==-1){
			//说明和微信交互正常
			
			//判断是否获取到正确的结果
			JSONObject jsons = JSONObject.fromObject(result);
			
			if((String)jsons.get("access_token")!=null){
				String accesstoken="";
				accesstoken=(String)jsons.get("access_token");
				return accesstoken;
			}
		}else{
			 System.out.println("定时任务获取accesstoken异常="+result);
		}
		
		return "limit";
	}
	/*
	 *更新 jsapi_ticket的方法
	 *https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
	 */
	
		public String  forJsapiticket(String ACCESS_TOKEN){
		
		String url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ACCESS_TOKEN+"&type=jsapi";
		
		//调用微信更新forJsapiticket接口
		String result=sendHttpURLConnection(url);
		if(result==""||result==null){
			//如果是交互不正常,那么就继续交互
			forJsapiticket(ACCESS_TOKEN);
		}
		if(result.indexOf("ticket")>-1){
			//说明和微信交互正常
			
			//判断是否获取到正确的结果
			JSONObject jsons = JSONObject.fromObject(result);
			
			if((String)jsons.get("ticket")!=null){
				String ticket="";
				ticket=(String)jsons.get("ticket");
				return ticket;
			}
		}else{
			//如果是交互不正常,那么就继续交互
			 System.out.println("定时任务获取Jsapiticket异常="+result);
		}
		
		return "limit";
	}
		
	/*
	 * 发送请求的公共方法-设置是否使用代理标志位
	 */
		/**
		 * 仅仅在发送url的时候调用
		 * @param url
		 * @return
		 */
		public String sendHttpURLConnection(String url){
			//logger.info("向微信发起请求,发送的url为:"+url);
			String str = "";
			try {
				URL getUrl = new URL(url);
				// 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,	
				HttpURLConnection connection;

				
				//代理判断,0-不使用代理;1-使用代理
				if("0".equals(ServicePort_shezhi)){
					connection = (HttpURLConnection) getUrl.openConnection();
				}else{
					
					Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress(proxyHost, Integer.valueOf(proxyPort)));
					connection =(HttpURLConnection)getUrl.openConnection(proxy); 
				}
				
				// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
				connection.setConnectTimeout(25000);
				connection.setReadTimeout(25000);
				connection.connect();

				// 取得输入流,并使用Reader读取
				BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
				String lines;

				//获取返回的字符流转化为字符串
				while ((lines = reader.readLine()) != null) {
					str = str + lines;
				}

				reader.close();
				// 断开连接
				connection.disconnect();
				//logger.info("向微信发起请求,微信返回的字符串为:"+str);
				
				return str;

			} catch (IOException e) {
				// TODO Auto-generated catch block
				System.out.println("向微信发起请求出现异常,微信返回的字符串为:"+str+" e.getMessage()="+e.getMessage());
				//logger.info("向微信发起请求出现异常,微信返回的字符串为:"+str,e.getMessage());
			}
			//运行到此说明发生错误
			str="errcode";
			return str;
		}
		
	
	

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值