Heim >PHP-Framework >Denken Sie an PHP >Fallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren

Fallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren

angryTom
angryTomnach vorne
2020-03-05 11:35:343358Durchsuche

Dieser Artikel stellt die Methode vor, mit ThinkPHP eine Verbindung zum QQ-Internet herzustellen, um die Anmeldung von Drittanbietern zu realisieren. Ich hoffe, er wird Ihnen hilfreich sein.

Fallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren

Fallanalyse der Verbindung von ThinkPHP mit dem QQ-Internet, um die Anmeldung zu realisieren

Ich möchte ein Second-Level-Domainnamen-Projekt QQ verbinden Anmeldefunktion von Drittanbietern, dieses Projekt wurde mit dem thinkphp5-Framework entwickelt. Ich persönlich habe das Gefühl, dass eine Mischung aus Gut und Böse für mich nicht geeignet ist Das Folgende ist der detaillierte Entwicklungsschritt.

(Empfohlenes Tutorial: thinkphp-Tutorial)

Der erste Schritt besteht darin, das QQ Internet SDK herunterzuladen. Wir basieren auf dem thinkphp5-Framework und natürlich Wir müssen die PHP-Version des SDK verwenden. Das Dateiverzeichnis nach dem Herunterladen lautet wie folgt.

Fallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren

Der zweite Schritt besteht darin, das Hauptverzeichnis des SDK in das entsprechende Verzeichnis auf dem Server hochzuladen. Lassen Sie uns zunächst darüber sprechen, dass das Hauptverzeichnis des SDK das Klassenverzeichnis ist im API-Ordner Um die Konfigurationseinstellungen zu testen, habe ich den Installationsordner hochgeladen und dann die APP-ID, den APP-Schlüssel und die Callback-URL in der Entwicklungsumgebung konfiguriert. Nach der Konfiguration befindet sich eine inc.php-Konfigurationsdatei API/comm-Ordner und schließlich Recorder. Auf diese Konfigurationsdatei wird in der Klasse verwiesen. Im weiteren Entwicklungsprozess stellte ich jedoch fest, dass dieser Fehler gemeldet wurde: Der Status stimmt nicht überein. Möglicherweise sind Sie ein Opfer von CSRF. Später habe ich den Status in der qqlogin-Methode in die Sitzung eingefügt, da ich das Vertrauen in das DEMO-SDK auf der offiziellen Website völlig verloren hatte. Anstatt QQ zum Verbinden aller Dateien zu verwenden, habe ich einige wichtige Klassendateien für die Entwicklung ausgewählt. Später dachte ich, dass das offizielle SDK nur im normalen PHP-Codeformat vorlag. Viele Dinge, die ich auf thinkphp angewendet hatte, wählten schließlich die letzte Klassendatei, QC.php, URL.php und Oauth.php extension/qqlogin-Verzeichnis. In thinkphp5-Projekten werden Erweiterungsklassen im Allgemeinen in den Erweiterungsordner hochgeladen, wie in der Abbildung unter meinem letzten Verzeichnisspeicherort gezeigt.

Fallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren

Der dritte Schritt besteht darin, die oben genannten drei Klassendateien zu transformieren. Da QC.php Oauth.php erbt, ändern wir es von letzterem, entfernen require_once und fügen den Namen For hinzu Ein Leerzeichen wie der Namespace qqlogin. Schauen Sie sich zunächst die Klassenkonstanten der Tencent-Plattform an. Es gibt keine drei Attribute, die Sie auskommentieren oder löschen müssen sie direkt. Das Gleiche gilt im Folgenden, da wir von den fünf Klassendateien nur drei Klassendateien verwenden, eine davon ist die Klasse für die Fehlerberichterstattung und die andere ist die Klasse für die Lesekonfiguration. Schauen wir uns die Oauth.php-Mitgliedsattribute, die qqlogin-Sprungmethode und die qqcallback-Rückrufmethode an. Die anderen beiden Klassendateien haben sich nicht wesentlich geändert.

<?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/oauth2.0/authorize";
    const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";
    const GET_OPENID_URL = "https://graph.qq.com/oauth2.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;
        //-------生成唯一随机串防CSRF攻击
        $state = md5(uniqid(rand(), TRUE));
        // $this->recorder->write(&#39;state&#39;,$state);
        session(&#39;state&#39;,$state);
        //-------构造请求参数列表
        $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");
        //--------验证state防止CSRF攻击
        if(input(&#39;state&#39;) != session(&#39;state&#39;)){
            // $this->error->showError("30001");
            exit(&#39;30001&#39;);
        }
        //-------请求参数列表
        $keysArr = array(
            "grant_type" => "authorization_code",
            "client_id" => $this->appid,
            "redirect_uri" => urlencode($this->callback),
            "client_secret" => $this->appkey,
            "code" => $_GET[&#39;code&#39;]
        );
        //------构造请求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(&#39;access_token&#39;,$params["access_token"]);
    }
}

Schritt 4: Schreiben Sie den Controller Rufen Sie die Funktion und die Rückruffunktion auf und prüfen Sie, ob die Rückrufadresse korrekt ist (die Rückrufadresse ist die Sprungadresse, die zurückgegeben wird, wenn Sie eine QQ-Drittanbieteranmeldung zu QQ Internet hinzufügen. Diese Adresse enthält wichtige Parameter und kann die Daten des letzten Benutzers abrufen.) Wenn sich die von QQ Internet eingegebene Rückrufadresse von der Ihres Controllers unterscheidet, bleibt sie manchmal bei der von QQ Internet eingegebenen Rückrufadresse hängen, z. B. www.100txy.com/index.php?code =65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067. Das Folgende ist die Controller-Methode

use qqlogin\QC;
// 处理qq登录
    public function qqlogin(){
        $qq = new QC();
        $url = $qq->qq_login();
        $this->redirect($url);
    }
    // qq登录回调函数
    public function qqcallback(){
        $qq = new QC();
        $qq->qq_callback();
        $qq->get_openid();
        $qq = new QC();
        $datas = $qq->get_user_info();
        die(var_dump($datas));//为用户数据
    }

. Es ist erwähnenswert, dass QC in der Rückruffunktion zweimal instanziiert werden muss, um die Benutzerinformationen zu erhalten. Nur beim zweiten Mal instanziiert es die beiden Parameter openid und access_token.

Weitere Thinkphp-Tutorials finden Sie auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonFallanalyse der Verbindung von ThinkPHP mit QQ Internet, um die Anmeldung zu realisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:www.100txy.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen