微信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;
}
}