springboot实现第三方qq登入

springboot实现第三方qq登入

想实现qq登入,当然是要去qq互联注册账号,https://connect.qq.com/index.html

在这里插入图片描述在这里插入图片描述
按照提示来,是公司的填写公司,个人填写个人,之后就是等待审核通过。
通过之后在《应用管理》,创建应用 ,因为我做的是网站选择了网站应用在这里插入图片描述
在这里插入图片描述
这里的回调地址要强调一下,可以写多个回调地址,qq互联会根据自己定义的回调地址,返回那个地址,现在说你可能会比较懵,别着急慢慢往下就会明白,使用分号 ;隔开,我之前没仔细看用的是逗号,用了两天才走出这个坑,回调域名是不能写http://localhost:8080/index.html,
,我这个域名是已经备过案的,qq是提供了测试方法,但是我不会…在这里插入图片描述
创建成功会分配给我们appid 和appkey 这个很重要,之后就是看文档,我说肯定,没有看官方文档表达的清楚,官方文档
看两遍差不多就对qq登入了解差不多了,api就比较坑了,qq互联上没有java的,不用api自己也可以做,但是有现成的干嘛不用。。嘻嘻。java的api要去腾讯开放平台下载。在这里插入图片描述
在这里插入图片描述
解压之后打开下面这个小项目,剩下的就是复制粘贴,,在这里插入图片描述
项目中有qqconnectconfig.properties文件上图我将它复制到src的根目录下,还要修改文件里面的参数
在这里插入图片描述
要修改的就三处地方 这三个就不解释了你们都懂,使用api肯定要引入依赖了

       <dependency>
        <groupId>net.gplatform</groupId>
        <artifactId>Sdk4J</artifactId>
        <version>2.0</version>
       </dependency>

下面这是接收请求的跳转重定向的

   @Autowired
    private HttpServletResponse response;   
    
    @Autowired
    private HttpServletRequest request;
   
/**
  * qq跳转
 * @throws QQConnectException 
 * @throws IOException 
  */
   @RequestMapping("/QQlong")
   private ResponseResuilt<?> SetQQLong(HttpSession session)throws ExistingExcetion {
	  if(session.getAttribute("uid")==null) {
		  try {
			response.sendRedirect(new Oauth().getAuthorizeURL(request));
		} catch (IOException | QQConnectException e) {			
			throw new ExistingExcetion("出现错误");
		}
	  }else {
		  return new ResponseResuilt<>(3,"已登入");
	  }
	  return null;
   }


然后会重定向到我设置的回调页面吗,前端我用的是ajax
$(function(){
    	
    	var search = location.search;
	    var data = search.substring(search.indexOf("?")+1,search.length);
    	if(data.length>50){
    		 $.ajax({
    	    		"url":"../afterlogin",
    	    		"data":data,
    				 "Type": "POST",
    				 "dataType": "json",
    				 "success":function(json){
    					 if(json.number == 200){
    					
    					 }else{
    						 yichangtishi(json.message,1) 						 
    					 }
    				 }
    	    	})
    	}else{
    		return;
    	}	   
    })

后端接收
 /**
    * qq登入
    * @param session
    * @return
 * @throws NullShuJuException 
    */
   
   @RequestMapping("/afterlogin")
  private ResponseResuilt<?> GetQQ(HttpSession session) throws NullShuJuException{
	   service.setQQ(request, session);
	  return new ResponseResuilt<TheUser_l>(success);
  }

下面的就和下载的demo一样了,只不过我又加了些自己的逻辑


        /**
         * qq登入获取信息
         * @throws  
         */
		@Override
		public TheUser_l setQQ(HttpServletRequest request, HttpSession session)throws NullShuJuException{
			// TODO Auto-generated method stub
			TheUser_l touxiang = new TheUser_l();
			try {
				//创建对象
				AccessToken accessTokenobj = (new Oauth()).getAccessTokenByRequest(request);
				//用户信息和唯一ID			
				String accessToken   = null, openID  = null;
		        long tokenExpireIn = 0L;
		        //code=E4171093538675B89139C5ACB1FD6955&state=e8457f98419be3a042b890396d46cc51
		        if(accessTokenobj.getAccessToken().equals("")) {
		        	throw new NullShuJuException("没有获取到数据");
		        }else{
		        	accessToken = accessTokenobj.getAccessToken();
		        	tokenExpireIn = accessTokenobj.getExpireIn();
		           // 利用获取到的accessToken 去获取当前用的openid -------- start
	                OpenID openIDObj =  new OpenID(accessToken);
	                openID = openIDObj.getUserOpenID();
	                UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
	                UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();	               	               
	                
	                if(userInfoBean.getRet() == 0) {
	                
	          		        //这里我就省略了
	          		      
	                	}else {
	                		
	                //这里我就省略了
	                }
	                }else {
	                	throw new NullShuJuException("很抱歉,我们没能正确获取到您的信息,原因是"+userInfoBean.getMsg());
	                }
		        }
			
			} catch (QQConnectException e) {				
				e.printStackTrace();
			}
			
			return touxiang;
		}
==========下面是官方demo的代码



package com.qq.connect.demo;

import com.qq.connect.QQConnectException;
import com.qq.connect.api.OpenID;
import com.qq.connect.api.qzone.PageFans;
import com.qq.connect.api.qzone.UserInfo;
import com.qq.connect.javabeans.AccessToken;
import com.qq.connect.javabeans.qzone.PageFansBean;
import com.qq.connect.javabeans.qzone.UserInfoBean;
import com.qq.connect.javabeans.weibo.Company;
import com.qq.connect.oauth.Oauth;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
 * Date: 12-12-4
 * Time: 下午4:36
 */
public class AfterLoginRedirectServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request, response);
    }

    protected void doPost(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攻击了或者用户取消了授权
//                做一些数据统计工作
                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);
                out.println("<a href=" + "/shuoshuoDemo.html" +  " target=\"_blank\">去看看发表说说的demo吧</a>");
                // 利用获取到的accessToken 去获取当前用户的openid --------- end


                out.println("<p> start -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- start </p>");
                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("黄钻等级: " + userInfoBean.getLevel() + "<br/>");
                    out.println("会员 : " + userInfoBean.isVip() + "<br/>");
                    out.println("黄钻会员: " + userInfoBean.isYellowYearVip() + "<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());
                }
                out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- end </p>");



                out.println("<p> start ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ start <p>");
                PageFans pageFansObj = new PageFans(accessToken, openID);
                PageFansBean pageFansBean = pageFansObj.checkPageFans("97700000");
                if (pageFansBean.getRet() == 0) {
                    out.println("<p>验证您" + (pageFansBean.isFans() ? "是" : "不是")  + "QQ空间97700000官方认证空间的粉丝</p>");
                } else {
                    out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + pageFansBean.getMsg());
                }
                out.println("<p> end ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ end <p>");



                out.println("<p> start -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- start </p>");
                com.qq.connect.api.weibo.UserInfo weiboUserInfo = new com.qq.connect.api.weibo.UserInfo(accessToken, openID);
                com.qq.connect.javabeans.weibo.UserInfoBean weiboUserInfoBean = weiboUserInfo.getUserInfo();
                if (weiboUserInfoBean.getRet() == 0) {
                    //获取用户的微博头像----------------------start
                    out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL30() + "/><br/>");
                    out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL50() + "/><br/>");
                    out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL100() + "/><br/>");
                    //获取用户的微博头像 ---------------------end

                    //获取用户的生日信息 --------------------start
                    out.println("<p>尊敬的用户,你的生日是: " + weiboUserInfoBean.getBirthday().getYear()
                                +  "年" + weiboUserInfoBean.getBirthday().getMonth() + "月" +
                                weiboUserInfoBean.getBirthday().getDay() + "日");
                    //获取用户的生日信息 --------------------end

                    StringBuffer sb = new StringBuffer();
                    sb.append("<p>所在地:" + weiboUserInfoBean.getCountryCode() + "-" + weiboUserInfoBean.getProvinceCode() + "-" + weiboUserInfoBean.getCityCode()
                             + weiboUserInfoBean.getLocation());

                    //获取用户的公司信息---------------------------start
                    ArrayList<Company> companies = weiboUserInfoBean.getCompanies();
                    if (companies.size() > 0) {
                        //有公司信息
                        for (int i=0, j=companies.size(); i<j; i++) {
                            sb.append("<p>曾服役过的公司:公司ID-" + companies.get(i).getID() + " 名称-" +
                            companies.get(i).getCompanyName() + " 部门名称-" + companies.get(i).getDepartmentName() + " 开始工作年-" +
                            companies.get(i).getBeginYear() + " 结束工作年-" + companies.get(i).getEndYear());
                        }
                    } else {
                        //没有公司信息
                    }
                    //获取用户的公司信息---------------------------end

                    out.println(sb.toString());

                } else {
                    out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + weiboUserInfoBean.getMsg());
                }

                out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- end </p>");



            }
        } catch (QQConnectException e) {
        }
    }

官方给的如何测试说法

其他服务器请参照服务器自身部署方法。请将服务器的端口号配置至80端口。

配置host:127.0.0.1 您的回调域名 访问首页 您的回调域名/index.jsp

网站首页 index.jsp 引导用户到 IndexServlet
IndexServlet 用到了 SDK中的 com.qq.connect.oauth.Oauth.getAuthorizeURL(…) 方法来获取应该引导用户跳转的地址

第一次写文章,我看了一遍,表达的不是太清楚,实现qq登入的地址:www.scy917.com如果有什么不懂可以加入qq群讨论讨论:668535367

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值