日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

發(fā)布時(shí)間:2023/12/2 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文實(shí)例講述了thinkPHP5項(xiàng)目中實(shí)現(xiàn)QQ第三方登錄功能。分享給大家供大家參考,具體如下:

最近用thinkPHP 5框架做了一個(gè)婚紗店的項(xiàng)目,在開發(fā)過程中需要用到第三方登錄,騰訊官方給的案例是幾個(gè)文件相互包含實(shí)現(xiàn)的,放到tp5里面很悲催的發(fā)現(xiàn)在控制器中不能通過include或者require完成預(yù)期功能,想要用騰訊官方封的類就必須對(duì)其進(jìn)行修改,修改如下:

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

框架外使用的時(shí)候是include 'qqConnectAPI.php',打開這個(gè)文件可以看到它是包含了另外幾個(gè)文件的,comm文件夾下的幾個(gè)文件無非就是定義一些常量,記錄一下你的APP KEY這些信息,都無關(guān)緊要,只要把class文件夾下的幾個(gè)類文件放到tp5里面就好了,而且仔細(xì)看一下代碼會(huì)發(fā)現(xiàn)其實(shí)只要拿到三個(gè)類就完全可以實(shí)現(xiàn)功能了。

2. 放到tp框架里

tp5推薦將第三方的東西,同時(shí)又不是composer安裝的統(tǒng)一放到extend目錄下,因?yàn)榭赡芤院筮€要做其他擴(kuò)展,這里將qq登錄相關(guān)的單獨(dú)建一個(gè)qqlogin文件夾,

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

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

// 注冊(cè)的根命名空間

'root_namespace' => [

'extend\qqlogin' => '../extend/qqlogin/',

'extend\baidu' => '../extend/bdlogin/'

],

3. 改造源代碼

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

// protected $recorder;

public $urlUtils;

// protected $error;

public $state;

public $appid = "****";

public $callback = "http://****/index/user/qqcallback";

public $scope = "get_user_info";

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

然后構(gòu)造函數(shù),實(shí)例化三個(gè)類,有兩個(gè)已經(jīng)不存在了,而且上面說了,跟這兩個(gè)單詞有仇,看到就要注釋或刪掉。

再看下面的第一個(gè)成員方法qq_login()

public function qq_login(){

$appid = $this->recorder->readInc("appid");

$callback = $this->recorder->readInc("callback");

$scope = $this->recorder->readInc("scope");

//---生成唯一隨機(jī)串防CSRF攻擊

$state = md5(uniqid(rand(), TRUE));

$this->recorder->write('state',$state);

*

*

return $login_url;

// header("Location:$login_url");

}

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

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

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

下面看qq_callback()

public function qq_callback(){

// $state = $this->recorder->read("state");

//---驗(yàn)證state防止CSRF攻擊

if(input('state') != session('state')){

// $this->error("30001");

exit('30001');

}

*

*

// return $params["access_token"];

session('access_token',$params["access_token"]);

}

出現(xiàn)那兩個(gè)單詞的已經(jīng)注釋了,我們?cè)趒q_login里面有寫session,這里直接取sessio比較就行了,input()也是tp5的助手函數(shù),可以獲得get、post請(qǐng)求的參數(shù),結(jié)果是一個(gè)數(shù)組,但是不能夠再動(dòng)態(tài)為其添加鍵值對(duì),想要添加的話必須將其賦給一個(gè)變量,再對(duì)變量進(jìn)行操作。這里有錯(cuò)誤的話直接exit打印出錯(cuò)誤號(hào),官方文檔有詳細(xì)的錯(cuò)誤號(hào)說明。在最后也是直接將獲取到的access_token寫進(jìn)session。

下面的get_openid()方法類似,參數(shù)列表用session構(gòu)建,返回值直接寫進(jìn)session。

然后再修改QC.php,只需修改構(gòu)造方法,把數(shù)組的三個(gè)變量給一下值就好了。

$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ù)里面要實(shí)例化兩次QC才能拿到用戶信息,第二次實(shí)例化的時(shí)候才有openid和access_token兩個(gè)參數(shù)。

希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。

總結(jié)

以上是生活随笔為你收集整理的php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。