溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

ThinkPHP如何接入QQ互聯(lián)實(shí)現(xiàn)登錄

發(fā)布時(shí)間:2021-01-16 11:31:36 來(lái)源:億速云 閱讀:227 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了ThinkPHP如何接入QQ互聯(lián)實(shí)現(xiàn)登錄,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

ThinkPHP接入QQ互聯(lián)實(shí)現(xiàn)登錄的案例分析

我的一個(gè)二級(jí)域名項(xiàng)目想在也想接入QQ第三方登錄功能,該項(xiàng)目采用的thinkphp5框架開(kāi)發(fā)的項(xiàng)目,在網(wǎng)上搜了一些接入的案例,個(gè)人覺(jué)得魚(yú)龍混雜不太適合自己,現(xiàn)在自己重新在thinkphp5框架上開(kāi)發(fā)這個(gè)功能,下面是詳細(xì)的開(kāi)發(fā)步驟。

(推薦教程:thinkphp教程)

第一步、下載QQ互聯(lián)SDK,我們是基于thinkphp5框架下的,當(dāng)然是要用PHP版的SDK,下載下來(lái)后的文件目錄如下。

ThinkPHP如何接入QQ互聯(lián)實(shí)現(xiàn)登錄

第二步、將SDK主要目錄上傳到服務(wù)器合適的目錄下,先說(shuō)下SDK的主要的目錄是API文件夾里面的class目錄,當(dāng)初為了做配置設(shè)置項(xiàng)測(cè)試,我上傳了install文件夾,然后再開(kāi)發(fā)環(huán)境配置了APP ID、APP Key以及callback_url,配置好之后會(huì)在API/comm文件夾中多處一個(gè)inc.php配置文件,最后再recorder類(lèi)中會(huì)引用這個(gè)配置文件??墒窃诤竺娴?開(kāi)發(fā)過(guò)程中我發(fā)現(xiàn)會(huì)報(bào)這個(gè)錯(cuò)The state does not match. You may be a victim of CSRF。后面我把qqlogin方法里面的 state放到session中,對(duì)官網(wǎng)的DEMO SDK已經(jīng)完全失去信心了,不在用QQ互聯(lián)全部的文件而是挑幾個(gè)重要的類(lèi)文件來(lái)做開(kāi)發(fā)。后面想想官方給的SDK只是普通的PHP代碼格式,我應(yīng)用到thinkphp那很多東西都已經(jīng)變了,最后我選擇上個(gè)類(lèi)文件,QC.php、URL.php、Oauth.php上傳到extend/qqlogin目錄下。在thinkphp5的項(xiàng)目中擴(kuò)展類(lèi)一般上傳到extend文件夾下,如下圖所示我上次的目錄位置。

ThinkPHP如何接入QQ互聯(lián)實(shí)現(xiàn)登錄

第三步、改造上述三個(gè)類(lèi)文件,因?yàn)镼C.php是繼承了Oauth.php,我們從后者改起,去掉require_once,加上命名空間如namespace qqlogin,首先看成員屬性,類(lèi)常量是騰訊平臺(tái)的地址,不用管,原來(lái)有三個(gè)屬性,recorder、error不需要,注釋掉或直接刪掉。下文同樣,因?yàn)?個(gè)類(lèi)文件我們只用到3個(gè)類(lèi)文件,一個(gè)是報(bào)錯(cuò)類(lèi)一個(gè)讀取配置相關(guān)類(lèi)。下面看Oauth.php成員屬性、qqlogin跳轉(zhuǎn)方法、qqcallback回調(diào)方法的,其他兩個(gè)類(lèi)文件沒(méi)有太大的改大,按照上述規(guī)則改即可

<?php
/* PHP SDK
 * @version 2.0.0
 * @author connect@qq.com
 * @copyright ? 2013, Tencent Corporation. All rights reserved.
 */
namespace qqlogin;
use qqlogin;
class Oauth{
    const VERSION = "2.0";
    const GET_AUTH_CODE_URL = "https://graph.qq.com/oauth3.0/authorize";
    const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth3.0/token";
    const GET_OPENID_URL = "https://graph.qq.com/oauth3.0/me";
    // protected $recorder;
    public $urlUtils;
    // protected $error;
    
    function __construct(){
        // $this->recorder = new Recorder();
        $this->urlUtils = new URL();
        // $this->error = new ErrorCase();
    }
    public function qq_login(){
        // $appid = $this->recorder->readInc("appid");
        // $callback = $this->recorder->readInc("callback");
        // $scope = $this->recorder->readInc("scope");
        $appid = $this->appid;
        $callback = $this->callback;
        $scope = $this->scope;
        //-------生成唯一隨機(jī)串防CSRF攻擊
        $state = md5(uniqid(rand(), TRUE));
        // $this->recorder->write('state',$state);
        session('state',$state);
        //-------構(gòu)造請(qǐng)求參數(shù)列表
        $keysArr = array(
            "response_type" => "code",
            "client_id" => $appid,
            "redirect_uri" => $callback,
            "state" => $state,
            "scope" => $scope
        );
        $login_url =  $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
        return $login_url;
    }
    public function qq_callback(){
        // $state = $this->recorder->read("state");
        //--------驗(yàn)證state防止CSRF攻擊
        if(input('state') != session('state')){
            // $this->error->showError("30001");
            exit('30001');
        }
        //-------請(qǐng)求參數(shù)列表
        $keysArr = array(
            "grant_type" => "authorization_code",
            "client_id" => $this->appid,
            "redirect_uri" => urlencode($this->callback),
            "client_secret" => $this->appkey,
            "code" => $_GET['code']
        );
        //------構(gòu)造請(qǐng)求access_token的url
        $token_url = $this->urlUtils->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);
        $response = $this->urlUtils->get_contents($token_url);
        if(strpos($response, "callback") !== false){
            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response  = substr($response, $lpos + 1, $rpos - $lpos -1);
            $msg = json_decode($response);
            // if(isset($msg->error)){
            //     $this->error->showError($msg->error, $msg->error_description);
            // }
        }
        $params = array();
        parse_str($response, $params);
        // $this->recorder->write("access_token", $params["access_token"]);
        // return $params["access_token"];
        session('access_token',$params["access_token"]);
    }
}

第四步、編寫(xiě)控制器調(diào)用函數(shù)和回調(diào)函數(shù),同時(shí)檢查回調(diào)地址是否正確(回調(diào)地址是當(dāng)你添加QQ第三方登錄QQ互聯(lián)返回跳轉(zhuǎn)的地址,該地址攜帶重要參數(shù),能獲取最后用戶(hù)的數(shù)據(jù)),有些時(shí)候如果你在QQ互聯(lián)填寫(xiě)的回調(diào)地址與你控制器的不一樣,那么最后就會(huì)卡在那個(gè)QQ互聯(lián)填寫(xiě)的回調(diào)地址那,如www.100txy.com/index.php?code=65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067。下面是控制器方法

use qqlogin\QC;
// 處理qq登錄
    public function qqlogin(){
        $qq = new QC();
        $url = $qq->qq_login();
        $this->redirect($url);
    }
    // qq登錄回調(diào)函數(shù)
    public function qqcallback(){
        $qq = new QC();
        $qq->qq_callback();
        $qq->get_openid();
        $qq = new QC();
        $datas = $qq->get_user_info();
        die(var_dump($datas));//為用戶(hù)數(shù)據(jù)
    }

值得注意的是在回調(diào)函數(shù)里面要實(shí)例化兩次QC才能拿到用戶(hù)信息,第二次實(shí)例化的時(shí)候才有openid和access_token兩個(gè)參數(shù)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ThinkPHP如何接入QQ互聯(lián)實(shí)現(xiàn)登錄”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI