咱們如今在各大網站論壇均可以看到點擊一個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代碼以下:
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL,$url);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $result = curl_exec($ch);
- return $result
下面是一個完整的實例,是一個QQ登陸API示範接口,程序爲PHP、具體代碼以下:
- <?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.sunnyi.cn/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);
- }
- }?>