45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 编程代码 > 阅读资讯:PHP QQ OAuth的实例代码

PHP QQ OAuth的实例代码

2015-07-24 05:06:13 来源:www.45fan.com 【

PHP QQ OAuth的实例代码

由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下

/**
 * QQ互联 oauth
 * @author dyllen
 *
 */
class Oauth
{
 //取Authorization Code Url
 const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize';
  
 //取Access Token Url
 const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token';
  
 //取用户 Open Id Url
 const OPEN_ID_URL = 'https://graph.qq.com/oauth2.0/me';
  
 //用户授权之后的回调地址
 public $redirectUri = null;
  
 // App Id
 public $appid = null;
  
 //App Key
 public $appKey = null;
  
 //授权列表
 //字符串,多个用逗号隔开
 public $scope = null;
  
 //授权code
 public $code = null;
  
 //续期access token的凭证
 public $refreshToken = null;
  
 //access token
 public $accessToken = null;
  
 //access token 有效期,单位秒
 public $expiresIn = null;
  
 //state
 public $state = null;
  
 public $openid = null;
  
 //construct
 public function __construct($config=[])
 {
  foreach($config as $key => $value) {
   $this->$key = $value;
  }
 }
  
 /**
  * 得到获取Code的url
  * @throws \InvalidArgumentException
  * @return string
  */
 public function codeUrl()
 {
  if (!$this->redirectUri) {
   throw new \Exception('parameter $redirectUri must be set.');
  }
  $query = [
    'response_type' => 'code',
    'client_id' => $this->appid,
    'redirect_uri' => $this->redirectUri,
    'state' => $this->getState(),
    'scope' => $this->scope,
  ];
  
  return self::PC_CODE_URL . '?' . http_build_query($query);
 }
  
 /**
  * 取access token
  * @throws Exception
  * @return boolean
  */
 public function getAccessToken()
 {
  $params = [
    'grant_type' => 'authorization_code',
    'client_id' => $this->appid,
    'client_secret' => $this->appKey,
    'code' => $this->code,
    'redirect_uri' => $this->redirectUri,
  ];
  
  $url = self::PC_ACCESS_TOKEN_URL . '?' . http_build_query($params);
  $content = $this->getUrl($url);
  parse_str($content, $res);
  if ( !isset($res['access_token']) ) {
   $this->thrwoError($content);
  }
  
  $this->accessToken = $res['access_token'];
  $this->expiresIn = $res['expires_in'];
  $this->refreshToken = $res['refresh_token'];
  
  return true;
 }
  
 /**
  * 刷新access token
  * @throws Exception
  * @return boolean
  */
 public function refreshToken()
 {
  $params = [
    'grant_type' => 'refresh_token',
    'client_id' => $this->appid,
    'client_secret' => $this->appKey,
    'refresh_token' => $this->refreshToken,
  ];
  
  $url = self::PC_ACCESS_TOKEN_URL . '?' . http_build_query($params);
  $content = $this->getUrl($url);
  parse_str($content, $res);
  if ( !isset($res['access_token']) ) {
   $this->thrwoError($content);
  }
  
  $this->accessToken = $res['access_token'];
  $this->expiresIn = $res['expires_in'];
  $this->refreshToken = $res['refresh_token'];
  
  return true;
 }
  
 /**
  * 取用户open id
  * @return string
  */
 public function getOpenid()
 {
  $params = [
    'access_token' => $this->accessToken,
  ];
  
  $url = self::OPEN_ID_URL . '?' . http_build_query($params);
    
  $this->openid = $this->parseOpenid( $this->getUrl($url) );
   
  return $this->openid;
 }
  
 /**
  * get方式取url内容
  * @param string $url
  * @return mixed
  */
 public function getUrl($url)
 {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_URL, $url);
  $response = curl_exec($ch);
  curl_close($ch);
  
  return $response;
 }
  
 /**
  * post方式取url内容
  * @param string $url
  * @param array $keysArr
  * @param number $flag
  * @return mixed
  */
 public function postUrl($url, $keysArr, $flag = 0)
 {
  $ch = curl_init();
  if(! $flag) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
  curl_setopt($ch, CURLOPT_URL, $url);
  $ret = curl_exec($ch);
  
  curl_close($ch);
  return $ret;
 }
  
  
 /**
  * 取state
  * @return string
  */
 protected function getState()
 {
  $this->state = md5(uniqid(rand(), true));
  //state暂存在缓存里面
  //自己定义
    //。。。。。。。。。
  
  return $this->state;
 }
  
 /**
  * 验证state
  * @return boolean
  */
 protected function verifyState()
 {
  //。。。。。。。
 }
  
 /**
  * 抛出异常
  * @param string $error
  * @throws \Exception
  */
 protected function thrwoError($error)
 {
  $subError = substr($error, strpos($error, "{"));
  $subError = strstr($subError, "}", true) . "}";
  $error = json_decode($subError, true);
   
  throw new \Exception($error['error_description'], (int)$error['error']);
 }
  
 /**
  * 从获取openid接口的返回数据中解析出openid
  * @param string $str
  * @return string
  */
 protected function parseOpenid($str)
 {
  $subStr = substr($str, strpos($str, "{"));
  $subStr = strstr($subStr, "}", true) . "}";
  $strArr = json_decode($subStr, true);
  if(!isset($strArr['openid'])) {
   $this->thrwoError($str);
  }
   
  return $strArr['openid'];
 }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。


本文地址:http://www.45fan.com/bcdm/15491.html
Tags: PHP OAuth 互联
编辑:路饭网
推广内容
推荐阅读
热门推荐
推荐文章
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部