QQ登录
QQ互联 API官网
返回错误代码说明
public function qqLogin(){
$data=[];
$callback ='http://www.dome.cn/doQqLogin';
if(input('get.url')){
$data['u']=rawurldecode(input('get.url'));
$str=convert($data);
$callback.='?'.$str;
}
$uData=[
'response_type' => 'code',
'client_id' => '123456789',
'redirect_uri' => $callback,
'scope' => 'get_user_info',
];
$param=convert($uData);
$url='https://graph.qq.com/oauth2.0/authorize?'.$param;
header('location:'.$url);
exit;
}
public function doQQLogin(){
header('content-type:text/html;charset=utf-8');
$callback = 'http://www.dome.cn/doQqLogin';
$tokenUrl = 'https://graph.qq.com/oauth2.0/token';
$clientUrl='https://graph.qq.com/oauth2.0/me';
$userInfoUrl='https://graph.qq.com/user/get_user_info';
$app_id = '123456789';
$app_key = '181fasdd61adfabd71sdfasdb78c328e35de';
$code = isset($_REQUEST['code'])? $_REQUEST['code'] : '';
if(!$code){
die('错误的访问。');
}
$tokenRequestData=[
'grant_type'=> 'authorization_code',
'client_id' => $app_id,
'client_secret' => $app_key,
'code' => $code,
'redirect_uri' => $callback,
];
$str=callOnce($tokenUrl,$tokenRequestData,'get');
parse_str($str,$arr);
if(!isset($arr['access_token'])){
die('登陆失败1001');
}else{
$token=$arr['access_token'];
unset($arr);
unset($str);
}
$clientUrlRequestData=[
'access_token'=> $token,
];
$str=callOnce($clientUrl,$clientUrlRequestData,'get');
if(strpos($str,'callback')!==false){
$lpos=strpos($str,'(');
$rpos=strpos($str,')');
$jsonStr=substr($str,$lpos+1,$rpos - $lpos - 1);
$arr=json_decode($jsonStr,true);
$client_id = $arr['client_id'];
$openid = $arr['openid'];
unset($arr);
unset($str);
}else{
die('登陆失败1002');
}
$userInfoRequestData=[
'oauth_consumer_key' => $client_id,
'access_token' => $token,
'openid' => $openid,
'format' => 'json',
];
$str=callOnce($userInfoUrl,$userInfoRequestData);
$uerInfo=json_decode($str,true);
$w=[
'qq_openid' =>$openid,
];
if($userInfo = Db::table('shops_user')->field('id,name')->where($w)->find()){
$um->setLoginSession($userInfo['name']);
}else{
$this->doUserReg($openid,$uerInfo);
}
if (!empty($_GET['u'])){
header('location:'.$_GET['u']);exit;
}else{
header('location:/');exit;
}
}
function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = 10, $headers=array())
{
$ch = curl_init();
if($method == "post")
{
$data = convert($args);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, 1);
}
else
{
$data = convert($args);
if($data)
{
if(stripos($url, "?") > 0)
{
$url .= "&$data";
}
else
{
$url .= "?$data";
}
}
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($headers))
{
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
if($withCookie)
{
curl_setopt($ch, CURLOPT_COOKIEJAR, $_COOKIE);
}
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
function convert(&$args)
{
$data = '';
if (is_array($args))
{
foreach ($args as $key=>$val)
{
if (is_array($val))
{
foreach ($val as $k=>$v)
{
$data .= $key.'['.$k.']='.rawurlencode($v).'&';
}
}
else
{
$data .="$key=".rawurlencode($val)."&";
}
}
return trim($data, "&");
}
return $args;
}