//微信的AppId(公众号配置中‘公众号开发信息’)
private static String WX_APP_ID = "wx80**********981c";
//微信的AppSecret(公众号配置中‘公众号开发信息’)
private static String WX_APP_SECRET = "5287517****************f2638ae0f";
//获取当前域名
public String getVisitPrefix(HttpServletRequest request){
String scheme = request.getScheme(); //返回当前链接使用的协议;一般应用返回http;SSL返回https;
String domain = request.getServerName(); //服务器主机名
int serverPort = request.getServerPort(); //服务器上web应用的访问端口
if(serverPort==80 || serverPort==443){
return scheme+"://"+domain;
}else{
return scheme+"://"+domain+":"+serverPort;
}
}
//微信页面授权方法
@RequestMapping("/wx/wxAuthorization.do")
public String wxAuthLogin(HttpServletRequest request,ModelMap model) {
//获取当前域名
String visitPrefix = getVisitPrefix(request);
//公众号回调链接
String REDIRECT_URI = visitPrefix+"/wx/wxPageVerify.do";
//获取一个随机的4位数的字符串
String STATE = RandomUtil.randomString(4);
//微信请求连接
String authUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+WX_APP_ID+"&redirect_uri="+URLEncoder.encode(REDIRECT_URI)+"&response_type=code&scope=snsapi_base&state="+STATE+"#wechat_redirect";
return "redirect:" + authUrl;
}
//微信回调方法 页面授权及获取当前微信用户的基本信息
@RequestMapping("/wx/wxPageVerify.do")
public void wxPageVerify(HttpServletRequest request,HttpServletResponse response,ModelMap model, String code) {
if(StringUtils.isNotBlank(code)) {
//通过code换取网页授权access_token
JSONObject authAccessToken = getAuthAccessToken(WX_APP_ID, WX_APP_SECRET, code);
if(authAccessToken != null && authAccessToken.containsKey("access_token") && StringUtils.isNotBlank(authAccessToken.getString("access_token"))) {
//获取用户的基本信息
JSONObject userinfo = getUserinfo(authAccessToken.getString("access_token"), authAccessToken.getString("openid"));
//获取session
HttpSession session = request.getSession();
//将微信数据放入session中
session.setAttribute("wx", userinfo);
}
}
}
//微信页面授权
public JSONObject getAuthAccessToken(String appId, String appSecret,String code) {
//微信页面授权url
String authTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
//HttpEntity
RestTemplate restTemplate = new RestTemplate();
//post
ResponseEntity<String> responseEntity = restTemplate.getForEntity(authTokenUrl, String.class);
HttpStatus statusCode = responseEntity.getStatusCode();
if (statusCode == HttpStatus.OK) {
System.out.println("网络请求成功");
String body = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(body);
if (null != jsonObject) {
if(jsonObject.containsKey("errcode")){
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
if(errorCode != 0){
System.out.println("获取AuthAccessToken失败 errcode:{"+errorCode+"} errmsg:{"+errorMsg+"}");
}
}
}
return jsonObject;
}
return null;
}
获取微信用户基本数据
public JSONObject getUserinfo(String access_token, String openid) {
//如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
//HttpEntity
RestTemplate restTemplate = new RestTemplate();
// 设置restemplate编码为utf-8
restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
//post
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
HttpStatus statusCode = responseEntity.getStatusCode();
if (statusCode == HttpStatus.OK) {
System.out.println("网络请求成功");
String body = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(body);
if (null != jsonObject) {
if(!jsonObject.containsKey("errcode") || (jsonObject.containsKey("errcode") && jsonObject.getInteger("errcode").intValue()==0)) {
return jsonObject;
}else {
System.out.println("获取WxUserinfo失败 errcode:{"+jsonObject.getInteger("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}");
}
}
}
return null;
}