您的位置 首页 java

Java 实现QQ第三方登录(附赠:完整代码)

老铁,转发+关注+私信 获取完整代码

前言: 很多时候我们都需要如下的第三方登录,用QQ帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户。

下面让我们来实现吧,可以参考官网文档,也可以看我下面的操作说明 qq 第三方登录接入指南

开发者通过以下几个步骤,即可接入QQ互联开放平台: 注册开发者→创建应用→通过审核并获取接口权限

第一步:注册成为开发者

最后等待审核通过… (我是上午申请的,下午才通过审核,这段时间可以先了解下文档,熟悉熟悉哦~)

第二步:创建应用 #/

这里我选的是网站应用

下面是填写时需要注意的!! (温馨小提示:回调地址是之后会使用到的哦~)

等待审核通过之后就可以进行下一步操作了哦~ (温馨小提示:APP ID和APP Key是之后要使用到的哦!)

如下全部审核通过 (快的话 一会儿就通过了哦)

第三步:可下载官网sdk参考

(当然也可跳过这步看我下面的实现)

第四步:配置

①拷贝下载的sdk后解压包中的qqconnectconfig.properties配置文件到自己的项目中,也可以直接拷我下面分享的

app_ID = 100****(请修改此处)
app_KEY = ******(请修改此处)
redirect_URI = ***********(请修改此处)
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 = 
getUserInfoURL = 
accessTokenURL = 
authorizeURL = 
getOpenIDURL = 
addTopicURL = 
addBlogURL = 
addAlbumURL = 
uploadPicURL = 
listAlbumURL = 
addShareURL = 
checkPageFansURL = 
addTURL = 
addPicTURL = 
delTURL = 
getWeiboUserInfoURL = 
getWeiboOtherUserInfoURL = 
getFansListURL = 
getIdolsListURL = 
addIdolURL = 
delIdolURL = 
getTenpayAddrURL = 
getRepostListURL = 
version = 2.0.0.0


 

②将app_ID,app_KEY,redirect_URI三个参数的值改成自己的,也就是在注册开发者用户和创建应用通过后返回的参数值,其中redirect_URI是授权成功后的回调 地址 ,这个是在创建应用的时候配置的。

第五步:代码实现

①引入所需依赖包(maven项目的引入方式):【温馨小提示:下载的sdk资源中也有Sdk4J.jar

<!--QQ第三方登录所需-->
 <dependency>
 <groupId>net.gplatform</groupId>
 <artifactId>Sdk4J</artifactId>
 <version>2.0</version>
 </dependency>

 

②编写登录时跳转事件

 @ request Mapping(value = "/qqLogin")
 public void qqLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
 response.setContentType("text/html;charset=utf-8");
 try {
 response.sendRedirect(new Oauth().getAuthorizeURL(request));//将页面重定向到qq第三方的登录页面
 } catch (QQConnectException e) {
 e.printStackTrace();
 }
 }


 

这个代码可让我们在前台设置跳转路径,点击QQ登录时跳转到如下我们熟悉的页面

③编写回调controller,用户在第三方登录页面登录成功后,我们可以进行登录信息获取,这个时候页面会自动跳转到我们上面配置的redirect_URI的地址

//获取登录者的基础信息
@RequestMapping("/afterlogin.do")
public void QQAfterlogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
 System.out.println("AfterLogin=======================================================");
 response.setContentType("text/html; charset=utf-8"); // 响应编码
 PrintWriter out = response.getWriter();
 
 Enumeration<String> parameterNames = request.getParameterNames();
 while(parameterNames.hasMoreElements()){
 String parameterName = parameterNames.nextElement();//code
 System.out.println(parameterName+":"+request.getParameter(parameterName));//state
 }
 System.out.println("qq_connect_state:"+request.getSession().getAttribute("qq_connect_state"));
 
 try {
 // 获取AccessToken(AccessToken用于获取OppendID)
 AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
 
 System.out.println("accessTokenObj:"+accessTokenObj);
 // 用于接收AccessToken
 String accessToken = null,
 openID = null;
 long tokenExpireIn = 0L; // AccessToken有效时长
 
 if (accessTokenObj.getAccessToken().equals("")) {
 // 我们的网站被CSRF攻击了或者用户取消了授权
 // 做一些数据统计工作
 System.out.print("没有获取到响应参数");
 } else {
 accessToken = accessTokenObj.getAccessToken(); // 获取AccessToken
 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);
 // 通过对象获取[OpendId](OpendID用于获取QQ登录用户的信息)
 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>");
 // 通过OpenID获取QQ用户登录信息对象(Oppen_ID代表着QQ用户的唯一标识)
 UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
 // 获取用户信息对象(只获取nickename与Gender)
 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) {
 }
}


 

剩下的就是一些API的使用了,可以参考官网文档

温馨小提示:

我QQ互联上设置的回调域是127.0.0.1:8080,但我本地刚开始使用的localhost:8080访问导致最后2个地址的session值不一致,就没有授权成功跳转到回调地址,因此我们访问的地址必须要有回调域设置的地址是同一个服务器地址访问的哦~~

文章来源:智云一二三科技

文章标题:Java 实现QQ第三方登录(附赠:完整代码)

文章地址:https://www.zhihuclub.com/180416.shtml

关于作者: 智云科技

热门文章

网站地图