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/' ],
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";
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"); }
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);
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"]); }
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') );
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(); * // 拿到用户信息后的处理 * }
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!