前言

为了增加用户体验,用户能够快速的注册登录,第三方账号进行登录注册的的需求也就由此而诞生
开发环境: 
IDE: STS
jdk版本: 1.8
框架: SSM

要做QQ第三方登录,首先得在QQ互联(https://connect.qq.com/index.html)上有账号,也就是有QQ账号,然后申请成为开发者。你可以选择是个人和公司类型,根据你个人情况选择,然后如下操作:

1. QQ互联创建应用并配置

2. 登录入口

<a class="qq" href="/company/loginByQQIndex">qq登录</a>

3. QQ登录初始化

@RequestMapping("/loginByQQIndex")@ResponseBodypublic void loginByQQIndex(String url, HttpServletRequest request, HttpServletResponse response) {response.setContentType("text/html;charset=utf-8");try {response.sendRedirect(new Oauth().getAuthorizeURL(request));} catch (Exception e) {e.printStackTrace();}}

4. QQ互联回调域,就是QQ互联配置的,这是一个jsp文件, qq_callback.jsp ,QQ互联回调会根据配置的回调域进入这个页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title><script type="text/javascript" src="${pageContext.request.contextPath}/ejs/jquery-1.11.3.min.js"></script>
<script type="text/javascript">// 获取地址栏参数function GetQueryString(name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if (r != null)return unescape(r[2]);return null;}// 调用方法var a = GetQueryString("code");var b = GetQueryString("state");function autoSubmit(){document.getElementById("code").value=a;document.getElementById("state").value=b;document.getElementById("my-from").submit();}function geturl(){var test = window.location.href;alert(test);}</script>
</head>
<body οnlοad="autoSubmit()">
正在加载...
<form action="/company/loginByQQ" method="post" id="my-from"><input type="hidden" id="code" name="codeNum"/><input type="hidden" id="state" name="stateNum"/>
</form>
</body>
</html>

5. 上一步会处理QQ互联返回值进行处理并自动向后台发送请求,现在处理请求

    // qq登录回调地址private String QQ_BACK_URL = "http://192.168.1.254:8080//qq_callback.jsp";

/*** QQ登录逻辑处理* * @Title loginByQQ* @param @param*            codeNum* @param @param*            stateNum* @param @param*            url* @param @return* @return String*/@RequestMapping("/loginByQQ")public String loginByQQ(String codeNum, String stateNum, String refer, HttpServletRequest request, Model model) {try {// 获取tokenString token_url = "https://graph.qq.com/oauth2.0/token";String token_parm = "grant_type=authorization_code&client_id=101428743&client_secret=22bef5c389b2b2b9921baf1fb3f4bcd1&code="+ codeNum + "&redirect_uri=" + QQ_BACK_URL;String token_result = SendRequestUtils.sendGet(token_url, token_parm);// String token_result = SendRequestUtils.sendPost(token_url,// token_parm);// 延长token过期时间String refresh_token_url = "https://graph.qq.com/oauth2.0/token";String refresh_token_parm = "grant_type=refresh_token&client_id=101428743&client_secret=22bef5c389b2b2b9921baf1fb3f4bcd1&refresh_token="+ token_result.split("&")[2].substring(14);String refresh_token_result = SendRequestUtils.sendGet(refresh_token_url, refresh_token_parm);String[] strings = refresh_token_result.split("&");String token = strings[0].substring(13);// 获取openidString openid_url = "https://graph.qq.com/oauth2.0/me";String openid_parm = "access_token=" + token;String openid_result = SendRequestUtils.sendGet(openid_url, openid_parm);JSONObject jsonObject = JSONObject.fromObject(openid_result.split(" ")[1]);String openid = jsonObject.getString("openid");String client_id = jsonObject.getString("client_id");// 获取qq用户信息String qq_string = SendRequestUtils.sendGet("https://graph.qq.com/user/get_user_info","access_token=" + token + "&oauth_consumer_key=" + client_id + "&openid=" + openid);// 获取qq昵称JSONObject qq_string_json = JSONObject.fromObject(qq_string);String name = qq_string_json.getString("nickname");// 获取QQ登录统一标识String unionid_result = SendRequestUtils.sendGet("https://graph.qq.com/oauth2.0/me?access_token=" + token + "&unionid=1", null);JSONObject unionidJson = JSONObject.fromObject(unionid_result.substring(9, unionid_result.length() - 2));String unionid = unionidJson.getString("unionid");// 保存用户信息// xxx// 判断是否用qq登录过网站// xxx// 用qq登录过网站,就更新用户信息// xxx// 没有用qq登录过网站,将unionid和用户信息写入数据库// xxx// 返回主页return "redirect:/";} catch (Exception e) {e.printStackTrace();return "redirect:/error";}}

6. 上一步有用到工具类,如下:

SendRequestUtils, java后台发送请求的工具类:
package com.pro.huanbao.common.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;/*** @Title   SendRequestUtils.java* @Package com.pro.huanbao.common.utils* @author  wanpu_ly* @dade    2017年10月13日 上午8:43:42* @version V1.0* 类说明:    */
public class SendRequestUtils {/*** 向指定URL发送GET方法的请求* * @param url*            发送请求的URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL 所代表远程资源的响应结果*/public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;if (param == null) {urlNameString = url;}URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 向指定 URL 发送POST方法的请求* * @param url*            发送请求的 URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}return result;}
}

JsonUtils , 处理json数据的工具类:
package com.pro.huanbao.common.utils;import java.util.List;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;/*** 淘淘商城自定义响应结构*/
public class JsonUtils {// 定义jackson对象private static final ObjectMapper MAPPER = new ObjectMapper();/*** 将对象转换成json字符串。* <p>Title: pojoToJson</p>* <p>Description: </p>* @param data* @return*/public static String objectToJson(Object data) {try {String string = MAPPER.writeValueAsString(data);return string;} catch (JsonProcessingException e) {e.printStackTrace();}return null;}/*** 将json结果集转化为对象* * @param jsonData json数据* @param clazz 对象中的object类型* @return*/public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {try {T t = MAPPER.readValue(jsonData, beanType);return t;} catch (Exception e) {e.printStackTrace();}return null;}/*** 将json数据转换成pojo对象list* <p>Title: jsonToList</p>* <p>Description: </p>* @param jsonData* @param beanType* @return*/public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);try {List<T> list = MAPPER.readValue(jsonData, javaType);return list;} catch (Exception e) {e.printStackTrace();}return null;}}

7. 以及一些jar包依赖

QQ互联依赖下载 : http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/doc/qqConnect_Server_SDK_java_v2.0.zip
json: 
<!-- Jackson Json处理工具包 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.2</version></dependency>

8. 还有一个配置文件,这个文件得让spring扫描到,   qqconnectconfig.properties

app_ID = xxx
app_KEY = xxx
redirect_URI = qq登录回调地址
scope = get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr
baseURL = https://graph.qq.com/
getUserInfoURL = https://graph.qq.com/user/get_user_info
accessTokenURL = https://graph.qq.com/oauth2.0/token
authorizeURL = https://graph.qq.com/oauth2.0/authorize
getOpenIDURL = https://graph.qq.com/oauth2.0/me
addTopicURL = https://graph.qq.com/shuoshuo/add_topic
addBlogURL = https://graph.qq.com/blog/add_one_blog
addAlbumURL = https://graph.qq.com/photo/add_album
uploadPicURL = https://graph.qq.com/photo/upload_pic
listAlbumURL = https://graph.qq.com/photo/list_album
addShareURL = https://graph.qq.com/share/add_share
checkPageFansURL = https://graph.qq.com/user/check_page_fans
addTURL = https://graph.qq.com/t/add_t
addPicTURL = https://graph.qq.com/t/add_pic_t
delTURL = https://graph.qq.com/t/del_t
getWeiboUserInfoURL = https://graph.qq.com/user/get_info
getWeiboOtherUserInfoURL = https://graph.qq.com/user/get_other_info
getFansListURL = https://graph.qq.com/relation/get_fanslist
getIdolsListURL = https://graph.qq.com/relation/get_idollist
addIdolURL = https://graph.qq.com/relation/add_idol
delIdolURL = https://graph.qq.com/relation/del_idol
getTenpayAddrURL = https://graph.qq.com/cft_info/get_tenpay_addr
getRepostListURL = https://graph.qq.com/t/get_repost_list
version = 2.0.0.0

完。

第三方插件的引用(4):JAVA网站接入QQ登录相关推荐

  1. 网站接入QQ登录过程(防踩坑)

    一个要留住用户的网站,经常会以通用的方式进行登录,手机号.微信.QQ.邮箱,这些登录都各有自己的规则,这篇文章记录一下接入QQ登录的过程,给大家梳理下,防止后来人踩坑. 1.进行开发者注册: 在QQ互 ...

  2. html 加QQ链接QQ版本不支持,网站接入QQ登录(JS版)【最新教程 04.10更新】,亲身失败百次的总结...

    开发阶段(偏后端的同学可以查看 PHP版 教程) 3.1. 因为 QQ互联 官网只是简单的提供了 JS-SDK 以及相关的 API,可能部分同学初见比较茫然.所以为了帮助同学们更好理解,我整理出以下内 ...

  3. 网站接入QQ登录最新2020 java版本

    1.首先先注册账号,然后填资料审核,等个三四天吧大概 https://connect.qq.com/ 2.审核通过后点击创建应用,把备案号什么的都填(这个审核两天之内一般) !!! 这里有个重点,网站 ...

  4. SpringBoot + Vue 个人网站接入QQ登录手把手教你 完整版 新手友好

    关于使用的QQ登录的原因 **最大的原因各位都想的到,QQ注册人数虽然呈下坡状态,但其影响力和使用群体之大不可忽视.下面我将一步步的将我如何实现QQ登录的步骤复现一遍** 准备工作 进入QQ互联网址 ...

  5. php接入qq登陆,网站接入QQ登录-腾讯开放平台

    完成开发者认证 使用qq登录完成实名认证,点击创建应用 创建网站应用 填写相关信息 回调域填写很重要如果填写错误扫码会出现 100010 [QQ登录]登录常见错误码 前端 这是目前网站接入的qq登录, ...

  6. 网站接入QQ登录(QQ互联)php版的流程

    0.下载QQ登录(QQ互)php版:下载地址:点击打开链接(本文编写时最新版本:V2.1 ) 1.在QQ互联网站注册一个appid,配置网站地址和回调地址. 例:http://yzdd.app1101 ...

  7. php网站 qq登陆,php写的插件网站接入QQ登录,QQ互联

    qq按钮这里的链接是入口,调用你的api api_qq.php前端直接链接到此/** * 这个QQ登录简单实用,只要大家看我写的注释会一目了然,请注意看哦. * 带有"@todo" ...

  8. 网站接入QQ互联(JAVA版)

    简介: QQ互联是腾讯旗下的开放平台,通过QQ互联,网站主和开发者可以申请接入QQ登录.用户可以使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间和朋友网,通过获取API授权, ...

  9. java加按钮_如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了HashMap和TreeMap的知识,今天跟大家分享下对 ...

最新文章

  1. php回调函数原理和实例
  2. Linuxubuntu chmod和chown命令用法详细介绍
  3. flyway命令行使用示例:指定conf配置文件
  4. c++ primer 5th第13章拷贝控制知识点和自编习题答案
  5. 求一个数字是几位数(简便)
  6. 【leetcode】Maximum Subarray
  7. 吸毒女5次搬家躲粉友:想给女儿干净环境
  8. 文字处理技术:研究下划线,得到一个奇怪的数字4.55
  9. 光纤通信原理实验箱QY-JXSY03
  10. 电容式门把手工作原理
  11. Java实现 蓝桥杯 算法训练 递归求二项式系数
  12. Camera 主观画质测试(参考)
  13. 数据结构与算法 试题与答案
  14. 工作中常用的JS函数整理分享(欢迎大家补充)
  15. IDM下载器:站点抓取相关设置介绍
  16. Macbook非常好用的一些功能
  17. 记一次破解前端加密详细过程
  18. java 泛型 与类反射_Java技能 —— 对象泛型以及类反射机制的应用
  19. Kitti中GPS/IMU数据格式
  20. php 上传文件 重命名_如何用PHP给上传的文件改名

热门文章

  1. Address Sanitizer 用法
  2. Linux中Lun是什么,以及和存储卷的区别
  3. 周志明:《凤凰架构:构建可靠的大型分布式系统》
  4. 怎么打开jsp文件目录_它怎么能这么快?
  5. 时尚主题快闪视频相册视频案例制作教程(可转载)
  6. tsf定时任务迁移到xxl-job
  7. 4款一眼万年的精品软件,免费又好用,可惜很多人不知道
  8. DEVOPS:统一DEV、OPS和QA
  9. 自定义圆形进度条 自定义倒计时进度条
  10. 什么是数据科学?如何把数据变成产品?