1、编写一个微信用户实体类
@Data
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class WeCharUserInfo implements Serializable {
private Integer id;
private String openid;
private String nickname;
private String phone;
private String sign;
private Integer sex;
private String province;
private String country;
private String city;
private String headimgurl;
private String unionid;
}
2、微信配置类
/***
* 微信配置类
*/
public class WeChatConfig {
/**
* 应用唯一标识,在微信开放平台提交应用审核通过后获得
*/
public static String appId = "wx542f69c0e0006xxx";
/**
* 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
*/
public static String secret= "b6b13338e92d150a2a7ef0d8db2d0xxx";
/**
* 填authorization_code
*/
public static String grantType = "authorization_code";
}
3、编写 AccessTokenVo用户微信登录返回结果
@Data
@Getter
@Setter
@ToString
@ApiModel("AccessTokenVo用户微信登录返回结果")
@NoArgsConstructor
@AllArgsConstructor
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;
}
4、具体方法,微信登服务接口
@Component
@Slf4j
public class WeChatService {
/**
* @param code
* @return
*/
private AccessTokenVo WeCharUserToken(final String code) throws Exception {
//code 前端获取的code(填写前端获取的code参数)
AccessTokenVo accessTokenVo = new AccessTokenVo();
if (code == null || code.isEmpty()) {
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);
ResponseEntity<String> responseString = restTemplate.postForEntity(tokenUrl, request, String.class);
String jsonContent = responseString.getBody();
log.info("getBody{}", responseString.getBody());
log.info("jsonContent{}", jsonContent);
//解析返回结果
JSONObject jsonObject = JSONObject.parseObject(jsonContent);
accessTokenVo = jsonObject.toJavaObject(AccessTokenVo.class);
return accessTokenVo;
}
/**
* 获取用户信息
*
* @param code
* @return
* @throws Exception
*/
public WeCharUserInfo getWeChartUserInfo(final String code) throws Exception {
AccessTokenVo accessTokenVo = this.WeCharUserToken(code);
if (accessTokenVo == null) {
throw new Exception("后端获取用户token 失败");
}
String token = accessTokenVo.getAccess_token();
if (token == null || token.isEmpty()) {
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();
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;
}
}