緊接着上次的第三方登錄文檔,這一波又來了。
一、使用qq登錄https://connect.qq.com/
首次登錄的話會跳轉到應用開發者注冊,自己測試的話選擇個人。下面的各項自己按真實情況填寫。
注冊后添加應用,網址一定要是外網能訪問的你的網站,不能隨便填寫的。點擊驗證會出現一部分代碼,將代碼復制粘貼在你網站首頁或者一級目錄下HTML代碼的head標簽中。完成代碼粘貼 后點擊彈出成的開始驗證。驗證成功會提示網站驗證成功,下一步創建應用。
創建成功后自動跳轉到應用,頁面上會顯示上一個博文中的APPID和APPKEY了。
配置本地的項目的域名,將域名指向127.0.0.1;沒有虛擬機的可以使用localhost來配置,在自己的域名所指位置或者localhost創建一個接收返回值的php文件,如:code.php。在其中 接收$_GET[“code”]。並將其也配置在你添加的應用回調地址中(http://localhost/code.php)。(多個回調地址中間用英文分號隔開)
QQ互聯每修改一次配置都有驗證一下網址才可以保存。
二、引入官方SDK
從開放平台的文檔資料下載SDK
找個合適的版本,因為我做的是PHP,就下載PHP的,做java的小伙伴可以下載java的對應類型。
下載解壓后會有一個connect2.1的文件夾,放在項目的根目錄,API文件夾中放置了配置文件和接入類,開發中主要用的就是這個文件夾,doc文件夾是開發幫助文檔,example中是一
些功能示例。Install文件夾是幫助配置的一個文件。
訪問connect2.1文件夾,會顯示下圖的樣子,按照提示填寫配置,請求授權不建議選擇太多,按照自己的需求選擇就可以,因為選擇的授權都會在用戶登錄的OAuth頁面顯示給用戶的,
給用戶不安全感。配置之后除了API文件夾其他都可以刪掉啦。
如果沒有看上一篇博文的話要提前看一下,方便理解啊。
QQ互聯http://wiki.connect.qq.com/這個頁面中OAuth協議介紹中有開發攻略, Server_side 和 Client_side分別指的服務端語言和客戶端語言分別是怎么接入的,php語言是服務端語言,所以使用
的是Server_side。
三、SDK核心類和重要方法
登錄授權相關的三個主要類(Connect2.1/class/*.class.php)
(1)、Recorder.class.php[配置讀寫與SESSION存取]
__construct方法中:
$incFileContents = file(ROOT."comm/inc.php");//讀取配置文件json串inc.php是自動 生成的一個文件,里面包含有appid,appkey,callback等
$incFileContents = $incFileContents[1];
$this->inc = json_decode($incFileContents);//解析成PHP對象
readInc($name)方法中:
return $this->inc->$name;//->readInc("appid")即讀取配置文件的appid
(2)、URL.classphp[基於CURL庫的get與post請求]
public function combineURL($baseURL,$keysArr){ $combined = $baseURL."?";//拼接? $valueArr = array(); foreach($keysArr as $key => $val){
$valueArr[] = "$key=$val";//拼接參數 } $keyStr = implode("&",$valueArr);//使用&拼接參數鍵值對 $combined .= ($keyStr); return $combined; }
(3)、Oauth.class.php[Oauth相關URL動態拼接與token操作]
public function qq_login(){//拼接qq登錄頁面URL $appid = $this->recorder->readInc("appid");//讀取appid $callback = $this->recorder->readInc("callback");//讀取回調地址 $scope = $this->recorder->readInc("scope");//讀取授權列表 //-------生成唯一隨機串防CSRF攻擊 $state = md5(uniqid(rand(), TRUE));//原樣返回參數 $this->recorder->write('state',$state);//state寫入session中 //-------構造請求參數列表 $keysArr = array( "response_type" => "code", "client_id" => $appid, "redirect_uri" => $callback, "state" => $state, "scope" => $scope ); $login_url = $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr); header("Location:$login_url"); }
四、SDK優化
SDK太長時間也沒有新的版本,所以有的東西老了,要調整一下文件及目錄。SDK中可能有常量名稱太普通,與你本地的項目中常量名稱重復了;所以可以批量替換SDK中的常量名稱為不常見
的名稱。可以將代碼少的文件直接寫在包含該文件的頁面中,省去包含。然后可以將不用的文件刪除。
下面呢有一個調試函數,可以新建一個php文件放進去,我這就放到了debug.php中了;在項目中引入這個文件用來調試。
function debug($val,$dump=false,$exit=true){ if($dump){ $zz = 'var_dump'; } else { $zz = (is_array($val)|| is_object($val))?'print_r':'printf'; } //輸出到html、 header("Content-type:text/html;charst=utf-8"); echo '<pre>debug output:<hr/>'; $zz($val); echo '</pre>'; if($exit)exit; }
qqlogin.php頁面
require_once 'debug.php';
require_once 'Connect2.1/qqConnectAPI.php';
//訪問QQ登錄頁面
$oauth = new Oauth();
$oauth->qq_login();
五、獲取openId
QQ用戶在第三方站點的唯一標識,同一個QQ用戶在不同站點登錄使用QQ登錄openID是一樣的。可以直接判斷openID是不是第一次登錄就可以知道用戶是不是第一次登錄,可以做一些限制什 么的。
獲取openID:
Callback.php頁面
require_once 'debug.php';
require_once 'Connect2.1/qqConnectAPI.php';
//請求accesstoken
$oauth = new Oauth();
$accesstoken=$oauth->aa_callback();
$openid=$oauth->get_openid();
最后可以將$accesstoken和$openid存在cookie里,退出qq登錄時候也就是將cookie中存的數據刪除掉。
在使用過程中需要注意以下三點:
APPid申請之后3個月未申請上線將被回收。
申請上線需要使用官網提供的QQ登錄按鈕素材。
站點里不能有違國家法律的東西。
接下來的開發可以參照官方給的流程:在這里-->http://wiki.connect.qq.com/
這個暫時告一段落了,后面還要繼續新的方向......加油!