Nodejs下载地址:https://nodejs.org/zh-cn/
windows下安装不多说,下一步、、、;dos窗口,使用path 查看环境变量【nodejs安装默认会配置环境变量】,使用 node --version 查看安装的版本;
查看npm是否安装成功,命令: npm -v
编写测试代码自行度娘,不多说;
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 {
@Override
protected 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();
}
}
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
@Override
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) {
}
}
}
空间说说的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 {
@Override
protected 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("获取到的值为空?");
}
}
@Override
protected 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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public 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);
}
@Override
public 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;
}
@Override
public 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 block
e.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;
写些东西测试下;
然后就没然后了,哈哈,笑哭;