时间:2021-07-01 10:21:17 帮助过:7人阅读
?
| /**?*?* qq登录?* @author http://www.heui.org
?*?*/classOauth_qq{??privatestatic$_instance;??private$config= array();???privatefunction__construct($config)??{????$this->Oauth_qq($config);??}???publicstaticfunctiongetInstance($config)??{????if(!isset(self::$_instance))????{??????$c=__CLASS__;??????self::$_instance= new$c($config);????}????returnself::$_instance;??}???privatefunctionOauth_qq($config)??{????$this->config = $config;????$_SESSION["appid"]??? = $this->config['appid'];????$_SESSION["appkey"]?? = $this->config['appkey'];????$_SESSION["callback"] = $this->config['callback'];????$_SESSION["scope"] = "get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo";??}???functionlogin()??{????$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection????$login_url= "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=
"????. $_SESSION["appid"] . "&redirect_uri=". urlencode($_SESSION["callback"])????. "&state=". $_SESSION['state']????. "&scope=".$_SESSION["scope"];????header("Location:$login_url");??}???functioncallback()??{????if($_REQUEST['state'] == $_SESSION['state']) //csrf????{??????$token_url= "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&
"??????. "client_id=". $_SESSION["appid"]. "&redirect_uri=". urlencode($_SESSION["callback"])??????. "&client_secret=". $_SESSION["appkey"]. "&code=". $_REQUEST["code"];???????$response= get_url_contents($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))????????{??????????echo". $msg->error;??????????echo". $msg->error_description;??????????exit;????????}??????}???????$params= array();??????parse_str($response, $params);???????$_SESSION["access_token"] = $params["access_token"];????}????else????{??????echo("The state does not match. You may be a victim of CSRF.");????}??}???functionget_openid()??{????$graph_url= "https://graph.qq.com/oauth2.0/me?access_token=
"????. $_SESSION['access_token'];?????$str?= get_url_contents($graph_url);????if(strpos($str, "callback") !== false)????{??????$lpos= strpos($str, "(");??????$rpos= strrpos($str, ")");??????$str?= substr($str, $lpos+ 1, $rpos- $lpos-1);????}?????$user= json_decode($str);????if(isset($user->error))????{??????echo". $user->error;??????echo". $user->error_description;??????exit;????}?????//set openid to session????return$_SESSION["openid"] = $user->openid;??}???functionget_user_info()??{????$get_user_info= "https://graph.qq.com/user/get_user_info?
"????. "access_token=". $_SESSION['access_token']????. "&oauth_consumer_key=". $_SESSION["appid"]????. "&openid=". $_SESSION["openid"]????. "&format=json";?????$info= get_url_contents($get_user_info);????$arr= json_decode($info, true);?????return$arr;??}???publicfunction__clone()??{????trigger_error('Clone is not allow',E_USER_ERROR);??}?}?/* 公用函数 */if(!function_exists("do_post")){??functiondo_post($url, $data)??{????$ch= curl_init();????curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);????curl_setopt($ch, CURLOPT_POST, TRUE);????curl_setopt($ch, CURLOPT_POSTFIELDS, $data);????curl_setopt($ch, CURLOPT_URL, $url);????$ret= curl_exec($ch);?????curl_close($ch);????return$ret;??}}if(!function_exists("get_url_contents")){??functionget_url_contents($url)??{????if(ini_get("allow_url_fopen") == "1")????returnfile_get_contents($url);?????$ch= curl_init();????curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);????curl_setopt($ch, CURLOPT_URL, $url);????$result=? curl_exec($ch);????curl_close($ch);?????return$result;??}} | 
使用实例:
| $config['appid']??? = '';$config['appkey']?? = '';$config['callback'] = '';$o_qq= Oauth_qq::getInstance($config);?//then$o_qq->login();//or$o_qq->callback();$o_qq->get_openid();$o_qq->get_user_info(); | 
原文:http://www.heui.org/archives/454