QQ登录PHP OAuth示例

  1. <?php /**  
  2. * 申请http://connect.opensns.qq.com/apply  
  3. * 列表http://connect.opensns.qq.com/my  
  4. */  
  5. session_start();   
  6. $qq_oauth_config = array(   
  7.     'oauth_consumer_key'=>'*******',//APP ID   
  8.     'oauth_consumer_secret'=>'******************',//APP KEY   
  9.     'oauth_callback'=>"http://www.955.cc/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg   
  10.     'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",   
  11.     'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',   
  12.     'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',   
  13.     'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',   
  14. );   
  15. $action = isset($_GET['action']) ? $_GET['action'] : '';   
  16.   
  17.   
  18. $qq = new qq_oauth($qq_oauth_config);   
  19. switch($action){   
  20.     //用户登录 Step1:请求临时token   
  21.     case 'login':   
  22.         $token = $qq->oauth_request_token();   
  23.         $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];   
  24.         $qq->authorize($token['oauth_token']);   
  25.     break;   
  26.     //Step4:Qzone引导用户跳转到第三方应用   
  27.     case 'reg':   
  28.         $qq->register_user();   
  29.         $access_token = $qq->request_access_token();   
  30.         if($token = $qq->save_access_token($access_token)){   
  31.             //保存,一般发给用户cookie,以及用户入库   
  32.             //var_dump($token);   
  33.             $_SESSION['oauth_token'] = $token['oauth_token'];   
  34.             $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];   
  35.             $_SESSION['openid'] = $token['openid'];   
  36.             header('Content-Type: text/html; charset=utf-8');   
  37.             $user_info = json_decode($qq->get_user_info());   
  38.             if($user_info->ret!=0){   
  39.                 exit("获取头像昵称时发生错误".$user_info->msg);   
  40.             } else {   
  41.                 echo 'QQ昵称:',$user_info->nickname,   
  42.                 '<img src="',$user_info->figureurl,'" />',   
  43.                 '<img src="',$user_info->figureurl_1,'" />',   
  44.                 '<img src="',$user_info->figureurl_2,'" />';   
  45.             }   
  46.                
  47.         }   
  48.     break;   
  49.     default :   
  50. }   
  51.   
  52.   
  53. class qq_oauth{   
  54.     private $config;   
  55.     function __construct($config){   
  56.         $this->config = $config;   
  57.     }   
  58.     /**  
  59.      * 返回配置  
  60.      * @param string $name  
  61.      *   
  62.      */  
  63.     function C($name){   
  64.         return isset($this->config[$name]) ?  $this->config[$name] : FALSE;   
  65.     }   
  66.     /**  
  67.      * 构建请求URL  
  68.      * @param string $url  
  69.      * @param array $params  
  70.      * @param string $oauth_token_secret  
  71.      *   
  72.      */  
  73.     function build_request_uri($url,$params=array(),$oauth_token_secret=''){   
  74.         $oauth_consumer_key = $this->C('oauth_consumer_key');   
  75.         $oauth_consumer_secret = $this->C('oauth_consumer_secret');   
  76.            
  77.         $params = array_merge(array(   
  78.             'oauth_version'=>'1.0',   
  79.             'oauth_signature_method'=>'HMAC-SHA1',   
  80.             'oauth_timestamp'=>time(),   
  81.             'oauth_nonce'=>rand(1000,99999999),   
  82.             'oauth_consumer_key'=>$oauth_consumer_key,   
  83.         ),$params);   
  84.         $encode_params = $params;   
  85.         ksort($encode_params);   
  86.         $oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));   
  87.         $oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));   
  88.         $params['oauth_signature'] = $oauth_signature;   
  89.         return $url.'?'.http_build_query($params);   
  90.     }   
  91.     /**  
  92.      * 校验回调是否返回约定的参数   
  93.      */  
  94.     function check_callback(){   
  95.         if(isset($_GET['oauth_token']))   
  96.             if(isset($_GET['openid']))   
  97.                 if(isset($_GET['oauth_signature']))   
  98.                     if(isset($_GET['timestamp']))   
  99.                         if(isset($_GET['oauth_vericode']))   
  100.                             return true;   
  101.         return false;   
  102.     }   
  103.       
  104.     function get_contents($url){   
  105.         $curl = curl_init();   
  106.         curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);   
  107.         curl_setopt($curl,CURLOPT_URL,$url);   
  108.         return curl_exec($curl);   
  109.     }   
  110.     /**  
  111.      * Step1:请求临时token、Step2:生成未授权的临时token  
  112.      */  
  113.     function oauth_request_token(){   
  114.         $url = $this->build_request_uri($this->C('oauth_request_token_url'));   
  115.         $tmp_oauth_token = $this->get_contents($url);   
  116.         parse_str($tmp_oauth_token);   
  117.         /*  
  118.         oauth_token 未授权的临时token  
  119.         oauth_token_secret  token的密钥,该密钥仅限于临时token  
  120.         error_code  错误码  
  121.         */  
  122.         if(isset($error_code)) exit($error_code);   
  123.         return array(   
  124.             'oauth_token'=>$oauth_token,   
  125.             'oauth_token_secret'=>$oauth_token_secret  
  126.         );   
  127.     }   
  128.     /**  
  129.      * Step3:引导用户到Qzone的登录页  
  130.      * @param string $oauth_token 未授权的临时token  
  131.      */  
  132.     function authorize($oauth_token){   
  133.         $str = "HTTP/1.1 302 Found";   
  134.         header($str);   
  135.         $url = $this->C('oauth_authorize_url');   
  136.         $query_strings = http_build_query(array(   
  137.             'oauth_consumer_key'=>$this->C('oauth_consumer_key'),   
  138.             'oauth_token'=>$oauth_token,   
  139.             'oauth_callback'=>$this->C('oauth_callback'),   
  140.         ));   
  141.         header('Location: '.$url.'?'.$query_strings);   
  142.     }   
  143.     /**  
  144.      * Step4:Qzone引导用户跳转到第三方应用  
  145.      * @return bool 验证是否有效   
  146.      */  
  147.     function register_user(){   
  148.         /*  
  149.          * oauth_token  已授权的临时token  
  150.          * openid   腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应  
  151.          * oauth_signature  签名值,方便第三方来验证openid以及来源的可靠性。  
  152.          *      使用HMAC-SHA1算法:  
  153.          *      源串:openid+timestamp(串中间不要添加'+'符号)  
  154.          *      密钥:oauth_consumer_secret  
  155.          * timestamp    openid的时间戳  
  156.          * oauth_vericode   授权验证码。  
  157.          */  
  158.         if($this->check_callback()){   
  159.             //校验签名   
  160.             $signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));   
  161.             if(!empty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){   
  162.                 $_SESSION['oauth_token'] = $_GET['oauth_token'];   
  163.                 $_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];   
  164.                 return;   
  165.             }   
  166.         }   
  167.         //校验未通过   
  168.         exit('UNKNOW REQUEST');   
  169.     }   
  170.     /**  
  171.      * Step5:请求access token   
  172.      */  
  173.     function request_access_token(){   
  174.         $url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(   
  175.             'oauth_token'=>$_SESSION['oauth_token'],   
  176.             'oauth_vericode'=>$_SESSION['oauth_vericode']   
  177.         ),$_SESSION['oauth_token_secret']);   
  178.         return $this->get_contents($url);   
  179.     }   
  180.     /**  
  181.      * Step6:生成access token (保存access token)  
  182.      *   
  183.      * 关于access_token  
  184.      * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。   
  185.      * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。  
  186.      * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。  
  187.      */  
  188.     function save_access_token($access_token_str){   
  189.         parse_str($access_token_str,$access_token_arr);   
  190.         if(isset($access_token_arr['error_code'])){   
  191.             return FALSE;   
  192.         } else {   
  193.             return $access_token_arr;   
  194.         }   
  195.     }   
  196.     /**  
  197.      * 目前腾讯仅开放该API  
  198.      * 获取登录用户信息,目前可获取用户昵称及头像信息。  
  199.      * http://openapi.qzone.qq.com/user/get_user_info  
  200.      */  
  201.     function get_user_info(){   
  202.         $url = $this->build_request_uri($this->C('user_info_url'),array(   
  203.             'oauth_token'=>$_SESSION['oauth_token'],   
  204.             'openid'=>$_SESSION['openid'],   
  205.         ),$_SESSION['oauth_token_secret']);   
  206.         return $this->get_contents($url);   
  207.     }   
  208. }  

转自:http://bbs.phpchina.com/thread-213253-1-1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值