直接上代码
/**
* 获取AccessToken(这里不需要存redis)
* @return 返回拿到的access_token及有效期
*/
public AccessToken getAccessTokenKd(String APPID,String APPSECRET) throws ClientProtocolException, IOException{
AccessToken token = new AccessToken();
String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET );
try {
JSONObject jsonObject = doGetStr(url);
log.info("获取到的json数据:"+jsonObject);
if(jsonObject!=null && (jsonObject.getString("errcode") != null || !"".equals(jsonObject.getString("errcode")))){ //如果返回不为空,将返回结果封装进AccessToken实体类
token.setAccesstoken(jsonObject.getString("access_token"));//取出access_token
token.setExpiresIn(jsonObject.getInteger("expires_in"));//取出access_token的有效期
//tokenUtil.insertToken(APPID+":accessToken", token.getAccesstoken(),6000, TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}
return token;
}
//获取Tiket
public JspApiTiket getApitiket(String APPID,String APPSECRET) {
AccessToken atoken = new AccessToken();
JspApiTiket jatiket = new JspApiTiket();
try {
atoken = getAccessTokenKd(APPID,APPSECRET);//调用工具类获取Access_token
/*
拼接字符串生成getJspApiTiket所需的参数url
*/
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + atoken.getAccesstoken() + "&type=jsapi";
jatiket = WeiXinUtil.getJspApiTiket( url );//调用工具类获取JspApiTiket
//这里存一下redis 获取到的Tiket实效时间也是7200s
tokenUtil.insertToken(APPID+":jspApiTiket", jatiket.getTiket(),6000, TimeUnit.SECONDS);
} catch (IOException e) {
e.printStackTrace();
}
return jatiket;
}
/**
* @param url 请求的URL
* @return 将请求URL后返回的数据,转为JSON格式
*/
public static JSONObject doGetStr(String url) throws ClientProtocolException, Exception {
DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
HttpGet httpGet = new HttpGet(url);//HttpGet将使用Get方式发送请求URL
JSONObject jsonObject = null;
HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client执行httpGet的结果
HttpEntity entity = response.getEntity();//从response中获取结果,类型为HttpEntity
if(entity != null){
String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity转为字符串类型
jsonObject = JSONObject.parseObject(result);//字符串类型转为JSON类
System.out.print( "get请求完成,返回数据="+ jsonObject.toString());
}
return jsonObject;
}
微信官方文档.
如果你把access_token存到redis会出现这种情况:每次获取到access_token后,存在redis里面两个小时,但是在别的地方再次调用过了,导致redis中的已经失效;所以直接存JspApiTiket即可。
注:
这里的access_token为全局token,默认一天最多获取2000次,次数也可以去申请。
TokenUtil类
@Resource
public interface TokenUtil {
/**
*1、存数据
* */
void createtoken(String token, String type, Object object);
/**
*2、取数据
* */
Object getInfoByToken(String token, String type);
/**
*3、删除某个数据
* */
public void deleteByToken(String token, String type);
/**
*4、取全部数据
* */
Object getInfoByToken(String token);
Object getToken(String token);
void insertToken(String tianquanToken, String token, Integer expireTime);
}
TokenUtilImpl类
@Service("TokenUtil")
public class TokenUtilImpl implements TokenUtil {
/**
* 声明
* */
@Resource
private RedisTemplate redisTemplate;
/**
*
* 1、生成tokenMap ,存储用户信息
* */
@Override
public void createtoken(String token, String type, Object object){
redisTemplate.opsForHash().put(token, type ,object );
}
/**
*
* 2、根据token获取用户信息
* */
@Override
public Object getInfoByToken(String token, String type) {
return redisTemplate.opsForHash().get(token, type);
}
@Override
public Object getToken(String token) {
return redisTemplate.opsForValue().get(token);
}
@Override
public void insertToken(String tianquanToken, String token, Integer expireTime) {
redisTemplate.opsForValue().set(tianquanToken,token, expireTime, TimeUnit.MINUTES );
}
@Override
public void deleteByToken(String token, String type) {
redisTemplate.opsForHash().delete(token,type);
}
@Override
public Object getInfoByToken(String token) {
return redisTemplate.opsForHash().entries(token);
}
}