QQ登陸集成到本身網站php代碼(轉載)

咱們如今在各大網站論壇均可以看到點擊一個QQ圖標就能夠利用本身的QQ號在網站進行登陸了,下面我來告訴你一段QQ登陸集成到本身網站php代碼,有須要的朋友可參考.php

1.打開open.qq.com 添加建立應用:-》輸入常規的數據,你會看到對應的APP ID和KEY值,這是對你身份證的惟一的驗證.html

2.打開 http://connect.qq.com/manage/ 點擊->添加網站->輸入相關信息,這裏比較特別注意的是,回調地址那裏填上你域名就能夠了以上申核須要一到兩天時間,耐心等待.web

3.打開 http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5 找到SDK庫下載,我在這裏下載是官方的php SDK包,若是你的虛擬空間file_get_contents不技持https,能夠考慮用curl函數來替代,好多童鞋經常由於獲取不到access_token也就是這個緣由,任何一個包不是一鼓作氣了,還需你配置相關的配置,這個繁索的調試過程我就在這裏展開談了,說說原理->經過你的網站登錄QQ state和scope->得到access_token->再得到每一個QQ惟一的身份ID openid.算法

4.在這裏你調試成功後,得到ID後,還需和你當前網站賬號綁定,才能下次登錄的時候自動去識別你的相關綁定賬號內容.json

常見問題:api

1.Warning: session_start() [function.session-start]: open(/tmpsess_s9b1ahi6vnvc0pfl2e0dcd0l10, O_RDWR) failed: 解決方法:No such file or directory (2) inD:powhostbbcarblogwebtestqqSDKcommsession.php on line 196cookie

找到sssion.php session_save_path 加上註釋//,註釋掉設置路徑session

2.Notice: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? inD:powhostbbcarblogwebtestqqSDKcommutils.php on line 37app

解決方法:curl

找到 Utils.php  function get_url_contents 函數內容直接用下面代碼替代,由於file_get_content默認不支持訪問https,若是要支持需配置php.ini,激活 php_openssl.dll 模塊,這個你們百度配置一下即可,php代碼以下:

  1. $ch = curl_init();     
  2. curl_setopt($ch, CURLOPT_URL,$url);     
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);     
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     
  6. $result = curl_exec($ch);     
  7. return $result 

下面是一個完整的實例,是一個QQ登陸API示範接口,程序爲PHP、具體代碼以下:

  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.sunnyi.cn/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(!emptyempty($_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. }?> 
相關文章
相關標籤/搜索