您的位置:首页 > 移动开发 > 微信开发

java微信公众号开发获取微信用户信息

2018-03-04 21:25 633 查看
此博文参考:https://www.cnblogs.com/sxmny/articles/4969119.html
获取微信用户的基础信息(包括头像,昵称,所在地等)大体分为如下三步:
1.获取code;
只有用户同意授权才能拿到用户的微信信息.用户同意授权后,我们就可以拿到code值.
code是怎么来的,是通过调用下面接口来获取的: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect注意这个接口中有个参数scope 默认有2个值snsapi_base和snsapi_userinfo,这个接口会根据scope 来生成不同的code,并且获取不同作用的access_token ,不管scope传什么值都能在得到对应access_token的同时得到open_id, 如果你只需要得到opend_id 那使用snsapi_base参数到此结束了,如果需要获取用户的其他信息比如 昵称 地址 就要snsapi_userinfo 会弹出授权2.获取access_token 用户网页授权access_token 获取接口地址是 https://api.weixin.qq.com/sns/oauth2/access_token? appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code  网页授权access_token 需要通过code去获取,此code即为之前获取到的(code一般由前台根据用户是否同意授权获取到,然后传递给后台,后台直接用就可以). 3 .获取用户信息  https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN access_token即为第二部获取的值注意:通过以上三步你可以获取到一个微信用户的基本信息,但是并不能获取到公众号关注者的微信用户信息.想要获取到微信公众号关注者的微信信息,也需要上述三步,只是获取access_token和获取用户的接口有区别.如下:前提条件:1.用户同意授权公众号获取其用户信息;2:用户关注了此公众号;获取用户信息接口:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN  (此接口的access_token 是调用基础接口获取到的access_token, 不是网页授权获取到的access_token(上述第2步获取到的),直白点说,就是下面这个接口获取到的access_token)
基础接口获取access_token, 获取接口如下:  https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET针对公众号获取微信用户的信息,微信的解释:是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
此博文上述内容参考:https://www.cnblogs.com/sxmny/articles/4969119.html
代码如下:
/**
* 获取微信用户的openId
* @param appId
* @param code
* @param secret
* @return
*/
public Map getOpenId(String appId, String code, String secret){
Map map = new HashMap();
String resultUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ appId +"&secret="+ secret +"&code="+ code +"&grant_type=authorization_code";
// 获取openid
String json = HttpUtil.get(resultUrl);
JSONObject jsonObject = JacksonUtil.toEntity(json, JSONObject.class);
Object openid1 = jsonObject.get("openid");
String openid="";
if (null != openid1){
openid = openid1.toString();
}
map.put("openid",openid);
return map;
}
/**
* 获取微信用户信息
* @param code
* @return
*/
public Map getWXInfo(String code, String appId,String secret) {
if (StrUtil.isNotBlank(code)){
Map tokenMap = getOpenId(appId, code, secret);
String openid = tokenMap.get("openid").toString();
if (StrUtil.isNotBlank(openid)){
// 获取基础支持的access_token
String resultUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret="+ secret;
String json = HttpUtil.get(resultUrl);
JSONObject jsonObject = JacksonUtil.toEntity(json, JSONObject.class);
String access_token = jsonObject.get("access_token").toString();
// 获取用户信息
String resultUrl2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+ access_token +"&openid="+ openid +"&lang=zh_CN";
String json2 = HttpUtil.get(resultUrl2);
JSONObject jsonObject2 = JacksonUtil.toEntity(json2, JSONObject.class);
String nickname = jsonObject2.get("nickname").toString();
String headimgurl = jsonObject2.get("headimgurl").toString();
if (nickname == null || headimgurl == null){
throw new BadRequestException("未关注,请关注后重试!");
}
String sex = jsonObject2.get("sex").toString();
String country = jsonObject2.get("country").toString();
String province = jsonObject2.get("province").toString();
String city = jsonObject2.get("city").toString();
HashMap<String,Object> map = new HashMap<>();
map.put("nickName",nickname);
map.put("country",country);
map.put("provinceName",province);
map.put("cityName",city);
map.put("headImg",headimgurl);
map.put("openId",openid);
map.put("sex",sex);
return map;
}
}
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐