微信获取用户信息接入例子 java实现
微信公众平台开发文档
- 主要用到"微信网页授权"方面的api。
- 如果要使用静默方式获取微信用户信息可以在"微信网页授权"获取到用户openid后再使用"获取用户基本信息"api获取用户信息。
以下例子主要用到静默方式获取用户信息,即无需用户授权直接获取用户信息的方式
前台代码
- 引导用户打开微信端链接
- 由于这个项目是公众号开发,所以直接菜单引导用户打开微信端链接
- 下图"首页"菜单对应的链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx87f4d5d049fbbcd6&redirect_uri=http%3A%2F%2Fy2182763o7.iok.la%2Fwx%2FcallBack&response_type=code&scope=snsapi_base&connect_redirect=1#wechat_redirect
- 链接所带参数根据个人项目而言
后台代码
- 以下controller里面的方法对应微信回调地址
- return “redirect:/index.html?userid=”+userid; 重定向到你项目里面要打开的页面
@RequestMapping("/callBack")
public String callBack(String code){
System.out.println("code:"+code);
String userid = "";
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/sns/oauth2/access_token");
uriBuilder.addParameter("appid",APPID);
uriBuilder.addParameter("secret",APPSECRET);
uriBuilder.addParameter("code",code);
uriBuilder.addParameter("grant_type","authorization_code");
HttpGet get = new HttpGet(uriBuilder.build());
//执行请求
CloseableHttpResponse closeableHttpResponse = httpClient.execute(get);
//取响应结果
int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
if (statusCode==200){
HttpEntity entity = closeableHttpResponse.getEntity();
try {
String jsonStr = EntityUtils.toString(entity,"utf-8");
ObjectMapper objectMapper = new ObjectMapper();
HashMap<String,Object> map = objectMapper.readValue(jsonStr,HashMap.class);
System.out.println("jsonStr:"+jsonStr);
if (null==map.get("errcode")){
String access_token = getAccessToken();
String openid = (String) map.get("openid");
JieqiUser userInfo = login(access_token,openid); //用户信息
userid = userInfo.getUserid();
closeableHttpResponse.close(); //关闭资源
httpClient.close(); //关闭资源
}
} catch (Exception e) {
closeableHttpResponse.close();
httpClient.close();
return "redirect:/index.html?userid="+userid;
}
}
} catch (Exception e) {
return "redirect:/index.html?userid="+userid;
}
return "redirect:/index.html?userid="+userid;
}
private JieqiUser login(String access_token,String openid){
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/cgi-bin/user/info");
uriBuilder.addParameter("access_token",access_token);
uriBuilder.addParameter("openid",openid);
uriBuilder.addParameter("lang","zh_CN");
HttpGet httpGet = new HttpGet(uriBuilder.build());
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取响应码
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode==200) {
String jsonStr = EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println("微信用户信息:" + jsonStr);
ObjectMapper objectMapper = new ObjectMapper();
HashMap<String, Object> map = objectMapper.readValue(jsonStr, HashMap.class);
if (null == map.get("errcode")) {
JieqiUser jieqiUser = new JieqiUser();
jieqiUser.setOpenid(openid);
if (0 == (int) map.get("subscribe")) { //用户没有关注该公众号
jieqiUser.setSubscribe(0);
} else if (1 == (int) map.get("subscribe")) { //用户关注了该公众号
jieqiUser.setSubscribe(1);
jieqiUser.setSex((Integer) map.get("sex"));
jieqiUser.setNickname((String) map.get("nickname"));
jieqiUser.setAvatar((String) map.get("headimgurl"));
jieqiUser.setUnionid((String) map.get("unionid"));
jieqiUser.setSubscribeTime(DateTimeUtil.stampToDate(String.valueOf((int) map.get("subscribe_time"))));
jieqiUser.setSubscribeScene((String) map.get("subscribe_scene"));
}
response.close();
httpClient.close();
return userService.createUser(jieqiUser);
}
}
} catch (Exception e) {
// e.printStackTrace();
return null;
}
return null;
}