Maison > développement back-end > tutoriel php > Implémentation de la fonction de connexion tierce QQ dans le projet thinkPHP5

Implémentation de la fonction de connexion tierce QQ dans le projet thinkPHP5

不言
Libérer: 2023-03-30 09:42:01
original
2385 Les gens l'ont consulté

Cet article présente principalement l'implémentation de la fonction de connexion tierce QQ dans le projet thinkPHP5. Il analyse en détail les étapes spécifiques et les compétences opérationnelles associées pour modifier l'interface de connexion QQ et l'intégrer dans le projet thinkPHP5 sous la forme de. exemples. Les amis dans le besoin peuvent s'y référer. Suivant

L'exemple de cet article décrit l'implémentation de la fonction de connexion tierce QQ dans le projet thinkPHP5. Je le partage avec vous pour votre référence. Les détails sont les suivants :

Récemment, j'ai utilisé le framework thinkPHP 5 pour créer un projet de boutique de mariage. Pendant le processus de développement, une connexion tierce était requise. Le cas fourni par Tencent est que plusieurs fichiers interagissent les uns avec les autres. Il contient l'implémentation. Il est très triste de constater que la fonction attendue ne peut pas être complétée via include ou require dans le contrôleur. Il faut le modifier. La modification est la suivante :

1. Trouver le fichier core dans le SDK officiel

Lorsqu'il est utilisé en dehors du framework, il est include 'qqConnectAPI.php'. Ouvrez ce fichier pour voir. Il contient plusieurs autres fichiers. Les fichiers du dossier comm ne sont rien d'autre que la définition de certaines constantes et l'enregistrement des informations de votre APP KEY. Il suffit de mettre quelques fichiers de classe dans le dossier de classe. Allez simplement dans tp5, et si vous regardez attentivement le code, vous constaterez que vous pouvez réellement implémenter la fonction tant que vous obtenez trois classes.

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 je vais les supprimer 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. Transformer le code source

Parce que QC.php hérite de Oauth.php, nous le modifions de ce dernier. et supprimez-le. Je ne parlerai pas de require_once et de l'ajout de l'espace de noms. Tout d'abord, regardez les attributs du membre. La constante de classe est l'adresse de la plate-forme Tencent. Il y a trois attributs. pas nécessaire. Commentez-les ou supprimez-les directement. 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 regardant. les documents officiels. Ceux-ci étaient à l'origine stockés dans inc.php dans le dossier comm, mais maintenant ils sont directement récupérés et transformés 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à ces deux mots. 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 utilisons-les ci-dessous. Lors de la vérification de l'état, nous pouvons le vérifier via la session. TP5 fournit une fonction d'assistant pour écrire la session : $this->appid

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

La dernière phrase est le saut d'en-tête. Je ne sais pas pourquoi je ne vois pas l'effet de saut dans tp5, donc je renvoie directement l'url, puis j'utilise la fonction de redirection

de tp5 pour réaliser le saut dans le contrôleur. $this->redirect()

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 une session dans qq_login Just. comparez avec session directement ici. Input() est également une fonction d'assistance de TP5. Vous pouvez obtenir les paramètres des requêtes get et post, mais vous ne pouvez pas y ajouter dynamiquement des paires clé-valeur. ajoutez-le, vous devez l'ajouter. Attribuez-le à une variable, puis agissez sur 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

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. get_openid()

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 vous pouvez contrôlez-le Il est utilisé dans l'appareil, et 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

切记:

在回调函数里面要实例化两次QC才能拿到用户信息,第二次实例化的时候才有openidaccess_token两个参数。

相关推荐:

ThinkPHP实现图片上传操作的方法

基于thinkPHP实现的微信自定义分享功能

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