一、获取accessToken
1. 统一管理一些地址
public interface WeChatConstants {
// 获取全局access_token地址
String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
String getTicket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
// 获取客户信息
String getUserUtl = "https://api.weixin.qq.com/cgi-bin/user/info";
// 用户授权 获取access_token地址
String getUserTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
//String getUserTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
//公众号推送消息
String templateSendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
// 获取客户信息(授权版)
String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo";
// appid
String appid = "自己公众号的appid";
// secret
String secret = "自己公众号的secret";
}
2.获取accessToken
public String getAccessToken() {
//从缓存中获取
Object obj = redisTemplate.opsForValue().get("access_token");
if (obj != null){
String access_token = (String)obj;
return access_token;
}else {
String url = String.format(WeChatConstants.getTokenUrl, WeChatConstants.appid, WeChatConstants.secret);
String result = NetWorkUtil.getHttpsResponse(url, "GET");
if (StringUtils.isBlank(result)) {
return "";
}
JSONObject json = JSON.parseObject(result);
// 获取token
String access_token = json.getString("access_token");
redisTemplate.opsForValue().set("access_token", access_token);
redisTemplate.expire("access_token", 90, TimeUnit.MINUTES);//缓存一个半小时
return access_token;
}
}
因为微信公众平台每天获取accessToken的次数有限制,限额为2000次,并且每次获取都会返回新的accessToken,旧的accessToken会被刷掉。所以我们要将accessToken进行缓存,微信公众平台accessToken过期时间为2小时,我们需将缓存时间设置为小于2小时,这里设置成了一个半小时。
二、用户授权登录
1.获取用户openid
public String auth(String code) {
Map<String, Object> map = new HashMap<>();
map.put("appid", WeChatConstants.appid);
map.put("secret", WeChatConstants.secret);
map.put("code", code);
map.put("grant_type", "authorization_code");
//HttpUtil为hutool工具包下的
String wxResult = HttpUtil.get(WeChatConstants.getUserTokenUrl, map);
JSONObject object = JSONObject.parseObject(wxResult);
String openid = (String) object.get("openid");
return openid;
}
2. 根据accessToken和openid获取用户信息
public String getUser(String code) {
String result = NetWorkUtil.getHttpsResponse(String.format(WeChatConstants.getUserTokenUrl,
WeChatConstants.appid,
WeChatConstants.secret,
code), "GET");
JSONObject json = JSON.parseObject(result);
String openid = json.getString("openid");
String access_token = json.getString("access_token");
// 获取用户信息
String userInfo = NetWorkUtil.getHttpsResponse(String.format(WeChatConstants.getUserInfoUrl,
access_token,
openid), "GET");
return userInfo;
}