ETJava Beta | Java    注册   登录
  • QQ第三方登录(2)Springboot集成QQ互联

    发表于 2024-01-06 17:42:07     阅读(250)     博客类别:三方登录

    Springboot集成QQ互联

    集成QQ互联第三方登录 必须先审核通过,提交审核可以参考上一节内容

    在集成之前需要将demo中的SDK4J.jar安装到本地 或在项目中单独引入

    第一步:原生demo是serlvet版本的,我们这里改为springboot版本(其实两个都一样,只是后边使用springboot较多 所以这里直接使用springboot作为载体框架)

    第二部:Springboot版本

    第三步:添加sdk4j的依赖

    <dependencies>
            <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>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.qq</groupId>
                <artifactId>Sdk4J</artifactId>
                <version>2</version>
            </dependency>
        </dependencies>

    第四步:修改qqconnectconfig.properties文件内容

    需要将里面的appid和appkey以及回调地址改为我们自己的

    app_ID = 102083221
    app_KEY = TtACzXqujIcgV4NR
    redirect_URI = http://www.etjava.cn/connect
    
    
    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

    第五步:放置登录图片

    登录图片需要在QQ互联官网进行下载 选择自己合适的尺寸即可

     

    将图片放置到static下的images目录中即可

    第六步:在templates目录下创建一个index页面并使用图片按钮登录

    index.html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title th:text="${title}"></title>
    </head>
    <body>
    <a href="/qqLogin"><img src="/images/qqlogin.png"/></a>
    </body>
    </html>

    第七步:创建controller进行业务处理

    controller参考servlet版本中的IndexServlet和AfterLoginRedirectServlet两个业务处理类

    IndexController

    package com.et.controller;
    
    import com.qq.connect.QQConnectException;
    import com.qq.connect.api.OpenID;
    import com.qq.connect.api.qzone.UserInfo;
    import com.qq.connect.javabeans.AccessToken;
    import com.qq.connect.javabeans.qzone.UserInfoBean;
    import com.qq.connect.oauth.Oauth;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.PrintWriter;
    
    @Controller
    public class IndexController {
    
        @RequestMapping("/")
        public ModelAndView index(){
            ModelAndView mav = new ModelAndView();
            mav.setViewName("index");
            mav.addObject("title","测试登录");
            return mav;
        }
    
        @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();
            }
        }
    
        @RequestMapping("/connect")
        public void connect(HttpServletRequest request, HttpServletResponse response)throws Exception{
            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;
                System.out.println("accessTokenObj.getAccessToken():: "+accessTokenObj.getAccessToken());
                if (accessTokenObj.getAccessToken().equals("")) {
    //                我们的网站被CSRF攻击了或者用户取消了授权
    //                做一些数据统计工作
                    System.out.print("没有获取到响应参数");
                } 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 qzoneUserInfo = new UserInfo(accessToken, openID);
                    UserInfoBean userInfoBean = qzoneUserInfo.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();
            }
        }
    }
    

    最后发布到服务器进行审核或测试即可

    需要注意的是 必须审核通过后才能进行测试 审核通过之前 直接测试会返回100008错误代码 表示appid无效

    * 审核通过后 如果登录成功没有显示用户相关信息 则改为www.xxx.xx这种方式在进行访问并测试即可