声明、使用JDK9、idea2018.02 、maven3.5.4、tomcat9 

maven的web工程QQ第三方登录接口引入,听起来简单,做完以后也很简单,这里使用 java SDK ;

写的文字比较多,查了好多文章,写的模模糊糊的,只有自己写清楚了供大家参考,其实很简单的一个调用;

maven的 web 开发qq接口引入,文档地址:http://wiki.connect.qq.com/

该处测试使用servlet注解方式,官方demo使用配置web.xml方式【重中之重一点需要更改Tomcat中context.xml配置】

<!-- 配置qq登录的文档库   --><Context docBase="web" path="/" privileged="true" antiResourceLocking="false"></Context>

(1)申请审核5天左右,获得对应的  appid与appkey  ,创建应用,填写回调接口 (下面有图);

(2) js SDK下载   http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD;

java SDK下载    http://wiki.open.qq.com/wiki/website/SDK%E4%B8%8B%E8%BD%BD

(3)log下载  图标下载;

(4)调用登录  和回调 函数,搭建 demo servlet 和依赖;


2018/10/16  审核通过;


在基本信息中填写回调接口,由于仅作为测试使用,所以填写的回调接口为 http://localhost:8080/afterLoginRedirectServlet

和回调的 servlet的 urlPatterns=" /afterLoginRedirectServlet "  要保持一致【重点】;

如下图:

到此为止所需参数获取完毕,配置文件如下;

app_ID = 你的appid
app_KEY = 你的key,下面的回调url根据个人情况更改,scope权限根据需求改【需要有这权限才能配置】
redirect_URI = http://localhost:8080/afterLoginRedirectServlet
scope = get_user_info
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

声明,使用的maven工程,Tomcat9.0.10 ,JDK9进行测试;

开始调用接口测试 ,可以改写成基于baseSeverlet来测试,为了方便直接 coding:

逻辑说明 ,点击按钮,调用 IndexServlet 进行调用登录qq的功能;点击登录 qq ,会重定向调用回调  AfterLoginRedirectServlet ,用于获取用户信息;这里用于测试仅仅开通了  scope = get_user_info  的权限;

配置说明,配置文件qqconnectconfig.properties 中需要修改 4 个参数①  ,在上面配置文件中已作出说明;

servlet代码如下,直接copy  就能使用当然环境要保持一致:

请求登录的 servlet ;

package com.baidu.web.servlet;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;import com.qq.connect.QQConnectException;
import com.qq.connect.oauth.Oauth;/*** Date: 12-12-4* Time: 上午10:28*/
@WebServlet(urlPatterns = "/indexServlet")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=utf-8");try {response.sendRedirect(new Oauth().getAuthorizeURL(request));} catch (QQConnectException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {doGet(request,  response);}
}

回调的 servlet  ;

package com.baidu.web.servlet;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.annotation.WebServlet;
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*/
@WebServlet(urlPatterns = "/afterLoginRedirectServlet")
public class AfterLoginRedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {doPost(request, response);}@Overrideprotected 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 -------- startOpenID 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 --------- endout.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) {//获取用户的微博头像----------------------startout.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL30() + "/><br/>");out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL50() + "/><br/>");out.println("<image src=" + weiboUserInfoBean.getAvatar().getAvatarURL100() + "/><br/>");//获取用户的微博头像 ---------------------end//获取用户的生日信息 --------------------startout.println("<p>尊敬的用户,你的生日是: " + weiboUserInfoBean.getBirthday().getYear()+ "年" + weiboUserInfoBean.getBirthday().getMonth() + "月" +weiboUserInfoBean.getBirthday().getDay() + "日");//获取用户的生日信息 --------------------endStringBuffer sb = new StringBuffer();sb.append("<p>所在地:" + weiboUserInfoBean.getCountryCode() + "-" + weiboUserInfoBean.getProvinceCode() + "-" + weiboUserInfoBean.getCityCode()+ weiboUserInfoBean.getLocation());//获取用户的公司信息---------------------------startArrayList<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 {//没有公司信息}//获取用户的公司信息---------------------------endout.println(sb.toString());} else {out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + weiboUserInfoBean.getMsg());}out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- end </p>");}} catch (QQConnectException e) {}}
}

空间说说的servlet;

package com.baidu.web.servlet;import com.qq.connect.QQConnectException;
import com.qq.connect.api.qzone.Topic;
import com.qq.connect.javabeans.GeneralResultBean;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;/*** Date: 12-12-5* Time: 下午3:19*/
@WebServlet(urlPatterns = "/shuoShuoServlet")
public class ShuoShuoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");String con = request.getParameter("con");HttpSession session = request.getSession();String accessToken = (String)session.getAttribute("demo_access_token");String openID = (String)session.getAttribute("demo_openid");System.out.println(accessToken);System.out.println(openID);//请开发者自行校验获取的con值是否有效if (con != "") {Topic topic = new Topic(accessToken, openID);try {GeneralResultBean grb = topic.addTopic(con);if (grb.getRet() == 0) {response.getWriter().println("<a href=\"http://www.qzone.com\" target=\"_blank\">您的说说已发表成功,请登录Qzone查看</a>");} else {response.getWriter().println("很遗憾的通知您,发表说说失败!原因: " + grb.getMsg());}} catch (QQConnectException e) {System.out.println("抛异常了?");}} else {System.out.println("获取到的值为空?");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {doGet(request, response);}
}

再多说下,本环境使用了filter过滤器,防止html乱码;

package com.baidu.web.filter;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/*** 统一编码* @author Administrator**/
@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {//1.强转HttpServletRequest request=(HttpServletRequest) req;HttpServletResponse response=(HttpServletResponse) resp;//System.out.println("@@@@@@@@@@@@@@@@@@");//2.放行chain.doFilter(new MyRequest(request), response);}@Overridepublic void destroy() {// TODO Auto-generated method stub}}//之前的MyRequest增强了request.getParameter("name");方法
//增强了所有的获取参数的方法request.getParameterValues("name");
//增强了所有的获取参数的方法request.getParameterMap();
class MyRequest extends HttpServletRequestWrapper{private HttpServletRequest request;private boolean flag=true;public MyRequest(HttpServletRequest request) {super(request);this.request=request;}@Overridepublic String getParameter(String name) {if(name==null || name.trim().length()==0){return null;}String[] values = getParameterValues(name);if(values==null || values.length==0){return null;}return values[0];}@Override/*** hobby=[eat,drink]*/public String[] getParameterValues(String name) {if(name==null || name.trim().length()==0){return null;}Map<String, String[]> map = getParameterMap();if(map==null || map.size()==0){return null;}return map.get(name);}@Override/*** map{ username=[tom],password=[123],hobby=[eat,drink]}*/public Map<String,String[]> getParameterMap() {/*** 首先判断请求方式* 若为post  request.setchar...(utf-8)* 若为get 将map中的值遍历编码就可以了*/String method = request.getMethod();if("post".equalsIgnoreCase(method)){try {request.setCharacterEncoding("utf-8");return request.getParameterMap();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else if("get".equalsIgnoreCase(method)){Map<String,String[]> map = request.getParameterMap();if(flag){for (String key:map.keySet()) {String[] arr = map.get(key);//继续遍历数组for(int i=0;i<arr.length;i++){//编码try {arr[i]=new String(arr[i].getBytes("iso-8859-1"),"utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}flag=false;}//需要遍历map 修改value的每一个数据的编码return map;}return super.getParameterMap();}}

进行测试,启动 Tomcat: 

 点击登录按钮:

点击QQ进行登录,有点意思马上右下角开始提醒登录了 localhost; 

登陆后的状态; 

点击查看说说demo;

写些东西测试下; 

然后就没然后了,哈哈,笑哭;

maven的web工程QQ第三方登录HTML、相关推荐

  1. web实现QQ第三方登录

    web实现QQ第三方登录 开放平台-web实现QQ第三方登录 应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1  注册成为QQ互联平台开发者, http://connect.qq.c ...

  2. Java Web 实现 QQ第三方登录

    java web 实现QQ第三方登录功能 首先点击该链接进入腾讯开放平台 ,注册成为开发者 2.注册成功后到这个页面 3.创建web应用 4.填写基本信息(以前的这里会让你填写回调地址 ,现在改了) ...

  3. web接入QQ第三方登录

    原文地址:https://blog.csdn.net/cwfjimogudan/article/details/54135957 这是第三方登录的第二篇,关于web接入微博第三方登录可以参考我之前的博 ...

  4. web实现QQ第三方登录 开放平台-web实现QQ第三方登录

    应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1  注册成为QQ互联平台开发者,http://connect.qq.com/ 2  准备一个可访问的域名,如dev.foo.com 3 ...

  5. springmvc web网站QQ第三方登录实现

    首先   申请需要用到的 app_ID 和 app_KEY             具体步骤看这个 https://connect.qq.com/index.html 再申请的时候会有一个框让你输入 ...

  6. 一步一步实现iOS QQ第三方登录

    前言 最近在公司应用中集成QQ登录的时候遇到一些波折(坑点),觉得还是有必要记录一下. 一.集成SDK 1.集成官方Framework 首先下载官网SDK iOS_SDK下载,目前来说最新的包是V3. ...

  7. java实现支付宝第三方登录_Java 实现QQ第三方登录(附赠:完整代码)

    老铁,转发+关注+私信 获取完整代码 前言:很多时候我们都需要如下的第三方登录,用QQ帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户. 下面让我们来实现吧,可以参考官网文档,也可以看我下 ...

  8. QQ第三方登录的详细教程

    这次说一下我自己第一次使用QQ第三方登录的过程 1 .我们开始需要在开发者网站上注册,http://open.qq.com/ 进入这个网站后点应用接入中的应用接入(因为那个按不动),开始注册,这个注册 ...

  9. web接入微博第三方登录

    微博第三方登录 最近刚好在学习第三方登录,这里先做一下微博第三方登录的记录,因为qq第三方登录必须要完成网站备案后才能进行,后面再进行补充. 大致可以分成下面几个步骤 下面根据我自己的实现过程做一下总 ...

最新文章

  1. Java多个jdk安装切换
  2. velodyne显示点云中grid的单位_led显示屏怎么选择点间距
  3. dos下编译运行java工程,并解决外部jar包依赖
  4. SQL SERVER 2005无法远程连接的问题
  5. 日照华软游戏开发价格_开发区将是未来刚需人群的首选!
  6. android studio1.5 for mac,适用于Mac的Android Studio 1.5.x随机崩溃
  7. mysql中文乱码解决_Stata 中文乱码顽疾解决方法
  8. android 获取是否连接wifi热点,android - 如何知道您是否已连接到Wifi热点/ Wifi / Wifi Direct - 堆栈内存溢出...
  9. Zero-copy Receive for vhost
  10. SpringBoot项目从Git拉取代码并完成编译打包启动的sh自动脚本
  11. MVC---------ViewBag
  12. 中文字符集编码unicode,gb2312,cp936,GBK,GB18030介绍
  13. 【转载】88E6390端口Link问题(PHY一直link up)BUG解决
  14. c语言字符串拼接变量,C语言实现字符串拼接
  15. Excel中28个基本图
  16. Android camera2 同时打开两颗物理摄像头
  17. 176. 第二高的薪水(SQL中的ifnull函数和limt1,1的使用)
  18. ubuntu桌面便签_在Ubuntu 上有什么必装的实用软件?
  19. 如何获取微信公众平台图文消息的永久链接
  20. 九龙证券|看好2-4月份汽车月度销量增速的逐月改善

热门文章

  1. 壁纸|舔狗壁纸,一些好看的壁纸
  2. EXTJS 中 anchor 的用法
  3. 关于_findnext 报错
  4. 百度营销:百度扩量投放技巧
  5. 100种思维模型之逆向思维模型-46
  6. 交换机或路由器的配置模式
  7. Chrome 终于发布了针对Windows 64bit系统的版本
  8. word 常规模板设置
  9. 【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档
  10. 兔斯基的每句话都够你品一阵的了!