网站首页 文章专栏 网站接入qq互联,使用qq登录
网站接入qq互联,使用qq登录

一,开发条件

1,进入QQ互联官网,登陆后,点击应用管理,如果你不是开发者,需要申请下,很快就能通过。

2,通过后,点击创建应用,填写相应的网站信息,与回调地址(重要)。

结束后应该是这个样子的:

MJ}I5`W{%`[P8G$%`~K@YDH.png


记住App Id 和App Key,回调地址的名字可以自己随便起,也是可以随时改的。


二,获取开发jar包

进入文档资料>API文档,sdk及资源下载,找到java SDK 下载。

8_H11XDA8[UNIG8WVVOLOQ3.png

直接引入Sdk4J.jar 包和qqconnectconfig.properties 文件至项目工程内,maven添加本地jar包方式添加,修改qqconnectconfig.properties 文件,将属性改为自己实际的。


三,js调用controller跳到登录页

在页面你想要的位置,绑定js点击事件进入controller

$.ajax({
   type: "POST",
   url: "/getLoginMsg",
   dataType: "json",
   success: function(data){
      if(data.code == 1){
         window.location.href= "/qqLogout";
      }else if(data.code == 0){
         window.location.href= "/qqLogin";
      }
   },
   error:function(XMLHttpRequest, textStatus, errorThrown){
           layer.alert("获取用户登录信息错误!", {
      icon : 5
   });
  }
});

在controller里做处理

@RequestMapping("/qqLogin")
public void qqLogin(HttpServletRequest request, HttpServletResponse response){
    try {
        response.setContentType("text/html;charset=utf-8");
        response.sendRedirect(new Oauth().getAuthorizeURL(request));
        request.getSession().setAttribute("beforeLoginUrl",request.getHeader("Referer"));
    } catch (QQConnectException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

setAttribute("beforeLoginUrl",..) 是为了记录登录前的页面,等待登陆成功后返回到该页面。

此时,页面已经跳转到登录页,等用户点击授权登录后,便会进入回调函数。


四,登录回调

@RequestMapping("/qqCallBack")
public String qqCallBack(HttpServletRequest request, HttpServletResponse response){
    log.info("===================qqCallBack成功!=======================");
    String beforeLoginUrl = "";
    response.setContentType("text/html;charset=utf-8");
    try {
        String code = request.getParameter("code");
        String state = request.getParameter("state");
        log.info("============code:" + code + "============");
        log.info("============state:" + state + "============");
        // 此处可能会有疑惑,之前我们并没有setAttribute("qq_connect_state"),这里怎么就get了
        // 查找sdk源码发现,在登录前的getAuthorizeURL(request)方法里面默认set过了
        String sessionState = (String) request.getSession().getAttribute("qq_connect_state");
        log.info("============sessionState:" + sessionState + "====sessionState与state一致方可登陆成功========");
        if(!"".equals(sessionState) && state.equals(sessionState)){
            AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);

            String accessToken   = null,
                    openID        = null;
            long tokenExpireIn = 0L;

            if (accessTokenObj.getAccessToken().equals("")) {     
                //  我们的网站被CSRF攻击了或者用户取消了授权 做一些数据统计工作
                log.info("=============没有获取到响应参数=============");
                System.out.print("没有获取到响应参数");
            } else {
                accessToken = accessTokenObj.getAccessToken();
                tokenExpireIn = accessTokenObj.getExpireIn();

                Cookie cookie = new Cookie("accessToken", accessToken);
                cookie.setMaxAge(60 * 24 * 5);
                response.addCookie(cookie);

                log.info("============accessToken:" + accessToken + "============");
                log.info("============tokenExpireIn:" + tokenExpireIn + "============");


                request.getSession().setAttribute("access_token", accessToken);
                request.getSession().setAttribute("token_expirein", String.valueOf(tokenExpireIn));

                // 利用获取到的accessToken 去获取当前用的openid -------- start
                OpenID openIDObj =  new OpenID(accessToken);
                openID = openIDObj.getUserOpenID();

                UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
                UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();

                log.info("=======头像:"+ userInfoBean.getAvatar().getAvatarURL100() + "==========");
                log.info("=======昵称:"+ userInfoBean.getNickname() + "==========");
                log.info("=======性别:"+ userInfoBean.getGender() + "==========");

                log.info("欢迎你,代号为 " + openID + " 的用户!");
                log.info("用户信息:" + userInfoBean);
                
                // 自己网站的用户实体类,根据openId查询是否已存在
                com.yx.xingchenge.dataObject.UserInfo localUser = userInfoRepository.findByOpenId(openID);    
               
                if(localUser != null){
                    // 老用户处理
                }else{
                    // 新用户处理
                    userInfoRepository.save(localUser);
                }

                beforeLoginUrl = (String) request.getSession().getAttribute("beforeLoginUrl");
                // 登录成功后,返回登录之前的网页
                response.sendRedirect(beforeLoginUrl);        
            }
        }else{
            beforeLoginUrl = (String) request.getSession().getAttribute("beforeLoginUrl");
            response.sendRedirect(beforeLoginUrl);
        }
    } catch (Exception e) {
        try {
            beforeLoginUrl = (String) request.getSession().getAttribute("beforeLoginUrl");
            response.sendRedirect(beforeLoginUrl);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
    }
    return null;
}

  源码中setAttribute():  

1H@}EIC(5XX[_{SOBO432`Q.png


 说明: 这种方式是按照sdk来的,当然也可以自己封装一套登录的方法,sdk中默认从根目录加载qqconnectconfig.properties属性,其他的操作sdk帮我们完成好了,所以我们只需要在项目根目录下放入qqconnectconfig.properties文件,在文件中修改自己网站的属性。


  源码中读取qqconnectconfig.properties文件 : 


I~T$$N3Y$~MT0GPXTEP7136.png




版权声明:本文由星尘阁原创出品,转载请注明出处!

本文链接:http://www.52xingchen.cn/detail/41




赞助本站,网站的发展离不开你们的支持!
来说两句吧
最新评论