QQ登录类

时间:2021-04-05 21:44:52

2015-3-31 22:02:09

(同一套代码, pc端不能登录, 但是, 手机和平板都可以正常登录.....)

1. 首先是库文件, 登录->授权->token->openid->获取用户信息

 class QQ
{
public $appid = '';
public $appkey = '';
public $scope = 'get_user_info'; //权限用逗号隔开
public $callback = ''; public $get_auth_code_url = 'https://graph.qq.com/oauth2.0/authorize';
public $get_access_token_url = 'https://graph.qq.com/oauth2.0/token';
public $get_openid_url = 'https://graph.qq.com/oauth2.0/me';
public $get_user_info_url = 'https://graph.qq.com/user/get_user_info'; public $access_token = '';
public $openid = ''; public function __construct($callback_url)
{
$this->callback = $callback_url;
} public function login()
{
$objRedis = Fun::getInstance()->getRedis();
$ip = Fun::getInstance()->getIP(); //-------生成唯一随机串防CSRF攻击
$state = md5(uniqid(rand(), TRUE));
$objRedis->iset('qqsdk'.$ip, 'state', $state); //-------构造请求参数列表
$arrQueryArg = array(
'response_type' => 'code',
'client_id' => $this->appid,
'redirect_uri' => $this->callback,
'state' => $state,
'scope' => $this->scope
); $uri = http_build_query($arrQueryArg);
$login_url = $this->get_auth_code_url.'?'.$uri; header("Location:$login_url");
} public function callback()
{
$objRedis = Fun::getInstance()->getRedis();
$ip = Fun::getInstance()->getIP();
$state = $objRedis->iget('qqsdk'.$ip, 'state'); //--------验证state防止CSRF攻击
if($_GET['state'] != $state){
exit('30001');
} //-------请求参数列表
$arrTokenArg = array(
'grant_type' => 'authorization_code',
'client_id' => $this->appid,
'redirect_uri' => $this->callback,
'client_secret' => $this->appkey,
'code' => $_GET['code']
);
//------构造请求access_token的url
$uri = http_build_query($arrTokenArg);
$token_url = $this->get_access_token_url.'?'.$uri;
$response = Fun::getInstance()->curl_get($token_url);
if(strpos($response, 'callback') !== false){ $lpos = strpos($response, '(');
$rpos = strrpos($response, ')');
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
$msg = json_decode($response); if(isset($msg->error)){
var_dump($msg->error, $msg->error_description);
}
} $params = array();
parse_str($response, $params); //---------获取openid
$arrTokenArg = array(
'access_token' =>$params['access_token']
);
$uri = http_build_query($arrTokenArg);
$openid_url = $this->get_openid_url.'?'.$uri;
$response = Fun::getInstance()->curl_get($openid_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)){
var_dump($user->error, $user->error_description);exit;
} return array(
'access_token' => $params['access_token'],
'openid' => $user->openid
); } public function get_user_info()
{
$qq_safe_info = $this->callback();
$access_token = $qq_safe_info['access_token'];
$openid = $qq_safe_info['openid'];
$user_info_url = "{$this->get_user_info_url}?access_token={$access_token}&oauth_consumer_key={$this->appid}&openid={$openid}&format=json";
$info = Fun::getInstance()->curl_get($user_info_url);
return array(
'openid' => $openid,
'user_info' => $info
);
// $json_user_info = Fun::getInstance()->curl_get($user_info_url);
// return json_decode($json_user_info);
}
}

2. 其次是控制器调用代码, 调用QQ登录库文件, 以及获取并记录QQ登录信息

 public function login()
{
$this->getLib('QQ', $this->qq_callback_url)->login();
} public function callback()
{
$user_info = $this->getLib('QQ', $this->qq_callback_url)->get_user_info();
// $user_ip = Fun::getInstance()->getIP();
$objRedis = $this->getLib('iredis');
$objRedis->iset('qqsdk'.$this->cookierand, 'qquser', $user_info['user_info']);
$objUserInfo = json_decode($user_info['user_info']);
$this->loadBusiness('Bbs')->qqregister($user_info['openid'], $objUserInfo->nickname, $objUserInfo->figureurl_qq_1);
echo "<script>window.opener.location.reload();window.close();</script>";
}

其中第14行代码的作用是, 刷新父窗口&&关闭弹出的QQ登录窗口

3. 最后是HTML代码, 在网页上放一个QQ登录按钮

 <a href="#" onclick='toQzoneLogin()'><img src="http://zbf-img.qiniudn.com/qq_login.png" alt="QQ登录^_^" title="QQ登录^_^"></a>
<script type="text/javascript">
//qq登录
var childWindow;
function toQzoneLogin()
{
childWindow = window.open("http://www.zhangzhibin.com/qq/index/login","TencentLogin","width=450,height=320,menubar=0,scrollbars=1, resizable=1,status=1,titlebar=0,toolbar=0,location=1");
}
</script>