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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
配置支持SSI
Nov 25 PHP
mysql5详细安装教程
Jan 15 PHP
php Mysql日期和时间函数集合
Nov 16 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
php htmlentities()函数的定义和用法
May 13 PHP
分享php多功能图片处理类
May 15 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
iOS10推送通知开发教程
Sep 19 PHP
thinkphp分页实现效果
Oct 13 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 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截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
php验证手机号码
2015/11/11 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
python线程、进程和协程详解
2016/07/19 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
函授本科自我鉴定
2013/11/03 职场文书
区域销售经理职责
2013/12/22 职场文书
2014年自我评价
2014/01/04 职场文书
学校就业推荐信范文
2014/05/19 职场文书
工地安全生产标语
2014/06/06 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
2014年英语工作总结
2014/12/20 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
志愿者工作心得体会
2016/01/15 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
Python制作表白爱心合集
2022/01/22 Python