目标
现实项目开发过程,经常需要获取微信用户信息,基于微信公众号或小程序开发
实现
1. 根据code获取access_token
private AccessTokenVo WeCharUserToken(final String code) throws Exception {
String accessToken = "";
//log.info("获取accsstoken"+redisCache.getCacheObject(ACCESS_TOKEN));
if (!StrUtil.isNotEmpty(accessToken)){
//code 前端获取的code(填写前端获取的code参数)
AccessTokenVo accessTokenVo = new AccessTokenVo();
if (code == null || code.isEmpty()) {
//throw new ServiceException("微信登录验证请求code为空",HttpStatus.BAD_REQUEST);
throw new Exception("微信登录验证请求code为空");
}
//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
final String tokenUrl =
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WeChatConfig.appId + "&secret=" + WeChatConfig.secret +
"&code=" + code + "&grant_type=" + WeChatConfig.grantType + "&secret=" + WeChatConfig.secret;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> request = new HttpEntity<>(headers);
try {
// ... 处理响应
ResponseEntity<String> responseString = restTemplate.postForEntity(tokenUrl, request, String.class);
String jsonContent = responseString.getBody();
ObjectMapper mapper = new ObjectMapper();
int statusCode = responseString.getStatusCodeValue();
log.info("statusCode{}", statusCode);
try {
Map<String, Object> jsonMap = mapper.readValue(jsonContent, new TypeReference<Map<String, Object>>() {});
if(jsonMap.containsKey("errcode"))
throw new ServiceException("code不正确",HttpStatus.CODE_EXPIRE);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(jsonContent);
accessTokenVo = jsonObject.toJavaObject(AccessTokenVo.class);
Integer time = accessTokenVo.getExpires_in();
redisCache.setCacheObject(ACCESS_TOKEN, accessTokenVo, time - 3600, TimeUnit.MINUTES);
return accessTokenVo;
} catch (HttpClientErrorException e) {
// 服务器返回错误码,如401, 403, 404等
System.out.println("服务器返回错误: " + e.getStatusCode());
System.out.println("错误信息: " + e.getStatusText());
System.out.println("错误堆栈: " + e.getStackTrace());
} catch (HttpServerErrorException e) {
// 客户端请求错误,如500, 503等
System.out.println("服务器返回错误: " + e.getStatusCode());
System.out.println("错误信息: " + e.getStatusText());
System.out.println("错误堆栈: " + e.getStackTrace());
}
}
//字符串转实体
log.info("获取accsstoken"+accessToken);
AccessTokenVo accessTokenVo= JSONUtil.toBean(accessToken,AccessTokenVo.class);
return accessTokenVo;
}
2. 根据accesstoken获取用户信息
public WeCharUserInfo getWeChartUserInfo(final String code) throws Exception {
AccessTokenVo accessTokenVo = this.WeCharUserToken(code);
if (accessTokenVo == null) {
//throw new ServiceException("后端获取用户token 失败",HttpStatus.CODE_EXPIRE);
throw new Exception("后端获取用户token 失败");
}
String token = accessTokenVo.getAccess_token();
if (token == null || token.isEmpty()) {
//throw new ServiceException("获取token失败",HttpStatus.CODE_EXPIRE);
throw new Exception("获取token失败");
}
log.info("open id:{}", accessTokenVo.getOpenid());
log.info("token:{}", token);
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + accessTokenVo.getOpenid()+"&lang=zh_CN";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> request = new HttpEntity<>(headers);
ResponseEntity<String> responseString = restTemplate.postForEntity(url, request, String.class);
JSONObject jsonObject = JSONObject.parseObject(responseString.getBody());
log.info("获取用户信息->jsonContent{}", responseString.getBody());
//生成微信用户信息
WeCharUserInfo weCharUserInfo = jsonObject.toJavaObject(WeCharUserInfo.class);
log.info("获取用户信息->weCharUserInfo{}", weCharUserInfo);
return weCharUserInfo;
}
3. AccessTokenVo实体
public class AccessTokenVo {
/**
* 接口调用凭证
*/
private String access_token;
/**
* access_token接口调用凭证超时时间,单位(秒)
*/
private Integer expires_in;
/**
* 用户刷新access_token
*/
private String refresh_token;
/**
* 用户授权的作用域,使用逗号(,)分隔
*/
private String scope;
private String openid;
}
欢迎点赞,留言,评论,转发。