Maison > cadre php > PensezPHP > Classe d'extension de connexion d'authentification tierce QQ basée sur Thinkphp3.2

Classe d'extension de connexion d'authentification tierce QQ basée sur Thinkphp3.2

coldplay.xixi
Libérer: 2020-06-09 12:04:11
avant
3043 Les gens l'ont consulté

Classe d'extension de connexion d'authentification tierce QQ basée sur Thinkphp3.2

Classe d'extension de connexion d'authentification tierce QQ basée sur Thinkphp3.2

Basée sur Thinkphp3. 2 Classe d'extension de connexion d'authentification tierce QQ En fait, les classes suivantes sont également collectées et compilées par moi à partir du site officiel de TP, je les ai légèrement modifiées et améliorées.

Ici, je mets le fichier dans "/Application/Common/Lib/Qqconnect.class.php". (En fait, vous pouvez mettre ce chemin de fichier selon vos préférences)

Instanciation

$Qqconnect = new \Common\Lib\Qqconnect();
Copier après la connexion

Dans la méthode __construct, vous pouvez directement écrire votre app_id, app_key et callback adresse
Vous pouvez également modifier le code pour transmettre des paramètres ou l'écrire dans le fichier de configuration selon vos propres préférences.

Méthode d'appel :

1. Appelez la méthode getAuthCode dans la méthode du bouton de connexion de qq

$qqobj=new \Org\Util\Qqconnect();
$qqobj->getAuthCode();
Copier après la connexion

2. Appelez la méthode getUsrInfo dans la méthode d'adresse de rappel

$qqobj=new \Org\Util\Qqconnect();
$result=$qqobj->getUsrInfo();
Copier après la connexion

3. Le paramètre scope dans la méthode getAuthCode ajoute les valeurs​​get_user_info, list_album, upload_pic, do_like selon ses propres besoins .

Qqconnect.class.php

<?php
// +----------------------------------------------------------------------
// | Copyright (c) 2015.
// +----------------------------------------------------------------------
// | Author: qiandutianxia <852997402@qq.com>
// +----------------------------------------------------------------------
namespace Common\Lib;
/**
 *  qq第三方登录认证
 */
class Qqconnect {
    private static $data;
    //APP ID
    private $app_id="";
    //APP KEY
    private $app_key="";
    //回调地址
    private $callBackUrl="";
    //Authorization Code
    private $code="";
    //access Token
    private $accessToken="";
    private $openid="";
 
    public function __construct(){
        $this->app_id="";
        $this->app_key="";
        $this->callBackUrl=""; //你的回调地址
        //检查用户数据
        if(empty($_SESSION[&#39;QC_userData&#39;])){
            self::$data = array();
        }else{
            self::$data = $_SESSION[&#39;QC_userData&#39;];
        }
    }
 
 
    //获取Authorization Code
    public function getAuthCode(){
        $url="https://graph.qq.com/oauth2.0/authorize";
        $param[&#39;response_type&#39;]="code";
        $param[&#39;client_id&#39;]=$this->app_id;
        $param[&#39;redirect_uri&#39;]=$this->callBackUrl;
 
        //生成唯一随机串防CSRF攻击
        $state = md5(uniqid(rand(), TRUE));
        $_SESSION[&#39;state&#39;]=$state;
        $param[&#39;state&#39;]=$state;
        $param[&#39;scope&#39;]="get_user_info";
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        header("Location:".$url);
    }
 
    //通过Authorization Code获取Access Token
    private function _getAccessToken(){
        $this->code=$_GET[&#39;code&#39;];
        $url="https://graph.qq.com/oauth2.0/token";
        $param[&#39;grant_type&#39;]="authorization_code";
        $param[&#39;client_id&#39;]=$this->app_id;
        $param[&#39;client_secret&#39;]=$this->app_key;
        $param[&#39;code&#39;]=$this->code;
        $param[&#39;redirect_uri&#39;]=$this->callBackUrl;
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        return $this->getUrl($url);
    }
 
    //获取openid
    public function _setOpenID(){
        $rzt=$this->_getAccessToken();
        parse_str($rzt,$data);
        $this->accessToken=$data[&#39;access_token&#39;];
        $url="https://graph.qq.com/oauth2.0/me";
        $param[&#39;access_token&#39;]=$this->accessToken;
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        $response=$this->getUrl($url);
 
        //--------检测错误是否发生
        if(strpos($response, "callback") !== false){
            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos -1);
        }
        $user = json_decode($response);
 
        if(isset($user->error)){
            exit("错误代码:100007");
        }
         
        return $user->openid;
    }
 
 
    //获取信息
    public function getUserInfo(){
        if($_GET[&#39;state&#39;] != $_SESSION[&#39;state&#39;]){
            exit("错误代码:300001");
        }
 
        $openid=$this->_setOpenID();
        if(empty($openid)){
            return false;
        }
        session(&#39;openid&#39;,$openid);
        $url="https://graph.qq.com/user/get_user_info";
        $param[&#39;access_token&#39;]=$this->accessToken;
        $param[&#39;oauth_consumer_key&#39;]=$this->app_id;
        $param[&#39;openid&#39;]=$openid;
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        $rzt=$this->getUrl($url);
        return $rzt;
    }
 
    public function getOpenId(){
        if($_GET[&#39;state&#39;] != $_SESSION[&#39;state&#39;]){
            exit("错误代码:300001");
        }
        $rzt=$this->_getAccessToken();
        parse_str($rzt,$data);
        $this->accessToken=$data[&#39;access_token&#39;];
        $url="https://graph.qq.com/oauth2.0/me";
        $param[&#39;access_token&#39;]=$this->accessToken;
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        $response=$this->getUrl($url);
 
        //--------检测错误是否发生
        if(strpos($response, "callback") !== false){
            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos -1);
        }
        $info = object_array(json_decode($response));
        $qq[&#39;access_token&#39;] = $this->accessToken;
        $qq[&#39;openid&#39;]       = $info[&#39;openid&#39;];
        session(&#39;qq&#39;,$qq);
        return $info[&#39;openid&#39;];
    }
 
 
    public function getInfo($openid=&#39;&#39;,$accessToken=&#39;&#39;){
        $url="https://graph.qq.com/user/get_user_info";
        $param[&#39;oauth_consumer_key&#39;]=$this->app_id;
        $param[&#39;access_token&#39;]=$accessToken;
        $param[&#39;openid&#39;]=$openid;
        $param =http_build_query($param,&#39;&#39;,&#39;&&#39;);
        $url=$url."?".$param;
        $rzt=$this->getUrl($url);
        $info = object_array(json_decode($rzt));
        return $info;
    }
 
 
    //CURL GET
    private function getUrl($url){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        if (!empty($options)){
            curl_setopt_array($ch, $options);
        }
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
 
 
    //CURL POST
    private function postUrl($url,$post_data){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        ob_start();
        curl_exec($ch);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }
}
Copier après la connexion

Ce qui suit est le code dans le contrôleur

LoginController.class.php Ce fichier contient principalement deux méthodes

Cliquez sur l'adresse visitée lors de la connexion via QQ

public function qq_login(){
        $Qqconnect = new \Common\Lib\Qqconnect();
        $Qqconnect->getAuthCode();
    }
Copier après la connexion

Adresse d'accès de rappel

public function callback(){
        $Qqconnect = new \Common\Lib\Qqconnect();
        $openid = $Qqconnect->getOpenId();
        $qq = session(&#39;qq&#39;);
 
 
 
        $Member = M(&#39;Member&#39;);
        $map = array();
        $map[&#39;openid&#39;] = $openid;
        $userInfo = $Member->where($map)->find();
 
 
        if(!empty($userInfo)){
            $this->success(&#39;登陆成功!&#39;,U(&#39;Member/index&#39;));
        }else{
            $Qqconnect = new \Common\Lib\Qqconnect();
            $userInfo = $Qqconnect->getInfo($qq[&#39;openid&#39;],$qq[&#39;access_token&#39;]);
            print_r($userInfo);
            exit;
    }
Copier après la connexion

Ce qui précède n'est qu'un exemple simple, vous pouvez vous y référer pour modification et amélioration. S'il y a quelque chose que vous ne comprenez pas, vous pouvez laisser un message pour en discuter.

Tutoriel recommandé : "Tutoriel vidéo PHP"

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:liqingbo.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