1. 程式人生 > >QQ聯合登入(使用JAVA SDK)(WAP端瀏覽器不能正常使用JS SDK)

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) {

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";
}