開發(fā)攻略_Server-side
閱讀前提
本開發(fā)攻略基于使用Authorization Code獲取Access Token的授權驗證流程,適用于需要從web server訪問的應用,例如Web/wap網站。
閱讀本開發(fā)攻略前,請閱讀【QQ登錄】使用Authorization Code獲取Access Token以了解認證流程。
1. 體驗一把
注:
本體驗基于無Server端模式,但體驗效果與有Server端模式一致。
1. 瀏覽器訪問:http://qzs.qq.com/qzone/openapi/client.html 。
2. 點擊頁面中的“登錄”按鈕:
3. 在彈出的登錄框中輸入QQ帳號和密碼:
4. 登錄成功后,跳轉到指定的回調地址,URL中帶有Access Token:
2. 快速上手
準備工作
1. 請確保您的網站已經提交接入QQ登錄的申請,并成功獲取到appid和appkey。申請接入
2. 請在你的服務器上ping openapi.qzone.qq.com ,保證網站和Qzone的連接暢通。
Step1:放置QQ登錄按鈕
網站需要下載“QQ登錄”按鈕圖片,并按照UI規(guī)范將按鈕放置在頁面合適的位置。
按鈕圖標下載 按鈕放置規(guī)范
Step2:獲取Authorization Code
1. 打開瀏覽器,訪問如下地址(請將client_id,redirect_uri,scope等參數值替換為你自己的):
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]
2. 如果用戶已經有登錄態(tài),會彈出提示一個確認頁。如果還沒有登錄,會彈出登錄頁,如下圖所示:
3. 成功登錄后,彈出授權框引導用戶授權(僅在第一次成功登錄,以及第一次訪問某個未授權的OpenAPI時會出現授權頁),如下圖所示:
注意:
如果用戶點擊“跳過”,則跳轉到回調地址,返回默認的頭像、昵稱和性別。
建議第三方應用控制授權項,即參數scope中只傳入必須使用的OpenAPI名稱。因為授權項越多,用戶越有可能拒絕授權。
4. 如果用戶點擊“確認”授權,則成功跳轉到指定的redirect_uri,并跟上Authorization Code(注意此code會在10分鐘內過期)。
例如回調地址是:www.qq.com/my.php,則會跳轉到:
http://www.qq.com/my.php?code=520DD95263C1CFEA0870FBB66E******
注意:
回調地址建議設置為網站首頁或網站的用戶中心。
Step3:通過Authorization Code獲取Access Token
1.發(fā)送請求到如下地址(請將參數值替換為你自己的,參數解釋詳見這里):
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=[YOUR_APP_ID]&client_secret=[YOUR_APP_Key]&code=[The_AUTHORIZATION_CODE]&state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]
2. 即可獲取到Access Token:
access_token=YOUR_ACCESS_TOKEN&expires_in=3600
可在回調URL對應的程序(見下文的示例代碼)中接受請求,并完成獲取Access Token的工作。
特別提示:
獲取到的access token具有3個月有效期,用戶再次登錄時自動刷新。
第三方網站可存儲access token信息,以便后續(xù)調用OpenAPI訪問和修改用戶信息時使用。
Step4:使用Access Token來獲取用戶的OpenID
1. 發(fā)送請求到如下地址(請將access_token等參數值替換為你自己的):
https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN
2. 獲取到用戶OpenID,返回包如下:
callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
Step5:使用Access Token以及OpenID來訪問和修改用戶數據
1. 建議網站在用戶登錄后,即調用get_user_info接口,獲得該用戶的頭像、昵稱并顯示在網站上,使用戶體驗統(tǒng)一。
2. 調用其他OpenAPI,以訪問和修改用戶數據。所有OpenAPI詳見【QQ登錄】API文檔。
以調用get_user_info接口為例:
(1)發(fā)送請求到get_user_info的URL(請將access_token,appid等參數值替換為你自己的):
https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID
(2)成功返回后,即可獲取到用戶數據:
{
"ret":0, "msg":"", "nickname":"YOUR_NICK_NAME", ...
}
3. 示例代碼
//應用的APPID
$app_id = "YOUR_APP_ID";
//應用的APPKEY
$app_secret = "YOUR_APP_KEY";
//成功授權后的回調地址
$my_url = "YOUR_REDIRECT_URL";
//Step1:獲取Authorization Code
session_start();
$code = $_REQUEST["code"];
if(empty($code))
{
//state參數用于防止CSRF攻擊,成功授權后回調時會原樣帶回
$_SESSION['state'] = md5(uniqid(rand(), TRUE));
//拼接URL
$dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
. $_SESSION['state'];
echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state'])
{
//拼接URL
$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
if (strpos($response, "callback") !== false)
{
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
$msg = json_decode($response);
if (isset($msg->error))
{
echo "<h3>error:</h3>" . $msg->error;
echo "<h3>msg :</h3>" . $msg->error_description;
exit;
}
}
$params = array();
parse_str($response, $params);
$graph_url = "https://graph.qq.com/oauth2.0/me?access_token="
$params['access_token'];
$str = file_get_contents($graph_url);
if (strpos($str, "callback") !== false)
{
$lpos = strpos($str, "(");
$rpos = strrpos($str, ")");
$str = substr($str, $lpos + 1, $rpos - $lpos -1);
}
$user = json_decode($str);
if (isset($user->error))
{
echo "<h3>error:</h3>" . $user->error;
echo "<h3>msg :</h3>" . $user->error_description;
exit;
}
echo("Hello " . $user->openid);
}
else
{
echo("The state does not match. You may be a victim of CSRF.");
}
?>