Home  >  Article  >  Backend Development  >  QQ登录OAuth2.0 php接入种

QQ登录OAuth2.0 php接入种

WBOY
WBOYOriginal
2016-06-13 10:39:291173browse

QQ登录OAuth2.0 php接入类

?

/**
?*
?* qq登录
?* @author http://www.heui.org
?*
?*/
class Oauth_qq
{
??private static $_instance;
??private $config = array();
?
??private function __construct($config)
??{
????$this->Oauth_qq($config);
??}
?
??public static function getInstance($config)
??{
????if(!isset(self::$_instance))
????{
??????$c=__CLASS__;
??????self::$_instance = new $c($config);
????}
????return self::$_instance;
??}
?
??private function Oauth_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";
??}
?
??function login()
??{
????$_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");
??}
?
??function callback()
??{
????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 "<h3>error:</h3>" . $msg->error;
??????????echo "<h3>msg? :</h3>" . $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.");
????}
??}
?
??function get_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 "<h3>error:</h3>" . $user->error;
??????echo "<h3>msg? :</h3>" . $user->error_description;
??????exit;
????}
?
????//set openid to session
????return $_SESSION["openid"] = $user->openid;
??}
?
??function get_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;
??}
?
??public function __clone()
??{
????trigger_error('Clone is not allow' ,E_USER_ERROR);
??}
?
}
?
/* 公用函数 */
if (!function_exists("do_post"))
{
??function do_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"))
{
??function get_url_contents($url)
??{
????if (ini_get("allow_url_fopen") == "1")
????return file_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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn