0
点赞
收藏
分享

微信扫一扫

QQ 第三方登录知识点总结

westfallon 2022-02-18 阅读 140
java


QQ 互联参考文档:https://wiki.connect.qq.com/

1. 注册开发者

  1. 在 QQ 互联开放平台首页 https://connect.qq.com/ 点击登录

image-20220124133409597

  1. 登录成功后跳转到开发者注册页面,在注册页面按要求提交公司或者个人的基本资料

image-20220124133526396

  1. 按照要求提交资料后,审核人员开始进行审核,审核通过之后即可成为开发者

2. 创建应用(网站应用及应用接入申请)

应用在接入前,首先需要进行申请获取对应的 appid 与 appkey,以保证后续流程中可正确对网站与用户进行验证和授权

开发者注册完成后,点击“应用管理”按钮,然后点击创建应用

image-20220124133903659

选择创建应用的类型,这里以网站应用为例子:

image-20220124142746807

image-20220124142820223

image-20220124142934249

  • 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

image-20220124143212968

网站信息填写完成后,点击“创建应用”后,网站应用创建完成,点击“应用管理”,进入管理中心,在管理中心可以查看到网站获取的 appid 和 appkey

image-20220124143350232

在应用管理可以看到创建的应用,点击查看,点击左侧的“应用接口”,可以看到已获取的接口,使用 QQ登录功能

image-20220124143636179

至此创建应用成功,等待审核成功就可以接入到 java 代码中实现 QQ 第三方登录的功能

3. Java 代码接入 QQ 第三方登录功能

  1. 创建一个 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>
  1. 在 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
  1. 在 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>

image-20220124144331668

  1. 创建一个 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();
        }
    }

}
  1. 至此,项目搭建完成,将项目打包放到服务器上(备案域名绑定的服务器),并设置启动端口为 80 端口,如果有 nginx 需要做一下端口代理映射

4. 测试登录

放到浏览器上之后访问自己绑定的域名(我的 miss123.top)

image-20220124145132523

然后点击 QQ 登录进入 QQ 扫描登录页面

image-20220124145350344

扫码之后在手机上授权登录,登录成功后返回 QQ 用户的昵称,性别,头像,还有一个唯一的用户id

image-20220124150124156

至此,Java + QQ 实现第三方登录完成。QQ 互联测试成功,那么其他的第三方登录方法于此如出一辙,博主认为最麻烦的还是审核部分,我修改了 6 次审核信息才可以审核通过。此外其他的第三方登录微信是需要交费用的,百度是最方便使用的,信息填写完成就可以使用了,不用等待审核。

举报

相关推荐

0 条评论