微信公众号授权登录获取用户信息

申请测试号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
     * 用户同意授权,获取code
     * @param request
     * @param response
     * @throws IOException
     */
    @ResponseBody
    @GetMapping("/getOauthAccessToken")
    public void getOauthAccessToken(HttpServletRequest request, HttpServletResponse response) throws IOException {

        //获取 appid,appScret,appScret
        //
        WechatPublic wechatPublic = wechatPublicService.selectWechatPublicById(100);
        if (wechatPublic == null){
            logger.error("AppID或者ARedirectUri不存在");
        }
        String appid = wechatPublic.getAppId();
        String redirectUri = wechatPublic.getRedirectUri();

        String url = WechatConstants.API_OAUTH_CODE;
        url = url.replace("APPID", appid);
        url = url.replace("REDIRECT_URI", URLEncoder.encode(redirectUri,"UTF-8"));
        url = url.replace("SCOPE", "snsapi_userinfo");

        //重定向到重定向地址
        response.sendRedirect(url);
    }
/**
     * 获取用户信息
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping("/wxLogin")
    public WechatUserInfoVo wxLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {

        //获取 appid,appSecret
        WechatPublic wechatPublic = wechatPublicService.selectWechatPublicById(100);
        if (wechatPublic == null){
            logger.error("未获取到公众号参数");
        }
        String appid = wechatPublic.getAppId();
        String appSecret = wechatPublic.getAppScret();

        //获取code
        String code=request.getParameter("code");
        if (StringUtils.isEmpty(code)){
            logger.error("参数code为空");
        }
        WechatAccessTokenVo accessTokenVo = wechatPublicService.getAccessToken(appid, appSecret, code);

        //获取AccessToken
        String accessToken = accessTokenVo.getAccessToken();

        WechatUserInfoVo userInfo = null;
        try{
            //刷新access_token
            String refreshToken = accessTokenVo.getRefreshToken();
            wechatPublicService.refreshToken(appid,refreshToken);

            //获取用户信息
            String openId = accessTokenVo.getOpenId();
            userInfo = wechatPublicService.getUserInfo(accessToken, openId);

            //检验授权凭证
            wechatPublicService.verifyAccessToken(accessToken, openId);

        }catch (Exception e){
            e.printStackTrace();
        }
        return userInfo;
    }
/**
     * 1.通过code换取网页授权access_token
     * @param appid
     * @param appSecret
     * @param code
     * @return
     */
    @Override
    public WechatAccessTokenVo getAccessToken(String appid, String appSecret , String code) {

        WechatAccessTokenVo accessTokenVo = null;
        // 获取网页授权access_token
        String reqUrl = WechatConstants.API_OAUTH_TOKEN;
        reqUrl = reqUrl.replace("APPID", appid);
        reqUrl = reqUrl.replace("SECRET", appSecret);
        reqUrl = reqUrl.replace("CODE", code);

        JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(reqUrl, String.class).getBody());
        if (null != jsonObject) {
            try {
                accessTokenVo = new WechatAccessTokenVo();
                accessTokenVo.setAccessToken(jsonObject.getString("access_token"));
                accessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
                accessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
                accessTokenVo.setOpenId(jsonObject.getString("openid"));
                accessTokenVo.setScope(jsonObject.getString("scope"));
            } catch (Exception e) {
                accessTokenVo = new WechatAccessTokenVo();
                accessTokenVo.setErrCode(jsonObject.getString("errcode"));
                accessTokenVo.setErrMsg(jsonObject.getString("errmsg"));
            }
        }
        return accessTokenVo;
    }
 /**
     * 刷新access_token
     * @param appid
     * @param refreshToken
     * @return
     */
    @Override
    public WechatAccessTokenVo refreshToken(String appid,String refreshToken) {

        WechatAccessTokenVo accessTokenVo = null;
        //获取第二步的refresh_token后,请求以下链接获取access_token
        String reqUrl = WechatConstants.API_REFRESH_TOKEN;

        reqUrl = reqUrl.replace("APPID", appid);
        reqUrl = reqUrl.replace("REFRESH_TOKEN",refreshToken);

        JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(reqUrl, String.class).getBody());
        if (null != jsonObject) {
            try {
                accessTokenVo = new WechatAccessTokenVo();
                accessTokenVo.setAccessToken(jsonObject.getString("access_token"));
                accessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
                accessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
                accessTokenVo.setOpenId(jsonObject.getString("openid"));
                accessTokenVo.setScope(jsonObject.getString("scope"));
            } catch (Exception e) {
                //accessTokenVo = null;
                accessTokenVo = new WechatAccessTokenVo();
                accessTokenVo.setErrCode(jsonObject.getString("errcode"));
                accessTokenVo.setErrMsg(jsonObject.getString("errmsg"));
            }
        }
        return accessTokenVo;
    }
/**
     * 拉取用户信息
     * @param accessToken
     * @param openId
     * @return
     */
    @Override
    public WechatUserInfoVo getUserInfo(String accessToken, String openId) {

        WechatUserInfoVo userInfo = null;

        String getUserInfo = WechatConstants.API_SNS_UNIONID;
        getUserInfo = getUserInfo.replace("ACCESS_TOKEN", accessToken);
        getUserInfo = getUserInfo.replace("OPENID",openId);

        JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(getUserInfo, String.class).getBody());
        if (null != jsonObject) {
            try {
                userInfo = new WechatUserInfoVo();
                userInfo.setOpenid(jsonObject.getString("openid"));
                userInfo.setNickname(new String(jsonObject.getString("nickname").getBytes("ISO-8859-1"), "UTF-8"));
                userInfo.setSex(Integer.parseInt(jsonObject.getString("sex")));
                userInfo.setProvince(new String(jsonObject.getString("province").getBytes("ISO-8859-1"), "UTF-8"));
                userInfo.setCity(new String(jsonObject.getString("city").getBytes("ISO-8859-1"), "UTF-8"));
                userInfo.setCountry(new String(jsonObject.getString("country").getBytes("ISO-8859-1"), "UTF-8"));
                userInfo.setHeadimgurl(jsonObject.getString("headimgurl"));
                userInfo.setPrivilegeList(JSONArray.toJavaObject(jsonObject.getJSONArray("privilege"), List.class));
                userInfo.setUnionid(jsonObject.getString("unionid"));
            } catch (Exception e) {
                userInfo = new WechatUserInfoVo();
                userInfo.setErrCode(jsonObject.getString("errcode"));
                userInfo.setErrMsg(jsonObject.getString("errmsg"));
            }
        }
        return userInfo;
    }
/**
     * 检验授权凭证(access_token)是否有效
     * @param accessToken
     * @param openId
     */
    @Override
    public void verifyAccessToken(String accessToken,String openId) {
        String verifyAT = WechatConstants.API_VERIFY_TOKEN;
        verifyAT = verifyAT.replace("ACCESS_TOKEN", accessToken);
        verifyAT = verifyAT.replace("OPENID",openId);

        JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(verifyAT, String.class).getBody());
        if (null != jsonObject) {
            try {
                int errorCode = jsonObject.getInteger("errcode");
                String errorMsg = jsonObject.getString("errmsg");
                log.info("授权凭证access_token有效 errcode:{} errmsg:{}", errorCode, errorMsg);
            } catch (Exception e) {
                int errorCode = jsonObject.getInteger("errcode");
                String errorMsg = jsonObject.getString("errmsg");
                log.error("授权凭证access_token无效 errcode:{} errmsg:{}", errorCode, errorMsg);
            }
        }
    }
首先,在获取微信公众号网页授权用户信息之前,我们需要先了解微信公众号的几个概念: 1. AppID和AppSecret:AppID是每个公众号独有的身份标识,在开发者中心中可查看;而AppSecret则是用于获取access_token的密钥。 2. 授权作用域:微信网页授权分为静默授权和弹出授权,前者只能获取用户基本信息,后者可以获取用户详细信息。 3. 网页授权流程:用户同意授权后,微信后台会将授权code返回给开发者,开发者可以使用该code获取access_token,并通过access_token获取用户信息。 接下来,我们就可以开始使用JSP获取微信公众号网页授权用户信息了。 1. 获取授权链接 首先,我们需要构造出授权链接,以便用户点击授权。 String redirect_uri = URLEncoder.encode("http://your.domain.com/callback.jsp", "UTF-8"); String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; 其中,redirect_uri是授权后重定向的回调链接地址,需要进行URLEncode编码;scope=snsapi_userinfo表示需要用户授权获取详细信息。 2. 获取授权code 当用户点击授权后,需要在回调页面(上面代码中的callback.jsp)中获取授权code。 String code = request.getParameter("code"); 3. 获取access_token 利用上一步获取授权code,构造出获取access_token的链接,并向该链接发送HTTP GET请求,获取access_token。 String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"; URL url = new URL(tokenUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuffer stringBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line); } JSONObject json = new JSONObject(stringBuffer.toString()); String accessToken = json.getString("access_token"); String openid = json.getString("openid"); 4. 获取用户信息 利用获取到的access_token和openid,可以构造出获取用户信息的链接。 String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; URL url = new URL(userInfoUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuffer stringBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line); } JSONObject json = new JSONObject(stringBuffer.toString()); String nickname = json.getString("nickname"); String headimgurl = json.getString("headimgurl"); 以上就是使用JSP获取微信公众号网页授权用户信息的流程。需要注意的是,获取用户信息需要用户同意授权获取详细信息,并且在构造链接时需要进行URL编码。另外,在实际开发过程中,建议将获取access_token和获取用户信息的代码封装为工具类,以便重复使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值