QQ聯合登入(使用JAVA SDK)(WAP端瀏覽器不能正常使用JS SDK)
關於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) {
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資訊,商家應用後臺做一系列登入註冊等方法
*/
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";
}