90 行
2.4 KiB
PHP
90 行
2.4 KiB
PHP
<?php
|
|
/**
|
|
* QQ登录回调处理文件
|
|
* 处理QQ OAuth授权回调,获取用户信息并重定向到绑定页面
|
|
*/
|
|
|
|
session_start();
|
|
|
|
// 加载配置文件
|
|
$config = require_once __DIR__ . '/../config.php';
|
|
$qqConfig = $config['qq'];
|
|
|
|
// 检查必要参数
|
|
if (!isset($_GET['code'])) {
|
|
die('授权失败:缺少code参数');
|
|
}
|
|
|
|
$code = $_GET['code'];
|
|
|
|
// 1. 通过code获取access_token
|
|
$tokenUrl = 'https://graph.qq.com/oauth2.0/token';
|
|
$tokenParams = [
|
|
'grant_type' => 'authorization_code',
|
|
'client_id' => $qqConfig['app_id'],
|
|
'client_secret' => $qqConfig['app_key'],
|
|
'code' => $code,
|
|
'redirect_uri' => $qqConfig['callback']
|
|
];
|
|
|
|
$tokenUrl .= '?' . http_build_query($tokenParams);
|
|
$tokenResponse = file_get_contents($tokenUrl);
|
|
|
|
if (strpos($tokenResponse, 'access_token=') === false) {
|
|
die('获取access_token失败:' . $tokenResponse);
|
|
}
|
|
|
|
// 解析access_token
|
|
parse_str($tokenResponse, $tokenData);
|
|
$accessToken = $tokenData['access_token'];
|
|
|
|
// 2. 通过access_token获取openid
|
|
$openidUrl = 'https://graph.qq.com/oauth2.0/me';
|
|
$openidParams = [
|
|
'access_token' => $accessToken
|
|
];
|
|
|
|
$openidUrl .= '?' . http_build_query($openidParams);
|
|
$openidResponse = file_get_contents($openidUrl);
|
|
|
|
// 解析openid
|
|
$openidResponse = substr($openidResponse, strpos($openidResponse, '{'), strrpos($openidResponse, '}') - strpos($openidResponse, '{') + 1);
|
|
$openidData = json_decode($openidResponse, true);
|
|
|
|
if (!isset($openidData['openid'])) {
|
|
die('获取openid失败:' . $openidResponse);
|
|
}
|
|
|
|
$openid = $openidData['openid'];
|
|
|
|
// 3. 通过access_token和openid获取用户信息
|
|
$userInfoUrl = 'https://graph.qq.com/user/get_user_info';
|
|
$userInfoParams = [
|
|
'access_token' => $accessToken,
|
|
'oauth_consumer_key' => $qqConfig['app_id'],
|
|
'openid' => $openid,
|
|
'format' => 'json'
|
|
];
|
|
|
|
$userInfoUrl .= '?' . http_build_query($userInfoParams);
|
|
$userInfoResponse = file_get_contents($userInfoUrl);
|
|
$userInfo = json_decode($userInfoResponse, true);
|
|
|
|
if (!isset($userInfo['nickname'])) {
|
|
die('获取用户信息失败:' . $userInfoResponse);
|
|
}
|
|
|
|
// 4. 保存第三方用户信息到Session,跳转到绑定页面
|
|
$_SESSION['oauth_provider'] = 'qq';
|
|
$_SESSION['oauth_user'] = [
|
|
'id' => $openid,
|
|
'username' => $userInfo['nickname'],
|
|
'name' => $userInfo['nickname'],
|
|
'avatar' => isset($userInfo['figureurl_qq_2']) ? $userInfo['figureurl_qq_2'] : '',
|
|
'email' => ''
|
|
];
|
|
|
|
// 5. 跳转回绑定页面
|
|
header('Location: ../oauth_bind.php');
|
|
exit;
|
|
?>
|