Java 实现QQ第三方登录

news/2024/11/20 4:22:35/

Java 实现QQ第三方登录

 

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

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

第一步:注册成为开发者  http://open.qq.com/regv2/

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

如下图审核通过,就可以进行下一步了哦

第二步:创建应用 https://connect.qq.com/manage.html#/

这里我选的是网站应用

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

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

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

注意:申请appid时,登录的QQ号码将与申请到的appid绑定,后续维护均需要使用该号码。
注意:对appid和appkey信息进行保密,不要随意泄漏。

注意保证连接畅通
接入QQ登录时,网站需要不停的和Qzone进行交互,发送请求和接受响应。
1. 对于PC网站:
请在你的服务器上ping graph.qq.com ,保证连接畅通。
2.移动应用无需此步骤

第三步:可下载官网sdk参考  http://wiki.open.qq.com/wiki/website/SDK%E4%B8%8B%E8%BD%BD

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

第四步:配置

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

  1. app_ID = 100****(请修改此处)
  2. app_KEY = ******(请修改此处)
  3. redirect_URI = ***********(请修改此处)
  4. 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
  5. baseURL = https://graph.qq.com/
  6. getUserInfoURL = https://graph.qq.com/user/get_user_info
  7. accessTokenURL = https://graph.qq.com/oauth2.0/token
  8. authorizeURL = https://graph.qq.com/oauth2.0/authorize
  9. getOpenIDURL = https://graph.qq.com/oauth2.0/me
  10. addTopicURL = https://graph.qq.com/shuoshuo/add_topic
  11. addBlogURL = https://graph.qq.com/blog/add_one_blog
  12. addAlbumURL = https://graph.qq.com/photo/add_album
  13. uploadPicURL = https://graph.qq.com/photo/upload_pic
  14. listAlbumURL = https://graph.qq.com/photo/list_album
  15. addShareURL = https://graph.qq.com/share/add_share
  16. checkPageFansURL = https://graph.qq.com/user/check_page_fans
  17. addTURL = https://graph.qq.com/t/add_t
  18. addPicTURL = https://graph.qq.com/t/add_pic_t
  19. delTURL = https://graph.qq.com/t/del_t
  20. getWeiboUserInfoURL = https://graph.qq.com/user/get_info
  21. getWeiboOtherUserInfoURL = https://graph.qq.com/user/get_other_info
  22. getFansListURL = https://graph.qq.com/relation/get_fanslist
  23. getIdolsListURL = https://graph.qq.com/relation/get_idollist
  24. addIdolURL = https://graph.qq.com/relation/add_idol
  25. delIdolURL = https://graph.qq.com/relation/del_idol
  26. getTenpayAddrURL = https://graph.qq.com/cft_info/get_tenpay_addr
  27. getRepostListURL = https://graph.qq.com/t/get_repost_list
  28. version = 2.0.0.0

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

第五步:代码实现

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

  1. <!--QQ第三方登录所需-->
  2. <dependency>
  3. <groupId>net.gplatform</groupId>
  4. <artifactId>Sdk4J</artifactId>
  5. <version>2.0</version>
  6. </dependency>

②编写登录时跳转事件  

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

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

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

  1. //获取登录者的基础信息
  2. @RequestMapping("/afterlogin.do")
  3. public void QQAfterlogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. System.out.println("AfterLogin=======================================================");
  5. response.setContentType("text/html; charset=utf-8"); // 响应编码
  6. PrintWriter out = response.getWriter();
  7. Enumeration<String> parameterNames = request.getParameterNames();
  8. while(parameterNames.hasMoreElements()){
  9. String parameterName = parameterNames.nextElement();//code
  10. System.out.println(parameterName+":"+request.getParameter(parameterName));//state
  11. }
  12. System.out.println("qq_connect_state:"+request.getSession().getAttribute("qq_connect_state"));
  13. try {
  14. // 获取AccessToken(AccessToken用于获取OppendID)
  15. AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
  16. System.out.println("accessTokenObj:"+accessTokenObj);
  17. // 用于接收AccessToken
  18. String accessToken = null,
  19. openID = null;
  20. long tokenExpireIn = 0L; // AccessToken有效时长
  21. if (accessTokenObj.getAccessToken().equals("")) {
  22. // 我们的网站被CSRF攻击了或者用户取消了授权
  23. // 做一些数据统计工作
  24. System.out.print("没有获取到响应参数");
  25. } else {
  26. accessToken = accessTokenObj.getAccessToken(); // 获取AccessToken
  27. tokenExpireIn = accessTokenObj.getExpireIn();
  28. request.getSession().setAttribute("demo_access_token", accessToken);
  29. request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
  30. // 利用获取到的accessToken 去获取当前用的openid -------- start
  31. OpenID openIDObj = new OpenID(accessToken);
  32. // 通过对象获取[OpendId](OpendID用于获取QQ登录用户的信息)
  33. openID = openIDObj.getUserOpenID();
  34. out.println("欢迎你,代号为 " + openID + " 的用户!");
  35. request.getSession().setAttribute("demo_openid", openID);
  36. out.println("<a href=" + "/shuoshuoDemo.html" + " target=\"_blank\">去看看发表说说的demo吧</a>");
  37. // 利用获取到的accessToken 去获取当前用户的openid --------- end
  38. out.println("<p> start -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- start </p>");
  39. // 通过OpenID获取QQ用户登录信息对象(Oppen_ID代表着QQ用户的唯一标识)
  40. UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
  41. // 获取用户信息对象(只获取nickename与Gender)
  42. UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
  43. out.println("<br/>");
  44. if (userInfoBean.getRet() == 0) {
  45. out.println(userInfoBean.getNickname() + "<br/>");
  46. out.println(userInfoBean.getGender() + "<br/>");
  47. out.println("黄钻等级: " + userInfoBean.getLevel() + "<br/>");
  48. out.println("会员 : " + userInfoBean.isVip() + "<br/>");
  49. out.println("黄钻会员: " + userInfoBean.isYellowYearVip() + "<br/>");
  50. out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL30() + "/><br/>");
  51. out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL50() + "/><br/>");
  52. out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL100() + "/><br/>");
  53. } else {
  54. out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
  55. }
  56. out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- end </p>");
  57. out.println("<p> start ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ start <p>");
  58. PageFans pageFansObj = new PageFans(accessToken, openID);
  59. PageFansBean pageFansBean = pageFansObj.checkPageFans("97700000");
  60. if (pageFansBean.getRet() == 0) {
  61. out.println("<p>验证您" + (pageFansBean.isFans() ? "是" : "不是") + "QQ空间97700000官方认证空间的粉丝</p>");
  62. } else {
  63. out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + pageFansBean.getMsg());
  64. }
  65. out.println("<p> end ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ end <p>");
  66. out.println("<p> start -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- start </p>");
  67. com.qq.connect.api.weibo.UserInfo weiboUserInfo = new com.qq.connect.api.weibo.UserInfo(accessToken, openID);
  68. com.qq.connect.javabeans.weibo.UserInfoBean weiboUserInfoBean = weiboUserInfo.getUserInfo();
  69. if (weiboUserInfoBean.getRet() == 0) {
  70. //获取用户的微博头像----------------------start
  71. out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL30() + "/><br/>");
  72. out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL50() + "/><br/>");
  73. out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL100() + "/><br/>");
  74. //获取用户的微博头像 ---------------------end
  75. //获取用户的生日信息 --------------------start
  76. out.println("<p>尊敬的用户,你的生日是: " + weiboUserInfoBean.getBirthday().getYear()
  77. + "年" + weiboUserInfoBean.getBirthday().getMonth() + "月" +
  78. weiboUserInfoBean.getBirthday().getDay() + "日");
  79. //获取用户的生日信息 --------------------end
  80. StringBuffer sb = new StringBuffer();
  81. sb.append("<p>所在地:" + weiboUserInfoBean.getCountryCode() + "-" + weiboUserInfoBean.getProvinceCode() + "-" + weiboUserInfoBean.getCityCode()
  82. + weiboUserInfoBean.getLocation());
  83. //获取用户的公司信息---------------------------start
  84. ArrayList<Company> companies = weiboUserInfoBean.getCompanies();
  85. if (companies.size() > 0) {
  86. //有公司信息
  87. for (int i=0, j=companies.size(); i<j; i++) {
  88. sb.append("<p>曾服役过的公司:公司ID-" + companies.get(i).getID() + " 名称-" +
  89. companies.get(i).getCompanyName() + " 部门名称-" + companies.get(i).getDepartmentName() + " 开始工作年-" +
  90. companies.get(i).getBeginYear() + " 结束工作年-" + companies.get(i).getEndYear());
  91. }
  92. } else {
  93. //没有公司信息
  94. }
  95. //获取用户的公司信息---------------------------end
  96. out.println(sb.toString());
  97. } else {
  98. out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + weiboUserInfoBean.getMsg());
  99. }
  100. out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- end </p>");
  101. }
  102. } catch (QQConnectException e) {
  103. }
  104. }

剩下的就是一些API的使用了,可以参考官网文档http://wiki.connect.qq.com/%E4%BD%BF%E7%94%A8authorization_code%E8%8E%B7%E5%8F%96access_token

温馨小提示:

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

最后附上: Java实现QQ第三方登录源码


http://www.ppmy.cn/news/528651.html

相关文章

web实现QQ第三方登录(java版)

简介&#xff1a; 主要逻辑在java实现&#xff0c;h5只有一个a标签调用接口。 后台分两个接口&#xff1a; 接口1&#xff1a;登录前缀接口&#xff0c;h5负责调用唤醒QQ授权。 接口2&#xff1a;需要在腾讯开放平台配置回调地址的接口&#xff0c;就是授权成功后回调。 j…

张小龙《微信背后的产品观》演讲文字版

简单就是美——从苹果单按钮到微信摇一摇 今天很感谢大家从这么远的地方跑到广州来&#xff0c;对于产品的分享&#xff0c;我个人是挺有兴趣的&#xff0c;我觉得能够探讨一下怎么做产品&#xff0c;本身也是挺有意思的一件事情。 我们现在用的很多是苹果的东西&#xff0c;…

Spring Boot整合Security系列步骤及问题排查(十一)—— 集成QQ登录

工具类准备&#xff1a; Repository&#xff1b; Connection&#xff1b; ConnectionFactory&#xff08;ServiceProvider、ApiAdapter&#xff09;&#xff1b; ServiceProvider&#xff08;OAuth2Operations、Api&#xff09;&#xff1b; Api&#xff1a; /*** QQ接口** a…

支付宝不用网络,也能正常支付,太神奇了吧!

文末留言送书5本 现在生活已经离不开微信/支付宝电子支付&#xff0c;平常出去吃饭、购物只要带个手机&#xff0c;就可以解决一切&#xff0c;以致于现在已经好久没摸过真????了。 有一次出去吃饭&#xff0c;排着队付钱&#xff0c;等着过程非常无聊&#xff0c;准备拔出…

做wish用多大的虚拟服务器,Wish卖家看过来,这几个平台“潜规则”你必须知道!...

相比与其他平台的条条框框&#xff0c;Wish的低门槛可谓十分亲民&#xff0c;吸引了不少其他平台的卖家入驻&#xff0c;但不同于亚马逊、eBay的是&#xff0c;Wish平台有一套专属自己的玩法和规则&#xff0c;如果用其他平台的思维去运营Wish&#xff0c;是万万不行的&#xf…

从qq for android登录,GitHub - BarefootBKK/QQLoginForAndroid: 安卓第三方登录

安卓第三方QQ登录-项目说明 本项目集成封装了QQ第三方登录&#xff0c;大大减少了开发者编写【调用QQ登录】功能的代码量 引入本项目 Step 1. 添加依赖 build.gradle (project) allprojects { repositories { // ... maven { url https://jitpack.io } } } build.gradle (app) …

做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台

Wish六月政策更新总结来了&#xff0c;跟紧平台步伐很重要&#xff01; 1. 瑞典路向订单之可接受的物流服务商更新 非Wish Express订单必须使用以下配送商&#xff1a;Wishpost(WishPost-Chinapost, WishPost-EUB)** BPostInternational OneWorldExpress** SFInternational** …

springboot网站应用使用第三方qq登录

使用第三方qq登录需要在QQ互联官网https://connect.qq.com/中申请成功才可以使用。 1.登录成功后进入个人设置中心设置个人信息 2.选择公司或个人接入&#xff0c;这里我选择个人接入 3.注册审核通过以后&#xff0c;点击应用管理&#xff0c;右侧会显示审核已通过&#xff0c…