1. 程式人生 > >ThinkPHP3.2.3實現QQ等第三方登入

ThinkPHP3.2.3實現QQ等第三方登入

  1. 首先申請自己想要做的第三方(例如:qq)的appid跟appkey

  2. 在無意間找到了一個集成了多個第三方登入叫thinkSDK的東西,使用起來非常方便,不過需要修改一些東西(點選這裡檢視與下載thinkSDK

  3. 檔案放置位置:
    (1) thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
    (2) event資料夾放到模組下比如Home模組下面。跟Controller資料夾同一個位置。

  4. 名稱空間與類的引入,例項化。
    (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

  1. 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. 一些在這裡用起來不順的函式修改
    (1) 所有throw new Exception修改為E;用thinkphp的E方法處理錯誤(throw new Exception()這個函式會報錯)
    (2) halt函式,也替換為E

  2. 在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());
    } 
  1. 回撥登入,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諮詢(請備註你是為什麼新增)