准备工作

1.云服务器

2.备案的域名

3.本地调试需要修改hosts文件,将域名映射到127.0.0.1

一、申请QQ互联,并成为开发者
QQ互联:https://connect.qq.com/index.html

登录后,点击头像,进入认证页面,填写信息,等待审核。

审核通过后,点击创建应用


审核通过后,就可以使用APP ID 和 APP Key

二、编写java代码

项目结构

yml配置

server:port: 80qq:oauth:http: //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>

QQController

package com.ck.blog.controller;import com.alibaba.fastjson.JSONObject;
import com.ck.blog.exception.StateErrorException;
import com.ck.blog.utils.QQHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.net.URLEncoder;
import java.util.UUID;/*** @author ck* @create 2019-05-18 20:32*/
@Controller
public class QQController {@Value("${qq.oauth.http}")private String http;/*** 发起请求* @param session* @return*/@GetMapping("/qq/oauth")public String qq(HttpSession session){//QQ互联中的回调地址String backUrl = http + "/qq/callback";//用于第三方应用防止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) +"&state=" + uuid;return "redirect:" + url;}/*** QQ回调* @param request* @return*/@GetMapping("/qq/callback")public String qqcallback(HttpServletRequest request) throws Exception {HttpSession session = request.getSession();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 StateErrorException("QQ,state错误");}}//Step2:通过Authorization Code获取Access TokenString backUrl = http + "/qq/callback";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头像URLreturn "redirect:/home";}}

IndexController

package com.ck.blog.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpSession;/*** @author ck* @create 2019-05-18 20:31*/
@Controller
public class IndexController {@GetMapping("/index")public String index(){return "index";}@GetMapping("/home")public String home(HttpSession session, Model model){String openid = (String) session.getAttribute("openid");String nickname = (String) session.getAttribute("nickname");String figureurl_qq_2 = (String) session.getAttribute("figureurl_qq_2");model.addAttribute("openid",openid);model.addAttribute("nickname",nickname);model.addAttribute("figureurl_qq_2",figureurl_qq_2);return "home";}
}

QQHttpClient

package com.ck.blog.utils;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;/*** @author ck* @create 2019-05-18 20:32* QQ工具类(主要用于解析QQ返回的信息)*/
public class QQHttpClient {//QQ互联中提供的 appid 和 appkeypublic static final String APPID = "xxxxxxxx";public static final String APPKEY = "xxxxxxxxxx";private static JSONObject parseJSONP(String jsonp){int startIndex = jsonp.indexOf("(");int endIndex = jsonp.lastIndexOf(")");String json = jsonp.substring(startIndex + 1,endIndex);return JSONObject.parseObject(json);}public static String getAccessToken(String url) throws IOException {CloseableHttpClient client = HttpClients.createDefault();String token = null;HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");if(result.indexOf("access_token") >= 0){String[] array = result.split("&");for (String str : array){if(str.indexOf("access_token") >= 0){token = str.substring(str.indexOf("=") + 1);break;}}}}httpGet.releaseConnection();return token;}public static String getOpenID(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = parseJSONP(result);}httpGet.releaseConnection();if(jsonObject != null){return jsonObject.getString("openid");}else {return null;}}public static JSONObject getUserInfo(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = JSONObject.parseObject(result);}httpGet.releaseConnection();return jsonObject;}
}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登录页</title>
</head>
<body>
<a href="/qq/oauth">QQ授权登录</a>
</body>
</html>

home.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>QQ授权成功</title>
</head>
<body>
<div>openid:[[${openid}]]
</div>
<div>nickName:[[${nickname}]]
</div>
<div><img th:src="${figureurl_qq_2}">
</div>
</body>
</html>

效果图

java实现QQ互联登录相关推荐

  1. Java 实现QQ第三方登录

    前言:很多时候我们都需要如下的第三方登录,用QQ帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户. 下面让我们来实现吧,可以参考官网文档,也可以看我下面的操作说明   QQ第三方登录接入指 ...

  2. qq互联登录授权php配置,php如何整合qq互联登录

    相关推荐:<PHP培训> php整合qq互联登录 接入QQ互联平台后,我们就可以让用户通过QQ帐号登录来登陆我们的网站,这样减少了注册的繁琐,可以更快 .更便捷的为了我带来更多的用户,下面 ...

  3. Vue + Java 实现QQ第三方登录授权

    一.前言 Vue 实现QQ第三方登录授权需要获取到 APP_ID和回调域地址,关于这2个的获取方式可以参考小编的另外一篇文章 Java 实现QQ第三方登录 温馨小提示: 本文基于springboot+ ...

  4. TP5 实现QQ互联登录功能

    TP5 实现QQ互联登录功能 准备: 开通QQ登录需要QQ互联已审核通过的[开发账号](https://connect.qq.com),创建应用. 创建应用 创建好的应用大概长这样... 点击 查看 ...

  5. 使用nginx搭建Discuz X3.4论坛的QQ互联登录失败问题

    问题描述 使用nginx搭建了一个基于http协议的Discuz X3.4论坛.在安装QQ互联插件后,尝试登录问题是失败,提示以下内容: 抱歉,当前存在网络问题或服务器繁忙,详细错误:connect_ ...

  6. QQ互联登录提示redirect uri is illegal(100010)完美解决方法亲测有用!

    对于网站来说,开通QQ互联登录是非常有必要,QQ互联回调地址该怎么填? 遇到的大多数问题是QQ互联登录时提示redirect uri is illegal(100010)的验证错误,如下图: 对于官网 ...

  7. 电脑桌面云便签怎么绑定QQ互联登录或解绑QQ?

    电脑版桌面云便签用户可以使用会员账号密码登录进入便签主页面,也可以使用微信QQ互联登录.云便签电脑版使用账号密码登录的用户,怎么互联绑定QQ,才可以使用QQ互联登录呢?而如果绑定了QQ互联的用户需要解 ...

  8. java qq登陆 server_java实现QQ互联登录

    yml配置 server: port: 80 qq: oauth: http: //QQ互联中填写的网站地址 导入pom依赖 org.apache.httpcomponents httpclient ...

  9. Java实现QQ第三方登录

    前期准备工作 1.云服务器 2.备案的域名 3.本地调试需要修改hosts文件,将域名映射到127.0.0.1 如何修改hosts文件:https://www.cnblogs.com/toSeeMyD ...

最新文章

  1. Centos6.0 64位MySQL 5.5.20 CMake 安装部署
  2. OVS datapath包处理流程(二十)
  3. numpy.random.rand、numpy.random.randn
  4. 好程序员Web前端分享无法忽视的JavaScript技巧
  5. Drools 在告警关联分析中的应用
  6. 基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析
  7. 如何插入? | 非开车,纯技术交流
  8. 在机器学习中为什么要进行 One-Hot 编码?
  9. 蓝桥杯 BASIC-10 基础练习 十进制转十六进制
  10. OpenCV探索之路(五):图像变换——边缘检测(canny、sobel、laplacian)
  11. Tricks(三十六)—— remove_list_entry(无需 if 逻辑)
  12. 如何恢复隐藏的窗口 已知进程名称_Windows 10如何显示文件名后缀?
  13. vmware linux ssh密码,从 CLI 重置 Linux VM 密码和 SSH 密钥 - Azure Virtual Machines | Microsoft Docs...
  14. html自动关机代码,电脑自动关机命令,shutdown命令
  15. SVM 垃圾邮件分类
  16. Android App瘦身实战
  17. s3cCTF(1)crypto
  18. 07Linux打包解压文件-Exiting with failure status due to previous errors
  19. 编程,从来都不晚:来自日本的82岁APP开发者
  20. Stream流学习记录

热门文章

  1. 移动通信现状及技术发展展望(转)
  2. Tomcat和Nginx版本信息泄露问题
  3. 【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效
  4. 平头哥芯片用户手册下载方法
  5. 【Linux】ssh登录出现Access denied password问题
  6. 51单片机串口通信发送以及接收代码详解2
  7. 薛猫猫杯程序设计网络赛___球球大作战 —— 二分
  8. “盗窃”而来的 3000 亿单词?ChatGPT 摊上事了,遭索赔 30 亿美元!
  9. 想入手抖音定制生日祝福短视频,没有创意思路怎么办?几个方面带你了解整个流程
  10. unicode编码的中文转换