由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看PHP版,给大家参考下
//取Access Token Url
const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token';
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_secret' => $this->appKey,'code' => $this->code,];
$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','refresh_token' => $this->refreshToken,$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->par<a href="https://www.jb51.cc/tag/SEO/" title="SEO">SEO</a>penid( $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_POST,CURLOPT_POSTFIELDS,$keysArr);
curl_setopt($ch,$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'];
}
}
以上所述就是本文的全部内容了,希望大家能够喜欢。
原文链接:https://www.f2er.com/php/21587.html