QQ第三方登录

<?php

namespace Home\Controller;

use Think\Controller;



class QqController extends Controller {



    private $appid   = '';

    private $appkey  = '';

    private $backurl = '/Home/Qq/backQq';  // 与QQ互联里面的回调地址一致



    public function index() {

        $url = 'https://graph.qq.com/oauth2.0/authorize';

        $state = md5(uniqid(rand(), TRUE));

        session('state', $state);

        $data = array(

            'response_type' => 'code',

            'client_id'     => $this->appid,

            'redirect_uri'  => URLEncode("http://".$_SERVER['HTTP_HOST'].$this->backurl),

            'state'         => $state

        );

        $login_url = $this->combineURL($url, $data);

        header("Location:$login_url");

    }



    public function getArr($str) {

        $text = explode('&', $str);

        $data = array();

        foreach ($text as $key => $v) {

            $va = explode('=',$v);

            $data[$va[0]] = $va[1];

        }

        return $data;

    }



    //回调并获取Access Token、openid

    public function backQq() {

        $code  = I('code');

        $state = I('state');

        if($code != '' && $state == session('state') ) {

            /*if(checkmobile()) {

                $url = 'https://graph.z.qq.com/moc2/token';

                $graph_url = 'https://graph.z.qq.com/moc2/me';

            } else {

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

                $graph_url = 'https://graph.qq.com/oauth2.0/me';

            }*/

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

            $graph_url = 'https://graph.qq.com/oauth2.0/me';

            $data = array(

                'grant_type'     => 'authorization_code',

                'client_id'      => $this->appid,

                'client_secret'  => $this->appkey,

                'code'           => $code,

                'redirect_uri'   => URLEncode("http://".$_SERVER['HTTP_HOST'].$this->backurl),

            );

            $url = $this->combineURL($url, $data);

            //echo $url;exit;

            $access = $this->getArr($this->get_contents($url));

            //获取openid

            $data = array(

                'access_token'     => $access["access_token"],

            );

            $graph_url = $this->combineURL($graph_url, $data);

            $response = $this->get_contents($graph_url);

            //echo $response;

            //--------检测错误是否发生

            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)){

                echo $user->error . $user->error_description;

            }



            $userinfourl = 'https://graph.qq.com/user/get_user_info?access_token='. $access["access_token"].'&oauth_consumer_key='.$this->appid.'&openid='.$user->openid; 



            $userinfo = json_decode($this->get_contents($userinfourl),1);

            $userinfo['openid'] = $user->openid;

            $userinfo['type']   = 1;

            session('qc_qqInfo',$userinfo);

            session('state',null);

            $user = M('user')->where(array('qqid'=>$userinfo['openid']))->find();

            if(isset($user) && !empty($user['phone'])){

                session("USER_PROFILES",$user);

                header("Location:http://".$_SERVER['HTTP_HOST'].'/Home/Users/index');

            }else{

                header("Location:http://".$_SERVER['HTTP_HOST'].'/Home/Login/binding');

            }

        }

    }



    // get远程

    private function get_contents($url){

        if (ini_get("allow_url_fopen") == "1") {

            $response = file_get_contents($url);

        }else{

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

            curl_setopt($ch, CURLOPT_URL, $url);

            $response =  curl_exec($ch);

            curl_close($ch);

        }

        //-------请求为空

        if(empty($response)){

            echo 50001;

            //$this->error->showError("50001");

        }

        return $response;

    }



    //拼接字符串

    public function combineURL($baseURL,$keysArr){

        $combined = $baseURL."?";

        $valueArr = array();



        foreach($keysArr as $key => $val){

            $valueArr[] = "$key=$val";

        }



        $keyStr = implode("&",$valueArr);

        $combined .= ($keyStr);

        

        return $combined;

    }



}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值