ThinkPHP3.2.3實現QQ等第三方登入
首先申請自己想要做的第三方(例如:qq)的appid跟appkey
在無意間找到了一個集成了多個第三方登入叫thinkSDK的東西,使用起來非常方便,不過需要修改一些東西(點選這裡檢視與下載thinkSDK)
檔案放置位置:
(1) thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
(2) event資料夾放到模組下比如Home模組下面。跟Controller資料夾同一個位置。名稱空間與類的引入,例項化。
(1) ThinkOauth.class.PHP:namespace Org\ThinkSDK; //首先加上名稱空間
use Org\ThinkSDK\sdk\QqSDK; //這裡我們要用QqSDK(sdk資料夾中的檔案要用哪一個就加進來)
例:(2) TypeEvent.class.php:
namespace Home\Event; //我是放在Home模組下的(根據自己模組命名)。
class TypeEvent{
然後,新版的thinkPHP類的呼叫方式也有所不同,在裡面呼叫 thinkOauth的方法是這樣:
原版:import(“ORG.ThinkSDK.ThinkOauth”);
$qq = ThinkOauth::getInstance();修改為: $qq = \Org\ThinkSDK\ThinkOauth::getInstance(); //載入ThinkOauth類並例項化一個物件
例:(3) sdk目錄下面的類,如QqSDK.class.php。
原版:
class QqSDK extends ThinkOauth{修改為:
namespace Org\ThinkSDK\sdk; //命名
use Org\ThinkSDK;
class QqSDK extends \Org\ThinkSDK\ThinkOauth{例:
其他的登入SDK效仿就OK
- ThinkOauth.class.php的一些修改
public function __construct($token = null){
//設定SDK型別
$class = get_class($this);
$this->Type = strtoupper(substr($class, 0, strlen($class)-3));
//下面三句是我新增的。
$typeArr = explode('\\',$this->Type);
$typeLen = count($typeArr);
$this->Type = $typeArr[$typeLen-1];
//獲取應用配置
$config = C("THINK_SDK_{$this->Type}");
if(empty($config['APP_KEY']) || empty($config['APP_SECRET'])){
E('請配置您申請的APP_KEY和APP_SECRET');
} else {
$this->AppKey = $config['APP_KEY'];
$this->AppSecret = $config['APP_SECRET'];
$this->Token = $token; //設定獲取到的TOKEN
}
}
public static function getInstance($type, $token = null) {
$name = ucfirst(strtolower($type)) . 'SDK';
$path="\Org\ThinkSDK\sdk\\$name"; //注意這裡與下面一句來例項化類的方式。
return new $path($token);
}
一些在這裡用起來不順的函式修改
(1) 所有throw new Exception修改為E;用thinkphp的E方法處理錯誤(throw new Exception()這個函式會報錯)
(2) halt函式,也替換為E在Cotroller(控制器)中呼叫,例如(注意裡面類的例項化方式)
//第三方登入
/**
* 第三方登入qq
* @param [type] $type [sdk名稱]
* @return [type] [description]
*/
public function qqLogin($type = Qq){
empty($type) && $this->error('引數錯誤');
$sns = \Org\ThinkSDK\ThinkOauth::getInstance($type);
//跳轉到授權頁面
redirect($sns->getRequestCodeURL());
}
- 回撥登入,callback,以及第三方登入與本地登入體系的結合,授權
/**
* 授權回撥地址
* @param [type] $type [description]
* @param [type] $code [description]
* @return function [description]
*/
public function callback($type = null, $code = null){
(empty($type) || empty($code)) && $this->error('引數錯誤');
//載入ThinkOauth類並例項化一個物件
$sns = \Org\ThinkSDK\ThinkOauth::getInstance($type);
//騰訊微博需傳遞的額外引數
$extend = null;
if($type == 'tencent'){
$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
}
//請妥善保管這裡獲取到的Token資訊,方便以後API呼叫
//呼叫方法,例項化SDK物件的時候直接作為建構函式的第二個引數傳入
//如: $qq = ThinkOauth::getInstance('qq', $token);
$token = $sns -> getAccessToken($code,extend);
var_dump($token);
//獲取當前登入使用者資訊
if(is_array($token)){
$user_info = A('Type', 'Event')->$type($type,$token,$openid['openid']);
echo("<h1>恭喜!使用 {$type} 使用者登入成功</h1><br>");
echo("授權資訊為:<br>");
dump($token);
echo("當前登入使用者資訊為:<br>");
dump($user_info);
}
}
獲取使用者資訊是通過Event–>TypeEvent.class.php獲取的
最後不要忘記了在做的時候要先在配置檔案(config.php)配置登入資訊
//定義回撥URL通用的URL
define('URL_CALLBACK', 'http://localhost/xiaomai/Home/Login/callback/type/');
return array(
// +----------------------------------------------------------------------
// | 第三方登入配置項
// +----------------------------------------------------------------------
//騰訊QQ登入配置
'THINK_SDK_QQ' => array(
'APP_KEY' => '換成自己的', //應用註冊成功後分配的 APP ID
'APP_SECRET' => '換成自己的', //應用註冊成功後分配的KEY
'CALLBACK' => URL_CALLBACK . 'qq',
),
前端的事件:
<a href="{:U('Login/qqLogin')}"><img src="__PUBLIC__/img/qqz.png"/></a>
看一下效果:
最後就OK了,如果中間出現什麼問題可以+QQ:956798116諮詢(請備註你是為什麼新增)