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 相关文章推荐
php 获取可变函数参数的函数
Aug 26 PHP
PHP 金额数字转换成英文
May 06 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
给ECShop添加最新评论
Jan 07 PHP
php生成过去100年下拉列表的方法
Jul 20 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP实现通过文本文件统计页面访问量功能示例
Feb 13 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 PHP
浅谈如何提高PHP代码的质量
May 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
帅气的琦玉老师
2020/03/02 日漫
Phpbean路由转发的php代码
2008/01/10 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
python读取几个G的csv文件方法
2019/01/07 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
运动会邀请函范文
2014/02/06 职场文书
人事任命书格式
2014/06/05 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
小学新课改心得体会
2016/01/22 职场文书
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
Mysql 一主多从的部署
2022/05/20 MySQL
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers