thinkPHP5項目中實現(xiàn)QQ第三方登錄功能
本文實例講述了thinkPHP5項目中實現(xiàn)QQ第三方登錄功能。分享給大家供大家參考,具體如下:
最近用thinkPHP 5框架做了一個婚紗店的項目,在開發(fā)過程中需要用到第三方登錄,騰訊官方給的案例是幾個文件相互包含實現(xiàn)的,放到tp5里面很悲催的發(fā)現(xiàn)在控制器中不能通過include或者require完成預(yù)期功能,想要用騰訊官方封的類就必須對其進行修改,修改如下:
1. 找到官方SDK里面的核心文件
框架外使用的時候是include 'qqConnectAPI.php'
,打開這個文件可以看到它是包含了另外幾個文件的,comm文件夾下的幾個文件無非就是定義一些常量,記錄一下你的APP KEY這些信息,都無關(guān)緊要,只要把class文件夾下的幾個類文件放到tp5里面就好了,而且仔細看一下代碼會發(fā)現(xiàn)其實只要拿到三個類就完全可以實現(xiàn)功能了。
2. 放到tp框架里
tp5推薦將第三方的東西,同時又不是composer安裝的統(tǒng)一放到extend目錄下,因為可能以后還要做其他擴展,這里將qq登錄相關(guān)的單獨建一個qqlogin文件夾,
可以看到里面只有三個類,我去掉了一個Recorder和一個ErrorCase類,見名知意,這兩個的作用是記錄一些信息,如access_token,還有異常處理,這里我就直接刪掉了。另外注意,按照psr4規(guī)范,類名要跟文件名一致,所以要把文件名改一下,同時加上命名空間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存放的,現(xiàn)在直接拿過來變成成員屬性。
然后構(gòu)造函數(shù),實例化三個類,有兩個已經(jīng)不存在了,而且上面說了,跟這兩個單詞有仇,看到就要注釋或刪掉。
再看下面的第一個成員方法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"); }
我們已經(jīng)有仇把有那兩個單詞的這幾行刪掉了,我們又需要這些東西,不要忘了我們上面增加了三個成員屬性,這些值我們已經(jīng)有了下面用的時候通過$this->appid
就好了。state驗證的時候我們可以通過session去驗證,在tp5里面提供了助手函數(shù)去寫session:
session('state',$this->state);
最后一句是header跳轉(zhuǎn),暫不知道什么原因在tp5里面并不能看到跳轉(zhuǎn)效果,于是直接將url返回,再在控制器里面通過tp5的重定向函數(shù)$this->redirect()
實現(xiàn)跳轉(zhuǎn)。
下面看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"]); }
出現(xiàn)那兩個單詞的已經(jīng)注釋了,我們在qq_login里面有寫session,這里直接取sessio比較就行了,input()也是tp5的助手函數(shù),可以獲得get、post請求的參數(shù),結(jié)果是一個數(shù)組,但是不能夠再動態(tài)為其添加鍵值對,想要添加的話必須將其賦給一個變量,再對變量進行操作。這里有錯誤的話直接exit打印出錯誤號,官方文檔有詳細的錯誤號說明。在最后也是直接將獲取到的access_token寫進session。
下面的get_openid()
方法類似,參數(shù)列表用session構(gòu)建,返回值直接寫進session。
然后再修改QC.php,只需修改構(gòu)造方法,把數(shù)組的三個變量給一下值就好了。
$this->keysArr = array( "oauth_consumer_key" => (int)$this->appid, "access_token" => session('access_token'), "openid" => session('openid') );
4. 控制器調(diào)用
改造完成,可以在控制器里面使用了,附上代碼入下:
use extend\qqlogin\QC; // 處理qq登錄 public function qqlogin() { $qq = new QC(); $url = $qq->qq_login(); $this->redirect($url); } // qq登錄回調(diào)函數(shù) public function qqcallback(UserModel $user) { $qq = new QC(); $qq->qq_callback(); $qq->get_openid(); $qq = new QC(); $datas = $qq->get_user_info(); * // 拿到用戶信息后的處理 * }
切記:
在回調(diào)函數(shù)里面要實例化兩次QC才能拿到用戶信息,第二次實例化的時候才有openid和access_token兩個參數(shù)。
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門教程》、《CI(CodeIgniter)框架進階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對大家基于ThinkPHP框架的PHP程序設(shè)計有所幫助。
- thinkphp3.x中cookie方法的用法分析
- thinkphp中session和cookie無效的解決方法
- ThinkPHP的cookie和session沖突造成Cookie不能使用的解決方法
- thinkphp5框架結(jié)合mysql實現(xiàn)微信登錄和自定義分享鏈接與圖文功能示例
- thinkPHP中U方法加密傳遞參數(shù)功能示例
- ThinkPHP實現(xiàn)的rsa非對稱加密類示例
- thinkphp微信開發(fā)(消息加密解密)
- thinkphp微信開之安全模式消息加密解密不成功的解決辦法
- PHP隱形一句話后門,和ThinkPHP框架加密碼程序(base64_decode)
- tp5框架使用cookie加密算法實現(xiàn)登錄功能示例
相關(guān)文章
php實現(xiàn)微信小程序授權(quán)登錄功能(實現(xiàn)流程)
這篇文章主要介紹了php實現(xiàn)微信小程序授權(quán)登錄功能,本文通過一段詳細的代碼給大家講解的非常詳細,需要的朋友參考下2019-11-11CodeIgniter針對數(shù)據(jù)庫的連接、配置及使用方法
這篇文章主要介紹了CodeIgniter針對數(shù)據(jù)庫的連接、配置及使用方法,結(jié)合實例形式分析了CodeIgniter針對數(shù)據(jù)庫的連接配置及常用操作技巧,需要的朋友可以參考下2016-03-03php頁面跳轉(zhuǎn)session cookie丟失導(dǎo)致不能登錄等問題的解決方法
thinkphp開發(fā)的一個項目,登錄成功后又跳轉(zhuǎn)到登錄頁面,在提交信息后輸出session都是正常的,沒有問題,但是頁面跳轉(zhuǎn)后,session出現(xiàn)丟失現(xiàn)象,無法正常完成登陸,下面通過本文給大家解答下2016-12-12