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.ini中文版(2)
Oct 09 PHP
用PHP产生动态的影像图
Oct 09 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
php简单的留言板与回复功能具体实现
Feb 19 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
百度实时推送api接口应用示例
Oct 21 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
PHP之密码加密的几种方式
Jul 29 PHP
php生成高清缩略图实例详解
Dec 07 PHP
php实现留言板功能
Mar 05 PHP
Laravel框架路由管理简单示例
May 07 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
详解vue在项目中使用百度地图
2019/03/26 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
pyside写ui界面入门示例
2014/01/22 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
Python如何在bool函数中取值
2020/09/21 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
工业设计专业推荐信
2013/10/29 职场文书
教师职称自我鉴定
2014/02/12 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
工作调动申请报告
2015/05/18 职场文书
python实现剪贴板的操作
2021/07/01 Python