温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用PHP怎么实现QQ与OAuth互联

发布时间:2020-12-16 16:15:32 来源:亿速云 阅读:179 作者:Leah 栏目:开发技术

这篇文章将为大家详细讲解有关利用PHP怎么实现QQ与OAuth互联,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

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

/**  * QQ互联 oauth  * @author dyllen  *  */ class Oauth {   //取Authorization Code Url   const PC_CODE_URL = 'https://graph.qq.com/oauth3.0/authorize';       //取Access Token Url   const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth3.0/token';       //取用户 Open Id Url   const OPEN_ID_URL = 'https://graph.qq.com/oauth3.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'];   } }

关于利用PHP怎么实现QQ与OAuth互联就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI