QQ 互联参考文档:https://wiki.connect.qq.com/
1. 注册开发者
- 在 QQ 互联开放平台首页 https://connect.qq.com/ 点击登录
- 登录成功后跳转到开发者注册页面,在注册页面按要求提交公司或者个人的基本资料
- 按照要求提交资料后,审核人员开始进行审核,审核通过之后即可成为开发者
2. 创建应用(网站应用及应用接入申请)
应用在接入前,首先需要进行申请获取对应的 appid 与 appkey,以保证后续流程中可正确对网站与用户进行验证和授权
开发者注册完成后,点击“应用管理”按钮,然后点击创建应用
选择创建应用的类型,这里以网站应用为例子:
- http://icp.chinaz.com/ 查看域名的备案信息
- 网站回调地址例如:https://www.qq.com/data /data 接口可以拿到回调的信息
- 回调地址填写规范:https://wiki.connect.qq.com/%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E4%BF%AE%E6%94%B9%E6%96%B9%E6%B3%95
网站信息填写完成后,点击“创建应用”后,网站应用创建完成,点击“应用管理”,进入管理中心,在管理中心可以查看到网站获取的 appid 和 appkey
在应用管理可以看到创建的应用,点击查看,点击左侧的“应用接口”,可以看到已获取的接口,使用 QQ登录功能
至此创建应用成功,等待审核成功就可以接入到 java 代码中实现 QQ 第三方登录的功能
3. Java 代码接入 QQ 第三方登录功能
- 创建一个 Spring Boot 项目:qq-login-demo,并且导入以下依赖
<!-- QQ 第三方登录 -->
<dependency>
<groupId>net.gplatform</groupId>
<artifactId>Sdk4J</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 在 resources 目录下创建
qqconnectconfig.properties
配置文件
# qq 登录相关的配置
# 从qq互联平台得到的应用APPID
app_ID = 10xxxx86
# 从qq互联平台得到的应用APPKEY
app_KEY = 1d8axxxxxxxxxxxxxxxx5b7b7
# 设置的回调地址
redirect_URI = http://miss123.top/data
scope = get_user_info
#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
- 在 templates 文件夹下创建一个 index.html 登录页面,简单的链接跳转到 controller 中的 qqLogin 接口,但是可能简单的会审核不通过(所以尽量找一个界面比较完善的登录页面,这里以简单为主)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>QQ 第三方登录测试</h1>
<a href="{$openLoginUrl.connectQQ}" class="icon connect-qq"><span icon-bg2="/qqLogin"></span> QQ登录</a>
</body>
</html>
- 创建一个 LoginController
/**
* @author lishisen
* @description 登录控制器
* @date 2022/1/18 16:48
**/
@Slf4j
@Controller
public class LoginController {
/**
* @author lishisen
* @description 当访问 80 端口的时候进入登录页面
* @date 2022/1/19 10:13
**/
@RequestMapping("/")
public ModelAndView toIndexPage(ModelAndView model) {
log.info("进入登录页面......");
model.addObject("title", "QQ 第三方登录测试");
model.setViewName("aaa");
return model;
}
/**
* @author lishisen
* @description qq 登录,带参数发送服务器
* @date 2022/1/19 10:16
**/
@RequestMapping("/qqLogin")
public void qqLogin(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=utf-8");
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @author lishisen
* @description 回调
* @date 2022/1/19 10:19
**/
@RequestMapping("/data")
public void connect(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
try {
AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
String accessToken = null, openId = null;
long tokenExpireIn = 0L;
if (accessTokenObj.getAccessToken().equals("")) {
// 我们的网站被 CSRF 攻击力或者用户取消了授权,做一些数据统计工作
log.error("没有获取到响应参数!!!");
} else {
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
request.getSession().setAttribute("demo_access_token", accessToken);
request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
// 利用获取到的 accessToken 去获取当前用户的 openid ------ start
OpenID openIDObj = new OpenID(accessToken);
openId = openIDObj.getUserOpenID();
out.println("欢迎您,代号为:" + openId + "的用户");
request.getSession().setAttribute("demo_openid", openId);
}
UserInfo userInfo = new UserInfo(accessToken, openId);
UserInfoBean userInfoBean = userInfo.getUserInfo();
out.println("<br/>");
if (userInfoBean.getRet() == 0) {
out.println(userInfoBean.getNickname() + "<br/>");
out.println(userInfoBean.getGender() + "<br/>");
out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL30() + "><br/>");
out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL50() + "><br/>");
out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL100() + "><br/>");
} else {
out.println("很抱歉,我们没能正确获取到您的信息,原因是:" + userInfoBean.getMsg());
}
} catch (QQConnectException e) {
e.printStackTrace();
}
}
}
- 至此,项目搭建完成,将项目打包放到服务器上(备案域名绑定的服务器),并设置启动端口为 80 端口,如果有 nginx 需要做一下端口代理映射
4. 测试登录
放到浏览器上之后访问自己绑定的域名(我的 miss123.top)
然后点击 QQ 登录进入 QQ 扫描登录页面
扫码之后在手机上授权登录,登录成功后返回 QQ 用户的昵称,性别,头像,还有一个唯一的用户id
至此,Java + QQ 实现第三方登录完成。QQ 互联测试成功,那么其他的第三方登录方法于此如出一辙,博主认为最麻烦的还是审核部分,我修改了 6 次审核信息才可以审核通过。此外其他的第三方登录微信是需要交费用的,百度是最方便使用的,信息填写完成就可以使用了,不用等待审核。