Maison  >  Article  >  cadre php  >  Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

angryTom
angryTomavant
2020-03-05 11:35:343308parcourir

Cet article présente la méthode d'utilisation de ThinkPHP pour se connecter à QQ Internet afin de réaliser une connexion tierce. Il est utilisé comme un petit cas pour vous expliquer. J'espère qu'il vous sera utile.

Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

Je souhaite connecter un projet de nom de domaine de deuxième niveau QQ Fonction de connexion tierce, ce projet est développé à l'aide du framework thinkphp5. J'ai recherché quelques cas d'accès sur Internet. Je pense personnellement qu'un mélange de bons et de mauvais ne me convient pas. le framework thinkphp5. Voici l'étape de développement détaillée.

(Tutoriel recommandé : tutoriel thinkphp)

La première étape consiste à télécharger le SDK Internet QQ. Nous sommes basés sur le framework thinkphp5, et bien sûr. nous devons utiliser la version PHP du SDK, le répertoire des fichiers après le téléchargement est le suivant.

Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

La deuxième étape consiste à télécharger le répertoire principal du SDK dans le répertoire approprié sur le serveur. Tout d'abord, parlons du répertoire principal du SDK qui est le répertoire de classe. dans le dossier API. Afin de tester les paramètres de configuration, j'ai téléchargé le dossier d'installation, puis configuré l'ID APP, la clé APP et le callback_url dans l'environnement de développement. Après la configuration, il y aura un fichier de configuration inc.php dans le dossier API. Dossier API/comm, et enfin enregistreur Ce fichier de configuration sera référencé dans le cours. Cependant, au cours du processus de développement ultérieur, j'ai constaté que cette erreur serait signalée : L'état ne correspond pas. Vous pourriez être victime de CSRF. Plus tard, j'ai mis l'état dans la méthode qqlogin dans la session. J'avais complètement perdu confiance dans le SDK DEMO sur le site officiel. Au lieu d'utiliser QQ pour connecter tous les fichiers, j'ai sélectionné quelques fichiers de classe importants pour le développement. Plus tard, j'ai pensé que le SDK officiel était simplement au format de code PHP ordinaire. De nombreuses choses que j'ai appliquées à thinkphp ont changé. Enfin, j'ai choisi le dernier fichier de classe, QC.php, URL.php et Oauth.php, et je l'ai téléchargé sur. répertoire extend/qqlogin. Dans les projets thinkphp5, les classes d'extension sont généralement téléchargées dans le dossier extend, comme le montre la figure sous mon dernier emplacement de répertoire.

Analyse de cas de ThinkPHP se connectant à QQ Internet pour réaliser la connexion

La troisième étape consiste à transformer les trois fichiers de classe ci-dessus. Parce que QC.php hérite de Oauth.php, nous le modifions de ce dernier, supprimons require_once et ajoutons le nom For. un espace tel que l'espace de noms qqlogin, regardez d'abord les attributs du membre. La constante de classe est l'adresse de la plate-forme Tencent. Il y a trois attributs à l'origine et aucune erreur n'est nécessaire. eux directement. La même chose est vraie ci-dessous, car sur 5 fichiers de classe, nous n'utilisons que 3 fichiers de classe, l'un est la classe de rapport d'erreurs et l'autre est la classe liée à la configuration de lecture. Examinons les attributs du membre Oauth.php, la méthode de saut qqlogin et la méthode de rappel qqcallback. Les deux autres fichiers de classe n'ont pas beaucoup changé, modifiez-les simplement selon les règles ci-dessus

<?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"]);
    }
}

Étape 4 : Écrivez le contrôleur. Appelez la fonction et la fonction de rappel, et vérifiez si l'adresse de rappel est correcte (l'adresse de rappel est l'adresse de saut renvoyée lorsque vous ajoutez une connexion tierce QQ à QQ Internet. Cette adresse contient des paramètres importants et peut obtenir les données du dernier utilisateur) Parfois, si l'adresse de rappel renseignée par QQ Internet est différente de celle de votre contrôleur, elle finira par rester bloquée à l'adresse de rappel renseignée par QQ Internet, telle que www.100txy.com/index.php?code. =65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067. Voici la méthode du contrôleur

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));//为用户数据
    }

Il convient de noter que QC doit être instancié deux fois dans la fonction de rappel pour obtenir les informations utilisateur. Seule la deuxième fois qu'il est instancié, il a les deux paramètres openid et access_token.

Pour plus de tutoriels Thinkphp, veuillez faire attention au Site Web PHP chinois !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer