关于网页版微信扫码登录以及获取用户信息

由于我只研究了1天时间,可能有些地方认知错误

1:网页版微信扫码登录的流程

          ① 点击扫码登录按钮

          ② qrAuthorize(访问微信接口,如果微信接口判断有权限生成二维码的话,跳转到二维码页面。)

                   在这两个方法里面要有两个返回路径,第一个是获取权限以后生成二维码的页面,第二个是扫码用户授权以后要跳转                       的方法

          ③ 在用户授权以后跳转到指定的方法,获取到code,根据code和openid访问微信接口,从而获取用户信息

2:要注意的地方

           ①:如果是测试的话需要用到内网穿透,这个网上的教程很多

           ②:获取用户信息的路径要注意

                     我这里是:https://api.weixin.qq.com/sns

3:下面是完整的代码:

            ① 创建一个访问用户信息的工具栏,返回的是一个jsonObject

public class HttpClientTools {

    /**
     * Http Get 请求方法
     * @param url
     * @return
     * @throws Exception
     */
    public static JSONObject doGet(String url){
        JSONObject json = null;
        HttpGet httpGet = new HttpGet(url);
        // 创建httpClientBuilder
        HttpClientBuilder clientBuilder = HttpClientBuilder.create();
        // httpclient
        CloseableHttpClient httpClient = clientBuilder.build();

        try {
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                json = JSONObject.fromObject(result);
            }
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }


        return json;
    }
}

              ② 创建一个实体类,用于将获取到的用户信息封装到实体当中去

public class WeixinUserInfo {
    // 用户的标识
    private String openId;
    // 昵称
    private String nickname;
    // 用户的性别(1是男性,2是女性,0是未知)
    private int sex;
    // 用户所在国家
    private String country;
    // 用户所在省份
    private String province;
    // 用户所在城市
    private String city;
    // 用户的语言,简体中文为zh_CN
    private String language;
    // 用户头像
    private String headImgUrl;
    public String getOpenId() {
        return openId;
    }
    public void setOpenId(String openId) {
        this.openId = openId;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getLanguage() {
        return language;
    }
    public void setLanguage(String language) {
        this.language = language;
    }
    public String getHeadImgUrl() {
        return headImgUrl;
    }
    public void setHeadImgUrl(String headImgUrl) {
        this.headImgUrl = headImgUrl;
    }
}

               ③ control方法的第一个,用户点击扫码登录的时候,也就是上面流程的第二步

 @ApiOperation(value="登录跳转,调用微信开放平台二维码")
    @GetMapping("/qrAuthorize")
    public String qrAuthorize(@RequestParam("returnUrl") String returnUrl){
        String url=projectUrlConfig.getWechatOpenAuthorize()+"要返回的路径";
        String redirectUrl=wxOpenService.buildQrConnectUrl(url,WxConsts.QrConnectScope.SNSAPI_LOGIN, URLDecoder.decode(returnUrl,"UTF-8"));
        return "redirect:"+redirectUrl;
    }

               ④ control的第二个方法,获取用户的信息

@ApiOperation(value="获取用户扫码信息")
    @GetMapping("/qrUserInfo")
    public String qrUserInfo(@RequestParam("code") String code){
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken=new WxMpOAuth2AccessToken();
        try{
            wxMpOAuth2AccessToken=wxOpenService.oauth2getAccessToken(code);
        }catch (WxErrorException e){
            e.printStackTrace();
        }
        String returnUrl = "https://api.weixin.qq.com/sns/userinfo?";
        String openId=wxMpOAuth2AccessToken.getOpenId();
        String accessToken = wxMpOAuth2AccessToken.getAccessToken();
        WeixinUserInfo user= getUserInfo(accessToken, openId);
        System.out.println("OpenID:" + user.getOpenId());
        System.out.println("昵称:" + user.getNickname());
        System.out.println("性别:" + user.getSex());
        System.out.println("国家:" + user.getCountry());
        System.out.println("省份:" + user.getProvince());
        System.out.println("城市:" + user.getCity());
        System.out.println("语言:" + user.getLanguage());
        System.out.println("头像:" + user.getHeadImgUrl());


        System.out.println(wxMpOAuth2AccessToken);
        return "redirect:"+returnUrl+"access_token="+accessToken+"&openid="+openId;
    }

          ⑤ 这里是调用方法获取用户的信息,并且将用户信息封装到实体里面去

 public static WeixinUserInfo getUserInfo(String accessToken, String openId) {
        WeixinUserInfo weixinUserInfo = null;
        // 拼接请求地址
        String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
        requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
        // 获取用户信息
        JSONObject jsonObject = HttpClientTools.doGet(requestUrl);
        if (jsonObject!=null) {
            try {
                weixinUserInfo = new WeixinUserInfo();
                // 用户的标识
                weixinUserInfo.setOpenId(jsonObject.getString("openid"));
                // 昵称
                weixinUserInfo.setNickname(jsonObject.getString("nickname"));
                // 用户的性别(1是男性,2是女性,0是未知)
                weixinUserInfo.setSex(jsonObject.getInt("sex"));
                // 用户所在国家
                weixinUserInfo.setCountry(jsonObject.getString("country"));
                // 用户所在省份
                weixinUserInfo.setProvince(jsonObject.getString("province"));
                // 用户所在城市
                weixinUserInfo.setCity(jsonObject.getString("city"));
                // 用户的语言,简体中文为zh_CN
                weixinUserInfo.setLanguage(jsonObject.getString("language"));
                // 用户头像
                weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
        return weixinUserInfo;
    }

猜你喜欢

转载自blog.csdn.net/qq_20594019/article/details/84797570
今日推荐