thinkPHP5項目中實現QQ第三方登錄功能

更新:2017-10-27    編輯:語雪    來源:互聯網    人氣:加載中...    字號:|

本文實例講述了thinkPHP5目中實現QQ第三方登錄功能。分享給大家供大家參考,具體如下:

最近用thinkPHP 5框架做了一個婚紗店的項目,在開發歷程中需要用到第三方登錄,騰訊官方給的案例是幾個文件相互包孕實現的,放到tp5里面很悲催的發現在把持器中不能通過include或者require完成預期功能,想要用騰訊官方封的類就必須對其進行改動,改動如下:

1. 找到官方SDK里面的核心文件

thinkPHP5項目中實現QQ第三方登錄功能

框架外

2. 放到tp框架里

tp5推選將第三方的東西,同時又不是composer安裝的統一放到extend目錄下,因為可能以后還要做其他擴展,這里將qq登錄相關的單獨建一個qqlogin文件夾,

thinkPHP5項目中實現QQ第三方登錄功能

可以看到里面只有三個類,我去掉了一個Recorder和一個ErrorCase類,見名知意,這兩個的作用是記載一些信息,如access_token,還有異常處理,這里我就直接刪掉了。另外注意,遵照psr4規范,類名要跟文件名一致,所以要把文件名改一下,同時加上命名空間extend\qqlogin,tp5所有的類都要有命名空間。

另外為了防止tp5找不到我們需要的文件,最好在config.php文件里注冊一條根命名空間,在第30行:

// 注冊的根命名空間 'root_namespace' => [ 'extend\qqlogin' => '../extend/qqlogin/', 'extend\baidu' => '../extend/bdlogin/' ],

3. 改造源代碼

因為QC.php是繼承了Oauth.php,我們從后者改起,去掉require_once,加上命名空間這個就不說了,首先看成員屬性,類常量是騰訊平臺的地址,不用管,原來有三個屬性,recorder、error不需要,注釋掉或直接刪掉。下文同樣,要想象跟這兩個單詞有仇,看到就注釋或刪掉。

// protected $recorder; public $urlUtils; // protected $error; public $state; public $appid = "****"; public $callback = "http://****/index/user/qqcallback"; public $scope = "get_user_info";

下面四個屬性是需要添加的,state用于防止CSRF攻擊,下面三個看官方文檔就知道是什么東西了,這些原來是在comm文件夾下的inc.php寄放的,現在直接拿過來變成成員屬性。

然后構造函數,實例化三個類,有兩個已經不存在了,而且上面說了,跟這兩個單詞有仇,看到就要注釋或刪掉。

再看下面的第一個成員法子qq_login()

public function qq_login(){ $appid = $this->recorder->readInc("appid"); $callback = $this->recorder->readInc("callback"); $scope = $this->recorder->readInc("scope"); //---生成唯一隨機串防CSRF攻擊 $state = md5(uniqid(rand(), TRUE)); $this->recorder->write('state',$state); * * return $login_url; // header("Location:$login_url"); }

我們已經有仇把有那兩個單詞的這幾行刪掉了,我們又需要這些東西,不要忘了我們上面增加了三個成員屬性,這些值我們已經有了下面用的時候通過$this->appid就好了。state驗證的時候我們可以通過session去驗證,在tp5里面供給了助手函數去寫session:

session('state',$this->state);

最后一句是header跳轉,暫不知道什么原因在tp5里面并不能看到跳轉效果,于是直接將url返回,再在把持器里面通過tp5的重定向函數$this->redirect()實現跳轉。

下面看qq_callback()

public function qq_callback(){ // $state = $this->recorder->read("state"); //---驗證state防止CSRF攻擊 if(input('state') != session('state')){ // $this->error("30001"); exit('30001'); } * * // return $params["access_token"]; session('access_token',$params["access_token"]); }

出現那兩個單詞的已經注釋了,,我們在qq_login里面有寫session,這里直接取sessio對比就行了,input()也是tp5的助手函數,可以獲得get、post請求的參數,結果是一個數組,但是不能夠再動態為其添加鍵值對,想要添加的話必須將其賦給一個變量,再對變量進行操作。這里有差錯的話直接exit打印出差錯號,官方文檔有詳細的差錯號說明。在最后也是直接將獲取到的access_token寫進session。

下面的get_openid()法子類似,參數列表用session構建,返回值直接寫進session。

然后再改動QC.php,只需改動構造法子,把數組的三個變量給一下值就好了。

$this->keysArr = array( "oauth_consumer_key" => (int)$this->appid, "access_token" => session('access_token'), "openid" => session('openid') );

4. 把持器調用

改造完成,可以在把持器里面應用了,附上代碼入下:

use extend\qqlogin\QC; // 處理qq登錄 public function qqlogin() { $qq = new QC(); $url = $qq->qq_login(); $this->redirect($url); } // qq登錄回調函數 public function qqcallback(UserModel $user) { $qq = new QC(); $qq->qq_callback(); $qq->get_openid(); $qq = new QC(); $datas = $qq->get_user_info(); * // 拿到用戶信息后的處理 * }

切記:

在回調函數里面要實例化兩次QC才干拿到用戶信息,第二次實例化的時候才有openid和access_token兩個參數。


評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)

站點導航

您可能在找這些
四川快乐12电视软件 长春麻将技巧 一肖免费中特 甘肃11选五开奖结果一定牛 亚洲网上棋牌 中国股票交易规则 大唐娱乐棋牌游戏 大智慧股票在线 娱网棋牌大厅下载地址谁知道的 怎么加股票群微信群 至尊棋牌官网手机版