声明、使用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. 搞机器学习,Python和R哪个更合适?
  2. NPM 3 Beta为Windows用户带来利好消息
  3. Java迭代器(转)(iterator详解以及和for循环的区别)
  4. python实现字典树 时间复杂度_Python实现字典树
  5. 基于springMVC拦截器实现操作日志统计
  6. 【背包】SMRTFUN
  7. mapreduce 算法_MapReduce算法–了解数据联接第二部分
  8. 一个大一新生对于计算机学科的思考
  9. linux什么用户什么任务,linux任务里的1 和2是什么意思
  10. 【POJ】3255 Roadblocks(次短路+spfa)
  11. OpenCV3学习(2.4)——彩色图像读取、灰度图转化、RGB通道分割与合并
  12. 软件测试面试题(含答案)
  13. m4s格式转换mp3_mp4怎么转换成mp3格式?mp4转mp3的傻瓜式方法
  14. 一个软件系统的兼容性测试,在兼容性测试中,如何判断软件的兼容性?
  15. Java培训要多久以后才能工作?
  16. 牛客网力扣算法编程之二十一 | 数组 - 明明的随机数 - Java代码实现
  17. html如何在页面打开时让鼠标光标停留在某个表单文本框,网页制作实用技巧
  18. 运维 —— 1521端口不通
  19. dell管理工具OMSA
  20. python爬虫网易云音乐最热评论并分析_python爬虫入门 实战(三)---爬网易云音乐热门评论...

热门文章

  1. 杨澜语录,好好品悟~
  2. 2021年化工自动化控制仪表考试内容及化工自动化控制仪表最新解析
  3. 编码问题的发展及python2和python3的编码差异
  4. 余额宝业务架构 收藏备用
  5. xp系统无线配置服务器,TP-Link无线路由器上网设置(XP 系统)
  6. Matlab毕设系列--说明
  7. java计算机毕业设计郑州卷烟厂库存管理系统源码+数据库+系统+部署+lw文档
  8. 【安全预警公告】新勒索病毒Bad Rabbit(坏兔子)来袭,请做好防御准备
  9. 视频素材不会找?总结10个可商用无版权素材网站,让你避免视频剪辑侵权!
  10. 研大考研:远程班辅导计划