关于QQ联合登录官方文档提供了很方便的JS SDK ,但是在手机WAP网站使用JS SDK时,大多数浏览器调起QQ登录后不能正常回调,只有极个别的浏览器能正常使用,比如我试了手机谷歌浏览器可以使用,但是譬如qq浏览器,Safari浏览器都不能正常回调。
于是考虑到时浏览器兼容性问题,所以放弃JS SDK ,开始使用 JAVA SDK。一切OK。
首先,从http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD 下载JAVA SDK,解压后,我们需要用到的是qqconnectconfig.properties。
然后,在项目中引入依赖
<dependency>
<groupId>net.gplatform</groupId>
<artifactId>Sdk4J</artifactId>
<version>2.0</version>
</dependency>
接着,把qqconnectconfig.properties放到项目resource下,修改里面内容,
只修改前三行,其中redirect_URL是回调地址,这个需要QQ互联应用管理中配置。
一切配置完成,最后写调起QQ登录和回调的方法。
1、页面设置登录按钮,为按钮添加点击事件,比如 qqLogin.action。
2、在java后台写qqLogin方法。
@RequestMapping(value = "/qqLogin")
public void aaLogin(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=utf-8");
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
} catch (IOException e) {
e.printStackTrace();
} catch (QQConnectException e) {
e.printStackTrace();
}
}
写完该方法,此时点击按钮,会跳转到QQ登录页面。
3、接着,写回调方法,比如我的回调方法名为 :qqDoLogin.action,那么,在qqconnectconfig.properties的redirect_URL要填 域名+qqDoLogin.action,比如我:http://www.songsir.net/qqDoLogin.action。(当然,QQ互联应用管理中配置的也是该地址)
代码如下:
@RequestMapping(value = "/qqDoLogin")
public String afterLogin(HttpServletRequest request, HttpServletResponse response) {
try {
AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
String accessToken = null;
String openID = null;
String nickname = null;
if (accessTokenObj.getAccessToken().equals("")) {
/**
* 我们的网站被CSRF攻击了或者用户取消了授权 做一些数据统计工作
*/
logger.info("没有响应参数");
return "member/login";
} else {
accessToken = accessTokenObj.getAccessToken();
/**
* 利用获取到的accessToken 去获取当前用的openid
*/
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if (userInfoBean.getRet() == 0) {
nickname = userInfoBean.getNickname();
} else {
logger.info("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
return "member/login";
}
}
/**
* 获取到用户qq信息,商家应用后台做一系列登录注册等方法
*/
JSONObject vapQQLoginJson = vapQQLogin(openID, accessToken, nickname, request, response);
logger.info("登录:" + vapQQLoginJson);
if (vapQQLoginJson.getBoolean("success")) {
return redirect(response, "member.html");
} else {
return "member/login";
}
} catch (QQConnectException e) {
e.printStackTrace();
} catch (Exception e) {
}
logger.info("qqDoLogin请求失败");
return "member/login";
}