Java如何实现QQ第三方登录

前期准备工作1.云服务器
2.备案的域名
3.本地调试需要修改hosts文件 , 将域名映射到127.0.0.1
申请QQ互联 , 并成为开发者申请QQ互联创建应用时需要备案域名 , 所以建议提前准备备案域名 。
QQ互联:https://connect.qq.com/index.html
登录后 , 点击头像 , 进入认证页面 , 填写信息 , 等待审核 。
 

Java如何实现QQ第三方登录

文章插图
 
审核通过后创建应用
 
Java如何实现QQ第三方登录

文章插图
 
应用创建通过审核后 , 就可以使用App ID 和 APP Key
 
Java如何实现QQ第三方登录

文章插图
 
前期工作就这些了 , 后面可以开始写代码了 。
项目结构:
 
Java如何实现QQ第三方登录

文章插图
 
properties或者yml配置文件(这里就是简单的配置了一下 , 可以自行添加数据库等配置)
server.port=80server.servlet.context-path=/ #qq互联qq.oauth.http:QQ互联中申请填写的网站地址 
Java如何实现QQ第三方登录

文章插图
 
在pom中添加依赖
<!--httpclient--><dependency><groupId>org.Apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency><!--阿里 JSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>发送QQ登录请求
定义全局变量获取配置文件中的网站地址
@Value("${qq.oauth.http}")private String http;定义登录回调地址(可以用网站地址拼接或者直接写)
//QQ互联中的回调地址String backUrl = http + "/index"; 
Java如何实现QQ第三方登录

文章插图
 
登录请求方法代码
【Java如何实现QQ第三方登录】@GetMapping("/qq/login")public String qq(HttpSession session) throws UnsupportedEncodingException {//QQ互联中的回调地址String backUrl = http + "/index";//用于第三方应用防止CSRF攻击String uuid = UUID.randomUUID().toString().replaceAll("-","");session.setAttribute("state",uuid);//Step1:获取Authorization CodeString url = "https://graph.qq.com/oauth2.0/authorize?response_type=code"+"&client_id=" + QQHttpClient.APPID +"&redirect_uri=" + URLEncoder.encode(backUrl, "utf-8") +"&state=" + uuid;return "redirect:" + url;}正确返回示例:
JSON示例:
Content-type: text/html; charset=utf-8{"ret":0,"is_lost":0,"nickname":"Peter","gender":"男","country":"中国","province":"广东","city":"深圳","figureurl":"http://imgcache.qq.com/qzone_v4/client/userinfo_icon/1236153759.gif","is_yellow_vip":1,"is_yellow_year_vip":1,"yellow_vip_level":7,"is_yellow_high_vip": 0}错误返回示例
Content-type: text/html; charset=utf-8{"ret":1002,"msg":"请先登录"}用户资料的接口文档:https://wiki.open.qq.com/wiki/v3/user/get_info
请求成功 , 用户确认登录后回调方法
@GetMapping("/index")public String qqcallback(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpSession session = request.getSession();//qq返回的信息String code = request.getParameter("code");String state = request.getParameter("state");String uuid = (String) session.getAttribute("state");if(uuid != null){if(!uuid.equals(state)){throw new QQStateErrorException("QQ,state错误");}}//Step2:通过Authorization Code获取Access TokenString backUrl = http + "/index";String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code"+"&client_id=" + QQHttpClient.APPID +"&client_secret=" + QQHttpClient.APPKEY +"&code=" + code +"&redirect_uri=" + backUrl;String access_token = QQHttpClient.getAccessToken(url);//Step3: 获取回调后的 openid 值url = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token;String openid = QQHttpClient.getOpenID(url);//Step4:获取QQ用户信息url = "https://graph.qq.com/user/get_user_info?access_token=" + access_token +"&oauth_consumer_key="+ QQHttpClient.APPID +"&openid=" + openid;//返回用户的信息JSONObject jsonObject = QQHttpClient.getUserInfo(url);//也可以放到redis和MySQL中 , 只取出了部分数据 , 根据自己需要取session.setAttribute("openid",openid);//openid,用来唯一标识qq用户session.setAttribute("nickname",(String)jsonObject.get("nickname")); //QQ名session.setAttribute("figureurl_qq_2",(String)jsonObject.get("figureurl_qq_2")); //大小为100*100像素的QQ头像URL//响应重定向到home路径return "redirect:/home";}


推荐阅读