想实现qq登入,当然是要去qq互联注册账号,https://connect.qq.com/index.html
按照提示来,是公司的填写公司,个人填写个人,之后就是等待审核通过。
通过之后在《应用管理》,创建应用 ,因为我做的是网站选择了网站应用
这里的回调地址要强调一下,可以写多个回调地址,qq互联会根据自己定义的回调地址,返回那个地址,现在说你可能会比较懵,别着急慢慢往下就会明白,使用分号 ;隔开,我之前没仔细看用的是逗号,用了两天才走出这个坑,回调域名是不能写http://localhost:8080/index.html,
,我这个域名是已经备过案的,qq是提供了测试方法,但是我不会…
创建成功会分配给我们appid 和appkey 这个很重要,之后就是看文档,我说肯定,没有看官方文档表达的清楚,官方文档
看两遍差不多就对qq登入了解差不多了,api就比较坑了,qq互联上没有java的,不用api自己也可以做,但是有现成的干嘛不用。。嘻嘻。java的api要去腾讯开放平台下载。
解压之后打开下面这个小项目,剩下的就是复制粘贴,,
项目中有qqconnectconfig.properties文件上图我将它复制到src的根目录下,还要修改文件里面的参数
要修改的就三处地方 这三个就不解释了你们都懂,使用api肯定要引入依赖了
net.gplatform
Sdk4J
2.0
下面这是接收请求的跳转重定向的
@Autowired
private HttpServletResponse response;
@Autowired
private HttpServletRequest request;
/**
* qq跳转
* @throws QQConnectException
* @throws IOException
*/
@RequestMapping("/QQlong")
private ResponseResuilt> SetQQLong(HttpSession session)throws ExistingExcetion {
if(session.getAttribute("uid")==null) {
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
} catch (IOException | QQConnectException e) {
throw new ExistingExcetion("出现错误");
}
}else {
return new ResponseResuilt<>(3,"已登入");
}
return null;
}
然后会重定向到我设置的回调页面吗,前端我用的是ajax
$(function(){
var search = location.search;
var data = search.substring(search.indexOf("?")+1,search.length);
if(data.length>50){
$.ajax({
"url":"../afterlogin",
"data":data,
"Type": "POST",
"dataType": "json",
"success":function(json){
if(json.number == 200){
}else{
yichangtishi(json.message,1)
}
}
})
}else{
return;
}
})
后端接收
/**
* qq登入
* @param session
* @return
* @throws NullShuJuException
*/
@RequestMapping("/afterlogin")
private ResponseResuilt> GetQQ(HttpSession session) throws NullShuJuException{
service.setQQ(request, session);
return new ResponseResuilt(success);
}
下面的就和下载的demo一样了,只不过我又加了些自己的逻辑
/**
* qq登入获取信息
* @throws
*/
@Override
public TheUser_l setQQ(HttpServletRequest request, HttpSession session)throws NullShuJuException{
// TODO Auto-generated method stub
TheUser_l touxiang = new TheUser_l();
try {
//创建对象
AccessToken accessTokenobj = (new Oauth()).getAccessTokenByRequest(request);
//用户信息和唯一ID
String accessToken = null, openID = null;
long tokenExpireIn = 0L;
//code=E4171093538675B89139C5ACB1FD6955&state=e8457f98419be3a042b890396d46cc51
if(accessTokenobj.getAccessToken().equals("")) {
throw new NullShuJuException("没有获取到数据");
}else{
accessToken = accessTokenobj.getAccessToken();
tokenExpireIn = accessTokenobj.getExpireIn();
// 利用获取到的accessToken 去获取当前用的openid -------- start
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if(userInfoBean.getRet() == 0) {
//这里我就省略了
}else {
//这里我就省略了
}
}else {
throw new NullShuJuException("很抱歉,我们没能正确获取到您的信息,原因是"+userInfoBean.getMsg());
}
}
} catch (QQConnectException e) {
e.printStackTrace();
}
return touxiang;
}
==========下面是官方demo的代码
package com.qq.connect.demo;
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.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
*/
public class AfterLoginRedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
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("去看看发表说说的demo吧");
// 利用获取到的accessToken 去获取当前用户的openid --------- end
out.println(" start -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- start
");
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
out.println("
");
if (userInfoBean.getRet() == 0) {
out.println(userInfoBean.getNickname() + "
");
out.println(userInfoBean.getGender() + "
");
out.println("黄钻等级: " + userInfoBean.getLevel() + "
");
out.println("会员 : " + userInfoBean.isVip() + "
");
out.println("黄钻会员: " + userInfoBean.isYellowYearVip() + "
");
out.println("
");
out.println("
");
out.println("
");
} else {
out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
out.println(" end -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- end
");
out.println(" start ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ start
");
PageFans pageFansObj = new PageFans(accessToken, openID);
PageFansBean pageFansBean = pageFansObj.checkPageFans("97700000");
if (pageFansBean.getRet() == 0) {
out.println("
验证您" + (pageFansBean.isFans() ? "是" : "不是") + "QQ空间97700000官方认证空间的粉丝
");
} else {
out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + pageFansBean.getMsg());
}
out.println(" end ----------------------------------- 验证当前用户是否为认证空间的粉丝------------------------------------------------ end
");
out.println("
start -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- start
");
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("
");
out.println("
");
out.println("
");
//获取用户的微博头像 ---------------------end
//获取用户的生日信息 --------------------start
out.println("尊敬的用户,你的生日是: " + weiboUserInfoBean.getBirthday().getYear()
+ "年" + weiboUserInfoBean.getBirthday().getMonth() + "月" +
weiboUserInfoBean.getBirthday().getDay() + "日");
//获取用户的生日信息 --------------------end
StringBuffer sb = new StringBuffer();
sb.append("
所在地:" + weiboUserInfoBean.getCountryCode() + "-" + weiboUserInfoBean.getProvinceCode() + "-" + weiboUserInfoBean.getCityCode()
+ weiboUserInfoBean.getLocation());
//获取用户的公司信息---------------------------start
ArrayList companies = weiboUserInfoBean.getCompanies();
if (companies.size() > 0) {
//有公司信息
for (int i=0, j=companies.size(); i曾服役过的公司:公司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(" end -----------------------------------利用获取到的accessToken,openid 去获取用户在微博的昵称等信息 ---------------------------- end
");
}
} catch (QQConnectException e) {
}
}
官方给的如何测试说法
其他服务器请参照服务器自身部署方法。请将服务器的端口号配置至80端口。
配置host:127.0.0.1 您的回调域名 访问首页 您的回调域名/index.jsp
网站首页 index.jsp 引导用户到 IndexServlet
IndexServlet 用到了 SDK中的 com.qq.connect.oauth.Oauth.getAuthorizeURL(…) 方法来获取应该引导用户跳转的地址
第一次写文章,我看了一遍,表达的不是太清楚,实现qq登入的地址:www.scy917.com如果有什么不懂可以加入qq群讨论讨论:668535367