网站接入QQ互联(JAVA版)

简介:


QQ互联是腾讯旗下的开放平台,通过QQ互联,网站主和开发者可以申请接入QQ登录、用户可以使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间朋友网,通过获取API授权,网站主还可以将用户操作同步到QQ空间和朋友网。QQ互联提供的API,我们最常用的就是get_user_info(获取登陆用户的昵称、头像、性别),在获取到用户的基本信息后,我们可以将信息保存起来,作为本网站用户,或者与本网站用户绑定!



接入流程

1.申请appid和appkey

接入QQ互联首先需要到QQ互联官网进行开发者认证,开发者认证通过后即可创建应用,(创建应用需要需要网站ICP备案号,回调地址)申请后会需要1-3个工作日的审核时间。


2.放置QQ登录按钮,跳转到QQ登陆页


编写一个Controller连接到跳转到QQ登录页面的方法中,这边用的时QQ互联提供的SDK,最后重定向到QQ登录页:如下

/**
* QQ登录跳转
* @throws QQConnectException
* @throws IOException
*/
@RequestMapping(value="QQUserLogin")
public void qqLogin(HttpServletRequest req,HttpServletResponse resp,HttpSession session) throws IOException, QQConnectException{
try {
String url = new Oauth().getAuthorizeURL(req);
resp.sendRedirect(url);
session.setAttribute("beforLoginUrl",req.getHeader("Referer"));
} catch (Exception e) {
new QQConnectException("跳转到QQ登录页面异常");
}
}


3.QQ登录页:



然后点击登录页面中的QQ头像将重定向到申请时填写回调地址中,返回Authorization_Code和state ,state用于第三方应用防止CSRF攻击,成功授权后会原样返回


4.编写回调方法(QQCallBack)

该方法中回获取到QQ返回的Authorization_Code和state ,先判断sesion中的state和返回的state是否一致,一致即可执行下面操作,跟据Code获取accessToken ,然后跟据token获取用户open_id,然后根据open_id获取用户信息,先根据open_id到数据库中查询是否已经存在该用户,不存进行注册,存在则更新用户信息,然后将用户存入session,将请求原路返回。代码如下:

/**
* QQ登录回调
* @param req
* @param resp
* @param session
* @return
* @throws QQConnectException
*/
@RequestMapping(value="QQCallBack")
public String qqcallback(HttpServletRequest req,HttpServletResponse resp,HttpSession session) throws QQConnectException{
resp.setContentType("text/html;charset=utf-8");
int bindTag = 0;
try {
String code = req.getParameter("code");
String state = req.getParameter("state");
String session_state= (String) session.getAttribute("qq_connect_state");
if(StringUtils.isNotBlank(session_state) && session_state.equals(state)){
String accessToken = QQLoginUT.getAccessToken(code);
session.setAttribute("accessToken", accessToken);
if (StringUtils.isBlank(accessToken)) {
log.error("没有获取到响应参数");
}else{
OpenID openIDObj = new OpenID(accessToken);
String openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if(userInfoBean != null && userInfoBean.getRet() == 0 && StringUtils.isBlank(userInfoBean.getMsg())){
//获取用户成功
User user = (User) commonService.getObject("from User where open_id = ? ", new Object[]{openID});
if(null != user){
//判断用户邮箱是为为空,主要是针对最早期的用户,有邮箱未完善的
//已经注册过,更新用户信息,直接将信息存入session 然后跳转
user.setUser_name(userInfoBean.getNickname());
user.setUser_pic(userInfoBean.getAvatar().getAvatarURL100());
user.setGender(userInfoBean.getGender());
user.setFirst_ip(TimeHelper.getCurrentTime());
if(commonService.updateObject(user) < 1){
throw new Exception("更新用户信息错误");
}
if(StringUtils.isNotBlank(user.getEmail())){
bindTag = 1;//邮箱不为空,正常跳转到首页
}else{
bindTag = 2;//邮箱为空跳转到绑定页面
}
}else{
//该用户第一次登录 先注册
user = new User();
user.setOpen_id(openID);
user.setUser_name(userInfoBean.getNickname());
user.setRealm((Realm)commonService.getObject(Realm.class, "b18caeea1ec378e689263cee8d8c8123"));
user.setUser_pic(userInfoBean.getAvatar().getAvatarURL100());
user.setUser_pwd(MD5UT.create("123456"));
user.setGender(userInfoBean.getGender());
user.setUser_account("welphen_"+UuidUT.buildRandom(5));
user.setUser_status(1);
user.setFirst_ip(WebUT.ip());
user.setFirst_time(TimeHelper.getCurrentTime());
if(StringUtils.isBlank(commonService.addObject(user))){
throw new Exception("注册用户信息错误!");
}
bindTag = 2 ;
}
//存储用户信息
session.setAttribute(Constants.SESSION_HOME_USER, user);
session.setAttribute("bindTag", bindTag);
}
}
}else{
log.info("请求非法");
}
}catch (Exception e) {
e.printStackTrace();
}
return "redirect:"+session.getAttribute("beforLoginUrl")+"";
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值