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

此博文参考: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和openid

 用户网页授权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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值