首页 > 网站 > 建站经验 > 正文

PHP版QQ互联OAuth示例代码分享

2024-04-25 20:38:26
字体:
来源:转载
供稿:网友

由于国内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'];

}

}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表