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


Posted in PHP onJuly 05, 2015

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

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

PHP 相关文章推荐
php 图片上传类代码
Jul 17 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
php页面缓存方法小结
Jan 10 PHP
php模板引擎技术简单实现
Mar 15 PHP
PHP session 会话处理函数
Jun 06 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 PHP
php优化查询foreach代码实例讲解
Mar 24 PHP
PHP 获取ip地址代码汇总
Jul 05 #PHP
PHP中$_SERVER使用说明
Jul 05 #PHP
php实现短信发送代码
Jul 05 #PHP
phpMyAdmin安装并配置允许空密码登录
Jul 04 #PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 #PHP
Cygwin中安装PHP方法步骤
Jul 04 #PHP
php使用Session和文件统计在线人数
Jul 04 #PHP
You might like
php 归并排序 数组交集
2011/05/10 PHP
sae使用smarty模板的方法
2013/12/17 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
使图片旋转的3种解决方案
2013/11/21 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
详解node.js 事件循环
2020/07/22 Javascript
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
django静态文件加载的方法
2018/05/20 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
银行自荐信范文
2013/10/07 职场文书
优秀求职信范文分享
2014/01/26 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技