QQ登录 PHP OAuth示例代码


Posted in PHP onJuly 20, 2011

根据官方文档编写

<?php 
/** 
* 申请http://connect.opensns.qq.com/apply 
* 列表http://connect.opensns.qq.com/my 
*/ 
session_start(); 
$qq_oauth_config = array( 
'oauth_consumer_key'=>'*******',//APP ID 
'oauth_consumer_secret'=>'******************',//APP KEY 
'oauth_callback'=>"http://www.955.cc/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg 
'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token", 
'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize', 
'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token', 
'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info', 
); 
$action = isset($_GET['action']) ? $_GET['action'] : ''; 
$qq = new qq_oauth($qq_oauth_config); 
switch($action){ 
//用户登录 Step1:请求临时token 
case 'login': 
$token = $qq->oauth_request_token(); 
$_SESSION['oauth_token_secret'] = $token['oauth_token_secret']; 
$qq->authorize($token['oauth_token']); 
break; 
//Step4:Qzone引导用户跳转到第三方应用 
case 'reg': 
$qq->register_user(); 
$access_token = $qq->request_access_token(); 
if($token = $qq->save_access_token($access_token)){ 
//保存,一般发给用户cookie,以及用户入库 
//var_dump($token); 
$_SESSION['oauth_token'] = $token['oauth_token']; 
$_SESSION['oauth_token_secret'] = $token['oauth_token_secret']; 
$_SESSION['openid'] = $token['openid']; 
header('Content-Type: text/html; charset=utf-8'); 
$user_info = json_decode($qq->get_user_info()); 
if($user_info->ret!=0){ 
exit("获取头像昵称时发生错误".$user_info->msg); 
} else { 
echo 'QQ昵称:',$user_info->nickname, 
'<img src="',$user_info->figureurl,'" />', 
'<img src="',$user_info->figureurl_1,'" />', 
'<img src="',$user_info->figureurl_2,'" />'; 
} 
} 
break; 
default : 
} 
class qq_oauth{ 
private $config; 
function __construct($config){ 
$this->config = $config; 
} 
/** 
* 返回配置 
* @param string $name 
* 
*/ 
function C($name){ 
return isset($this->config[$name]) ? $this->config[$name] : FALSE; 
} 
/** 
* 构建请求URL 
* @param string $url 
* @param array $params 
* @param string $oauth_token_secret 
* 
*/ 
function build_request_uri($url,$params=array(),$oauth_token_secret=''){ 
$oauth_consumer_key = $this->C('oauth_consumer_key'); 
$oauth_consumer_secret = $this->C('oauth_consumer_secret'); 
$params = array_merge(array( 
'oauth_version'=>'1.0', 
'oauth_signature_method'=>'HMAC-SHA1', 
'oauth_timestamp'=>time(), 
'oauth_nonce'=>rand(1000,99999999), 
'oauth_consumer_key'=>$oauth_consumer_key, 
),$params); 
$encode_params = $params; 
ksort($encode_params); 
$oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params)); 
$oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true)); 
$params['oauth_signature'] = $oauth_signature; 
return $url.'?'.http_build_query($params); 
} 
/** 
* 校验回调是否返回约定的参数 
*/ 
function check_callback(){ 
if(isset($_GET['oauth_token'])) 
if(isset($_GET['openid'])) 
if(isset($_GET['oauth_signature'])) 
if(isset($_GET['timestamp'])) 
if(isset($_GET['oauth_vericode'])) 
return true; 
return false; 
} 
function get_contents($url){ 
$curl = curl_init(); 
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($curl,CURLOPT_URL,$url); 
return curl_exec($curl); 
} 
/** 
* Step1:请求临时token、Step2:生成未授权的临时token 
*/ 
function oauth_request_token(){ 
$url = $this->build_request_uri($this->C('oauth_request_token_url')); 
$tmp_oauth_token = $this->get_contents($url); 
parse_str($tmp_oauth_token); 
/* 
oauth_token 未授权的临时token 
oauth_token_secret token的密钥,该密钥仅限于临时token 
error_code 错误码 
*/ 
if(isset($error_code)) exit($error_code); 
return array( 
'oauth_token'=>$oauth_token, 
'oauth_token_secret'=>$oauth_token_secret 
); 
} 
/** 
* Step3:引导用户到Qzone的登录页 
* @param string $oauth_token 未授权的临时token 
*/ 
function authorize($oauth_token){ 
$str = "HTTP/1.1 302 Found"; 
header($str); 
$url = $this->C('oauth_authorize_url'); 
$query_strings = http_build_query(array( 
'oauth_consumer_key'=>$this->C('oauth_consumer_key'), 
'oauth_token'=>$oauth_token, 
'oauth_callback'=>$this->C('oauth_callback'), 
)); 
header('Location: '.$url.'?'.$query_strings); 
} 
/** 
* Step4:Qzone引导用户跳转到第三方应用 
* @return bool 验证是否有效 
*/ 
function register_user(){ 
/* 
* oauth_token 已授权的临时token 
* openid 腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应 
* oauth_signature 签名值,方便第三方来验证openid以及来源的可靠性。 
* 使用HMAC-SHA1算法: 
* 源串:openid+timestamp(串中间不要添加'+'符号) 
* 密钥:oauth_consumer_secret 
* timestamp openid的时间戳 
* oauth_vericode 授权验证码。 
*/ 
if($this->check_callback()){ 
//校验签名 
$signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true)); 
if(!emptyempty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){ 
$_SESSION['oauth_token'] = $_GET['oauth_token']; 
$_SESSION['oauth_vericode'] = $_GET['oauth_vericode']; 
return; 
} 
} 
//校验未通过 
exit('UNKNOW REQUEST'); 
} 
/** 
* Step5:请求access token 
*/ 
function request_access_token(){ 
$url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array( 
'oauth_token'=>$_SESSION['oauth_token'], 
'oauth_vericode'=>$_SESSION['oauth_vericode'] 
),$_SESSION['oauth_token_secret']); 
return $this->get_contents($url); 
} 
/** 
* Step6:生成access token (保存access token) 
* 
* 关于access_token 
* 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。 
* 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。 
* 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。 
*/ 
function save_access_token($access_token_str){ 
parse_str($access_token_str,$access_token_arr); 
if(isset($access_token_arr['error_code'])){ 
return FALSE; 
} else { 
return $access_token_arr; 
} 
} 
/** 
* 目前腾讯仅开放该API 
* 获取登录用户信息,目前可获取用户昵称及头像信息。 
* http://openapi.qzone.qq.com/user/get_user_info 
*/ 
function get_user_info(){ 
$url = $this->build_request_uri($this->C('user_info_url'),array( 
'oauth_token'=>$_SESSION['oauth_token'], 
'openid'=>$_SESSION['openid'], 
),$_SESSION['oauth_token_secret']); 
return $this->get_contents($url); 
} 
}

文件打包下载 qq_php.rar
转自: http://dev.meettea.com
PHP 相关文章推荐
php5 mysql分页实例代码
Apr 10 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
php中文验证码实现示例分享
Jan 12 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
模板引擎正则表达式调试小技巧
Jul 20 #PHP
php中批量替换文件名的实现代码
Jul 20 #PHP
关于php连接mssql:pdo odbc sql server
Jul 20 #PHP
PHP mcrypt可逆加密算法分析
Jul 19 #PHP
PHP中date()日期函数有关参数整理
Jul 19 #PHP
php URL验证正则表达式
Jul 19 #PHP
PHP中static关键字原理的学习研究分析
Jul 18 #PHP
You might like
php中文字符截取防乱码
2008/03/28 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
php计算十二星座的函数代码
2012/08/21 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
php操作xml
2013/10/27 PHP
PHP 验证登陆类分享
2015/03/13 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
js倒计时小程序
2013/11/05 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
Python中的连接符(+、+=)示例详解
2017/01/13 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
Python原始套接字编程实例解析
2020/01/29 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
当当网软件测试笔试题
2015/11/24 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
超市创意活动方案
2014/08/15 职场文书
报效祖国演讲稿
2014/09/15 职场文书
学校联谊协议书
2014/09/16 职场文书
个人自我剖析材料
2014/09/30 职场文书
2015年教研组工作总结
2015/05/04 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python