您的位置:首页 > 编程语言 > PHP开发

[置顶] thinkPHP3.2 第三方登录(QQ登录)

2017-06-09 11:19 761 查看
<?php

namespace Home\Controller;

use Think\Controller;

class LoginController extends PublicController {
//APP ID

    public $app_id="你的app_id";

    //APP KEY

    public $app_key="你的app_key";

    //回调地址

    public $callBackUrl="http://域名/项目名/Home/Login/userinfo";

    public function index(){
header('Location:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=你的app_id&redirect_uri=http://域名/项目名/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);
echo $access_token.'<br>';

//第三步,获取openid
$openid=$this->get_openid($access_token);
echo $openid.'<br>';

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

echo $userinfo['nickname'];
print_r($userinfo);
}  

/**

     * 获取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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: