thinkPHP3.2.3 第三方登录(QQ登录)

注意:这个方法不需要下载什么sdk 

代码如下

控制器

/*
     *
     * 第三方QQ接口登录
     *
     *
     * */

    public $app_id="自己的appid";
    public $app_key="自己的APP Key";

    //回调地址
    public $callBackUrl="http://网站域名/index.php/Home/Login/userinfo";

    public function index()
    {
        header('Location:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101543075&redirect_uri=http://网站域名/index.php/Home/Login/userinfo&state=state&scope=get_user_info,list_album,upload_pic,do_like');

    }


    public function userinfo(){

    //第一步,获取code(访问index即可)
        $code=$_GET['code'];
    //echo $code;
        $state=$_GET['state'];

    //第二步,获取access_token
        $access_token=$this->getAccessToken($code);


    //第三步,获取openid
        $openid=$this->get_openid($access_token);


    //第四步,获取用户信息
        $app_id=$this->app_id;
        $userinfo=$this->get_user_info($app_id,$access_token,$openid);

        $User = D("User"); // 实例化User对象

        $data['username'] = $userinfo['nickname'];
        $data['tel'] = $userinfo['province'];
        $data['portrait'] = $userinfo['figureurl_qq_2'];
        $data['time'] = time();

        $insert = $User->add($data);
        $info=$User->where("id=$insert")->find();

        if($insert){
            session('id',$insert);

            session('username',$info['username']);
            session('tel',$info['tel']);
            session('userip',get_client_ip());
            session('portrait',$info['portrait']);
            
            $this->redirect('Index/index');
        }

    }

    /**
     * 获取access_token值
     * @return array 返回包含access_token,过期时间的数组
     * */


    public function getAccessToken($code)
    {


        $url = "https://graph.qq.com/oauth2.0/token";

        $param = array(
            "grant_type"    =>    "authorization_code",

            "client_id"     =>    $this->app_id,
            "client_secret" =>    $this->app_key,
            "code"          =>    $code,
            "state"         =>    "state",
            "redirect_uri"  =>    $this->callBackUrl

            );

        $response = $this->get_url($url, $param);
        if($response == false) {
            return false;
        }
        $params = array();
        parse_str($response, $params);
        return $params["access_token"];

    }

    /**
     * 获取client_id 和 openid
     * @param $access_token access_token验证码
     * @return array 返回包含 openid的数组
     * */


    private  function get_openid($access_token) {
        $url = "https://graph.qq.com/oauth2.0/me";

        $param = array(
            "access_token"    => $access_token
        );
        $response  = $this->get_url($url, $param);
        if($response == false) {
            return false;
        }
        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) || $user->openid == "") {
            return false;
        }

        return $user->openid;

    }

    /**
     * 获取用户信息
     * @param $client_id
     * @param $access_token
     * @param $openid
     * @return array 用户的信息数组
     * */


    public function get_user_info($app_id,$token,$openid){
        $url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';
        $str = $this->get_url($url);
        if($str == false) {
            return false;
        }
        $arr = json_decode($str,true);
        return $arr;
    }

    //CURL GET
    public function get_url($url, $param = null) {
        if($param != null) {
            $query = http_build_query($param);
            $url = $url . '?' . $query;
        }
        $ch = curl_init();
        if(stripos($url, "https://") !== false){
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
        $content = curl_exec($ch);
        $status = curl_getinfo($ch);
        curl_close($ch);
        if(intval($status["http_code"]) == 200) {
            return $content;
        }else{
            echo $status["http_code"];
            return false;
        }
    }


    /*
     * HTTP POST Request
    */
    public function post_url($url, $params) {
        $ch = curl_init();
        if(stripos($url, "https://") !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $content = curl_exec($ch);
        $status = curl_getinfo($ch);
        curl_close($ch);
        if(intval($status["http_code"]) == 200) {
            return $content;
        } else {
            return false;
        }
    }

    //json_encode转换中文解决方法


    public function encode_json($str){
        $code = json_encode($str);
        return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
            create_function(
                '$matches',
                'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
            ),
            $code);
}

 

 

模板中url

<div class="other_login">
                    <div class="left other_left"> <span>其它登录方式</span> </div>
                    <div class="right other_right">
                        <a href="{:U('Login/index')}"><i class="fa fa-qq fa-2x"></i></a>
                        <a href="#"><i class="fa fa-weixin fa-2x"></i></a>
                        <a href="#"><i class="fa fa-weibo fa-2x"></i></a> </div>
                </div>

 

前台首页用户信息调用

 <li style="margin:0 0 0 1rem;">

                <h3>用户头像:<img src="<?php echo session('portrait')?>" style="width:70px;height: 70px;border-radius:50%; vertical-align:middle;"></h3>
                <h3>用户账号:<?php echo session('tel') ?></h3>
                <h3>用户名称:<?php echo session('username') ?></h3>
            </li>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
THINKPHP最全第三方登录(包括腾讯QQ、微信、新浪微博、Github、淘宝网、百度、搜狐微博、人人、360、网易等等) 使用方式: 1、使用命名空间 use Org\ThinkSDK\ThinkOauth; 2、设置三方登录的类别并赋予一个变量 $type = ThinkOauth::getInstance('qq'); 3、设置配置文件 'THINK_SDK_(TYPE)' => array( 'APP_KEY' => '', //应用注册成功后分配的 APP ID 'APP_SECRET' => '', //应用注册成功后分配的KEY 'CALLBACK' => '', //注册应用填写的callback ), 上文中的(TYPE)为设置的类别,其值目前有以下几个: //腾讯QQ登录配置 THINK_SDK_QQ // 用户基本信息API接口 user/get_user_info //腾讯微博配置 THINK_SDK_TENCENT // 用户基本信息API接口 user/info //新浪微博配 THINK_SDK_SINA // 用户基本信息API接口 users/show。附加参数:'uid='.$obj->openid() //网易微博配置 THINK_SDK_T163 // 用户基本信息API接口 users/show //人人网配置 THINK_SDK_RENREN // 用户基本信息API接口 users.getInfo //360配置 THINK_SDK_X360 // 用户基本信息API接口 user/me //豆瓣配置 THINK_SDK_DOUBAN // 用户基本信息API接口 user/~me //Github配置 THINK_SDK_GITHUB // 用户基本信息API接口 user //Google配置 THINK_SDK_GOOGLE // 用户基本信息API接口 userinfo //MSN配置 THINK_SDK_MSN // 用户基本信息API接口 msn。附加参数:token //点点配置 THINK_SDK_DIANDIAN // 用户基本信息API接口 user/info //淘宝网配置 THINK_SDK_TAOBAO // 用户基本信息API接口 taobao.user.buyer.get。附加参数:'fields=user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info' //百度配置 THINK_SDK_BAIDU // 用户基本信息API接口 passport/users/getLoggedInUser // 注意,百度的头像位置是http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']} //开心网配置 THINK_SDK_KAIXIN // 用户基本信息API接口 users/me //搜狐微博配置 THINK_SDK_SOHU // 用户基本信息API接口 i/prv/1/user/get-basic-info 4、实例化一个登录页面 redirect($type->getRequestCodeURL()); 这里的$type是第二部获取的结果 5、回调页面 $code = $this->get('code'); $type = 'QQ'; $sns = ThinkOauth::getInstance($type); //腾讯微博需传递的额外参数 $extend = null; if($type == 'tencent'){ $extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey')); } //请妥善保管这里获取到的Tok

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值