QQ登录 PHP OAuth示例代码
QQ登录 PHP OAuth示例代码
发布时间:2016-12-29 来源:查字典编辑
摘要:根据官方文档编写复制代码代码如下:

根据官方文档编写

复制代码 代码如下:

<?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教程学习
编程开发子分类