Maison > développement back-end > tutoriel php > Partage de cas sur la mise en œuvre de la fonction de connexion tierce de QQ dans le projet pratique TP5

Partage de cas sur la mise en œuvre de la fonction de connexion tierce de QQ dans le projet pratique TP5

黄舟
Libérer: 2023-03-16 17:56:01
original
3576 Les gens l'ont consulté

Récemment, j'ai utilisé le framework thinkPHP 5 pour créer un projet de boutique de mariage. Au cours du processus de développement, une connexion tierce était requise. Le cas officiel fourni par Tencent a été implémenté par plusieurs fichiers qui s'incluaient les uns les autres. pour constater que lorsqu'il a été placé dans tp5, les fonctions attendues ne peuvent pas être complétées via include ou require dans le contrôleur. Si vous souhaitez utiliser les classes officiellement scellées de Tencent, vous devez les modifier comme suit :

. 1. Trouvez le noyau dans le SDK officiel Le fichier

est include 'qqConnectAPI.php' lorsqu'il est utilisé en dehors du cadre. , vous pouvez voir qu'il contient plusieurs autres fichiers, fichier comm. Les quelques fichiers du dossier ne sont rien d'autre que la définition de certaines constantes, l'enregistrement de votre APP KEY et d'autres informations. Cela n'a pas d'importance. Mettez simplement les différents fichiers de classe dans la classe. dossier dans tp5 et regardez attentivement le code. J'ai découvert qu'en fait, tant que j'obtenais trois classes, je pouvais complètement implémenter la fonction.

2. Mettez-le dans le framework tp

tp5 recommande de mettre les éléments tiers qui ne sont pas installés par composer dans le répertoire d'extension Suivant , car nous devrons peut-être créer d'autres extensions à l'avenir, nous allons créer ici un dossier qqlogin séparé lié à la connexion qq

Vous pouvez voir qu'il n'y a que trois catégories. dans celui-ci, que j'ai supprimé. J'ai créé une classe Recorder et une classe ErrorCase, la fonction de ces deux-là est d'enregistrer certaines informations, telles que access_token, et de gérer les exceptions directement ici. Notez également que selon la spécification psr4, le nom de la classe doit être cohérent avec le nom du fichier, vous devez donc changer le nom du fichier et ajouter l'espace de noms extendqqlogin, Toutes les classes de tp5 doivent avoir le espace de noms .

De plus, afin d'empêcher tp5 de trouver les fichiers dont nous avons besoin, il est préférable d'enregistrer un espace de noms racine dans le fichier config.php, à la ligne 30 :

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],
Copier après la connexion

3. Transformez le code source

Parce que QC.php hérite de Oauth.php, nous allons le modifier de ce dernier, supprimer require_once et ajouter l'espace de noms. Je n'en parle pas. Regardez d'abord les attributs du membre. La constante de classe est l'adresse de la plate-forme Tencent. Il y a trois attributs et l'erreur n'est pas nécessaire. La même chose est vraie ci-dessous. Vous devriez imaginer que vous avez une rancune contre ces deux mots, et les commenter ou les supprimer lorsque vous les voyez.

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";
Copier après la connexion

Les quatre attributs suivants doivent être ajoutés. L'état est utilisé pour empêcher les attaques CSRF. Vous pouvez savoir quels sont les trois attributs suivants en consultant les documents officiels. Ils sont à l'origine inc.php dans le fichier. dossier comm. Il est stocké et maintenant il est pris directement et transformé en attributs de membre.

Construisez ensuite la fonction et instanciez trois classes. Deux d'entre elles n'existent plus, et comme mentionné ci-dessus, ces deux mots ont de la rancune, alors commentez-les ou supprimez-les lorsque vous les voyez.

Regardez la première méthode de membre ci-dessousqq_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");
}
Copier après la connexion

Nous avons déjà supprimé les lignes avec ces deux mots, et nous avons à nouveau besoin de ces choses, n'oubliez pas que nous avons ajouté trois attributs de membre ci-dessus. Nous avons déjà ces valeurs et les utilisons ci-dessous. Passez simplement $this->appid. Lors de la vérification de l'état, nous pouvons le vérifier via la session. TP5 fournit une fonction d'assistance pour écrire la session :

session('state',$this->state);
Copier après la connexion

La dernière phrase est un saut d'en-tête. Je ne sais pas pourquoi elle ne peut pas être vue dans TP5. l'effet de saut, l'url est renvoyée directement, puis le saut est réalisé via la fonction de redirection tp5 $this->redirect() dans le contrôleur.

Regardez qq_callback() ci-dessous

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"]);
}
Copier après la connexion

Les deux mots qui apparaissent ont été commentés. Nous avons écrit session dans qq_login. Comparez-le directement avec sessio. () La fonction d'assistance de tp5 peut obtenir les paramètres des requêtes get et post. Le résultat est un tableau, mais vous ne pouvez pas y ajouter dynamiquement des paires clé-valeur. Si vous souhaitez l'ajouter, vous devez l'attribuer à une variable et. puis exploitez la variable. S'il y a une erreur ici, quittez directement et imprimez le numéro d'erreur. Le document officiel contient des descriptions détaillées des numéros d'erreur. A la fin, l'access_token obtenu est directement écrit dans la session.

La méthode get_openid() suivante est similaire. La liste des paramètres est construite à l'aide de la session et la valeur de retour est écrite directement dans la session.

Modifiez ensuite QC.php, modifiez simplement la méthode de construction et donnez des valeurs aux trois variables du tableau.

$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);
Copier après la connexion

4. Appel du contrôleur

La transformation est terminée et peut être utilisée dans le contrôleur. Le code est joint ci-dessous :

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();
 * // 拿到用户信息后的处理
 *
}
Copier après la connexion

Facile à oublier :

QC doit être instancié deux fois dans la fonction de rappel pour obtenir les informations de l'utilisateur la deuxième fois qu'il est instancié. il n'y a que deux paramètres : openid et access_token.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal