Heim  >  Artikel  >  Backend-Entwicklung  >  Fallbericht zur Implementierung der QQ-Drittanbieter-Anmeldefunktion im TP5-Praxisprojekt

Fallbericht zur Implementierung der QQ-Drittanbieter-Anmeldefunktion im TP5-Praxisprojekt

黄舟
黄舟Original
2018-05-28 16:02:553490Durchsuche

Kürzlich habe ich das ThinkPHP 5-Framework verwendet, um ein Brautmoden-Shop-Projekt zu erstellen. Der offizielle Fall wurde von Tencent bereitgestellt. Es war sehr traurig Um festzustellen, dass der Controller beim Einfügen in tp5 die erwarteten Funktionen nicht ausführen kann. Wenn Sie die offiziellen Klassen von Tencent verwenden möchten, müssen Sie diese ändern:

1. Finden Sie den Kern im offiziellen SDK. Die Datei

ist include 'qqConnectAPI.php', wenn Sie diese öffnen Datei, Sie können sehen, dass sie mehrere andere Dateien enthält, die Comm-Datei. Die wenigen Dateien im Ordner sind nichts weiter als die Definition einiger Konstanten, die Aufzeichnung Ihres APP-SCHLÜSSELS und anderer Informationen. Es spielt einfach keine Rolle class-Ordner in tp5 und schaue mir den Code genau an. Ich habe festgestellt, dass ich die Funktion tatsächlich vollständig implementieren kann, solange ich drei Klassen bekomme.

2. Fügen Sie es in das tp-Framework ein

tp5 empfiehlt, Drittanbieter-Dinge, die nicht vom Composer installiert wurden, in das Erweiterungsverzeichnis zu legen Da wir in Zukunft möglicherweise weitere Erweiterungen vornehmen müssen, erstellen wir hier einen separaten qqlogin-Ordner für qq login.

Sie sehen, dass es nur drei Kategorien gibt Darin habe ich eine Recorder- und eine ErrorCase-Klasse erstellt. Die Funktion dieser beiden besteht darin, einige Informationen aufzuzeichnen, z. B. access_token, und ich werde sie hier direkt löschen. Beachten Sie außerdem, dass gemäß der psr4-Spezifikation der Klassenname mit dem Dateinamen übereinstimmen muss. Sie müssen daher den Dateinamen ändern und den Namespace extendqqlogin hinzufügen. Alle Klassen in tp5 müssen über Folgendes verfügen Namensraum .

Um zu verhindern, dass tp5 die von uns benötigten Dateien findet, ist es außerdem am besten, einen Root-Namespace in der Datei config.php in Zeile 30 zu registrieren:

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],

3. Transformieren Sie den Quellcode

Da QC.php Oauth.php erbt, werden wir es von letzterem ändern, require_once entfernen und den Namespace hinzufügen Sprechen Sie nicht darüber. Schauen Sie sich zunächst die Klassenkonstanten der Tencent-Plattform an. Es gibt keine drei Attribute, die Sie auskommentieren oder löschen müssen. Das Gleiche gilt im Folgenden. Sie sollten sich vorstellen, dass Sie einen Groll gegen diese beiden Wörter hegen, und sie kommentieren oder löschen, wenn Sie sie sehen.

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";

Die folgenden vier Attribute müssen hinzugefügt werden, um CSRF-Angriffe zu verhindern. Sie können die offiziellen Dokumente in der Datei inc.php lesen Der Ordner „comm“ wird gespeichert und nun direkt übernommen und in Mitgliedsattribute umgewandelt.

Dann konstruieren Sie die Funktion und instanziieren Sie drei Klassen. Zwei davon existieren nicht mehr, und wie oben erwähnt, haben diese beiden Wörter einen Groll, also kommentieren oder löschen Sie sie, wenn Sie sie sehen.

Sehen Sie sich die erste Mitgliedsmethode unten anqq_login()

public function qq_login(){
 $appid = $this->recorder->readInc("appid");
 $callback = $this->recorder->readInc("callback");
 $scope = $this->recorder->readInc("scope");
 //---生成唯一随机串防CSRF攻击
 $state = md5(uniqid(rand(), TRUE));
 $this->recorder->write('state',$state);
 *
 *
 return $login_url;
 // header("Location:$login_url");
}

Wir haben die Zeilen mit diesen beiden Wörtern bereits gelöscht und wir brauchen diese Dinge erneut. Vergessen Sie nicht, dass wir hinzugefügt haben Drei Mitgliedsattribute oben haben wir bereits und verwenden sie unten. Bei der Überprüfung des Status können wir ihn über die Sitzung überprüfen: $this->appid

session('state',$this->state);
Der letzte Satz ist Header Jump Beim Sprungeffekt wird die URL direkt zurückgegeben und der Sprung dann über die TP5-Umleitungsfunktion

im Controller realisiert. $this->redirect()

Sehen Sie sich qq_callback() unten an

public function qq_callback(){
 // $state = $this->recorder->read("state");
 //---验证state防止CSRF攻击
 if(input('state') != session('state')){
  // $this->error("30001");
  exit('30001');
 }
 *
 *
 // return $params["access_token"];
 session('access_token',$params["access_token"]);
}
Die beiden Wörter, die hier angezeigt werden, wurden in qq_login geschrieben. Dasselbe gilt für input() Die Hilfsfunktion von tp5 kann die Parameter von Get- und Post-Anfragen abrufen. Das Ergebnis ist ein Array, Sie können ihm jedoch keine Schlüssel-Wert-Paare hinzufügen. Wenn Sie es einer Variablen zuweisen möchten und dann die Variable bedienen. Wenn hier ein Fehler auftritt, beenden Sie den Vorgang direkt und drucken Sie die Fehlernummer aus. Das offizielle Dokument enthält detaillierte Beschreibungen der Fehlernummern. Am Ende wird das erhaltene access_token direkt in die Sitzung geschrieben.

Die folgende

-Methode ist ähnlich. Die Parameterliste wird mithilfe der Sitzung erstellt und der Rückgabewert wird direkt in die Sitzung geschrieben. get_openid()

Ändern Sie dann QC.php, ändern Sie einfach die Konstruktionsmethode und geben Sie den drei Variablen des Arrays Werte.

$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);

4. Controller-Aufruf

Die Transformation ist abgeschlossen und kann im Controller verwendet werden:

use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}

Leicht zu vergessen:

QC muss zweimal in der Rückruffunktion instanziiert werden, um die Benutzerinformationen zu erhalten. Beim zweiten Mal wird es dort instanziiert sind nur zwei Parameter:

openid und access_token.

Das obige ist der detaillierte Inhalt vonFallbericht zur Implementierung der QQ-Drittanbieter-Anmeldefunktion im TP5-Praxisprojekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn