首頁  >  文章  >  後端開發  >  TP5實戰專案中QQ第三方登入功能的實作案例分享

TP5實戰專案中QQ第三方登入功能的實作案例分享

黄舟
黄舟原創
2018-05-28 16:02:553490瀏覽

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

1. 找到官方SDK裡面的核心檔案

框架外使用的時候是include 'qqConnectAPI.php',開啟這個檔案可以看到它是包含了另外幾個文件的,comm資料夾下的幾個文件無非就是定義一些常數,記錄一下你的APP KEY這些信息,都無關緊要,只要把class文件夾下的幾個類文件放到tp5裡面就好了,而且仔細看一下程式碼會發現其實只要拿到三個類別就完全可以實現功能了。

2. 放到tp框架裡

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

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

另外為了防止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才能拿到使用者訊息,第二次實例化的時候才有openidaccess_token兩個參數。

以上是TP5實戰專案中QQ第三方登入功能的實作案例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn