亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP實現QQ快速登錄的方法

2020-03-22 18:34:24
字體:
來源:轉載
供稿:網友
前言:

PHP實現QQ快速登錄,羅列了三種方法

方法一:面向過程,回調地址和首次觸發登錄寫到了一個方法頁面【因為有了if做判斷】,

方法二,三:html' target='_blank'>面向對象

1.先調用登錄方法,向騰訊發送請求,
2.騰訊攜帶本網站唯一對應參數OPENID,ACCESSTOKEN,返回到對應回調頁面,
3.回調頁面接受到騰訊的參數后,通過這個兩個參數,再發出對應的請求,如查詢用戶的數據。
4.騰訊做出對應的操作,如返回這個用戶的數據給你

即使你沒看懂,也沒關系,按照我下面的流程來,保證你可以實現。

前期準備:

使用人家騰訊的功能,總得和人家打招呼吧!

QQ互聯首頁:http://connect.qq.com/

進入網址后,按如下操作來:

一.進入網址

PHP實現QQ快速登錄的方法

二.申請創建【網站】應用

PHP實現QQ快速登錄的方法

三.按要求填寫資料

注意網站地址:填寫你要設置快速登錄的網址,eg:http://www.test.com;

回調地址:填寫你發送QQ快速登陸后,騰訊得給你信息,這個信息往此頁面接受。eg:http://www.test.com/accept_info.php

詳細的申請填寫,請見官方提示,這里不做贅述】

PHP實現QQ快速登錄的方法

四.申請成功后,完善信息

PHP實現QQ快速登錄的方法

最終要求,獲得APP_ID ,APP_KEY

五.代碼部分:

在你對應的PHP文件內寫入,如下
方法一,面向過程法
使用方法:配置$app_id,$app_secret,$my_url后,其他原封復制即可,$user_data為返回的登錄信息
代碼:

//應用的APPID    $app_id = "你的APPID";    //應用的APPKEY    $app_secret = "你的APPKEY";    //【成功授權】后的回調地址,即此地址在騰訊的信息中有儲存    $my_url = "你的回調網址";      //Step1:獲取Authorization Code    session_start();    $code = $_REQUEST["code"];//存放Authorization Code    if(empty($code))    {     //state參數用于防止CSRF攻擊,成功授權后回調時會原樣帶回     $_SESSION['state'] = md5(uniqid(rand(), TRUE));     //拼接URL     $dialog_url = "http://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="     . $_SESSION['state'];     echo("<script> top.location.href='" . $dialog_url . "'</script>");    }      //Step2:通過Authorization Code獲取Access Token    if($_REQUEST['state'] == $_SESSION['state'] || 1)    {     //拼接URL     $token_url = "http://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)      . "&client_secret=" . $app_secret . "&code=" . $code;     $response = file_get_contents($token_url);     if (strpos($response, "callback") !== false)//如果登錄用戶臨時改變主意取消了,返回true!==false,否則執行step3     {      $lpos = strpos($response, "(");      $rpos = strrpos($response, ")");      $response = substr($response, $lpos + 1, $rpos - $lpos -1);      $msg = json_decode($response);      if (isset($msg->error))      {       echo "<h3>error:</h3>" . $msg->error;       echo "<h3>msg :</h3>" . $msg->error_description;       exit;      }     }       //Step3:使用Access Token來獲取用戶的OpenID     $params = array();     parse_str($response, $params);//把傳回來的數據參數變量化     $graph_url = "http://graph.qq.com/oauth2.0/me?access_token=".$params['access_token'];     $str = file_get_contents($graph_url);     if (strpos($str, "callback") !== false)     {      $lpos = strpos($str, "(");      $rpos = strrpos($str, ")");      $str = substr($str, $lpos + 1, $rpos - $lpos -1);     }     $user = json_decode($str);//存放返回的數據 client_id ,openid     if (isset($user->error))     {      echo "<h3>error:</h3>" . $user->error;      echo "<h3>msg :</h3>" . $user->error_description;      exit;     }     //echo("Hello " . $user->openid);     //echo("Hello " . $params['access_token']);       //Step4:使用<span style="font-family: Arial, Helvetica, sans-serif;">openid,</span><span style="font-family: Arial, Helvetica, sans-serif;">access_token來獲取所接受的用戶信息。</span>     $user_data_url = "http://graph.qq.com/user/get_user_info?access_token={$params['access_token']}&oauth_consumer_key={$app_id}&openid={$user->openid}&format=json";           $user_data = file_get_contents($user_data_url);//此為獲取到的user信息     }     else    {      echo("The state does not match. You may be a victim of CSRF.");     }

方法二,面向對象 使用類QQ_LoginAction.class
使用方法:
1.在QQ_LoginAction.class中正確配置 APPID,APPKEY CALLBACK(回調網址)
2.在調用方法中,代碼:

$qq_login = new /Component/QQ_LoginAction();    //引入此類文件即可 $qq_login->qq_login();          //調用登錄方法,向騰訊發出快速登錄請求

3.在回調頁面中,代碼:

$qc = new /Component/QQ_LoginAction(); $acs = $qc->qq_callback();<span style="white-space:pre">    //access_token $oid=$qc->get_openid();<span style="white-space:pre">     //openid $user_data = $qc->get_user_info();<span style="white-space:pre">  //get_user_info()為獲得該用戶的信息,其他操作方法見API文檔

4.$user_data即為返回的用戶數據。
5.QQ_LoginAction.class.php 文件代碼:【用的ThinkPHP3.2】

<?php namespace Component;   session_start(); define('APPID','XXXX');   //appid define('APPKEY','XXXX');  //appkey define('CALLBACK','XXXX');  //回調地址 define('SCOPE','get_user_info,list_album,add_album,upload_pic,add_topic,add_weibo');  //授權接口列表 class QQ_LoginAction {  const GET_AUTH_CODE_URL = "http://graph.qq.com/oauth2.0/authorize";  const GET_ACCESS_TOKEN_URL = "http://graph.qq.com/oauth2.0/token";  const GET_OPENID_URL = "http://graph.qq.com/oauth2.0/me";  private $APIMap = array(   "get_user_info" => array(   //獲取用戶資料    "http://graph.qq.com/user/get_user_info",    array("format" => "json"),   ),   "add_t" => array(    //發布一條普通微博    "http://graph.qq.com/t/add_t",    array("format" => "json", "content","#clientip","#longitude","#latitude","#compatibleflag"),    "POST"  ),   "add_pic_t" => array(    //發布一條圖片微博    "http://graph.qq.com/t/add_pic_t",    array("content", "pic", "format" => "json", "#clientip", "#longitude", "#latitude", "#syncflag", "#compatiblefalg"),    "POST"  ),   "del_t" => array(      //刪除一條微博    "http://graph.qq.com/t/del_t",    array("id", "format" => "json"),    "POST"  ),   "get_repost_list" => array(    //獲取單條微博的轉發或點評列表    "http://graph.qq.com/t/get_repost_list",    array("flag", "rootid", "pageflag", "pagetime", "reqnum", "twitterid", "format" => "json")   ),   "get_info" => array(     //獲取當前用戶資料    "http://graph.qq.com/user/get_info",    array("format" => "json")   ),   "get_other_info" => array(    //獲取其他用戶資料    "http://graph.qq.com/user/get_other_info",    array("format" => "json", "#name-1", "#fopenid-1")   ),   "get_fanslist" => array(    "http://graph.qq.com/relation/get_fanslist", //我的微博粉絲列表    array("format" => "json", "reqnum", "startindex", "#mode", "#install", "#sex")   ),   "get_idollist" => array(    "http://graph.qq.com/relation/get_idollist", //我的微博收聽列表    array("format" => "json", "reqnum", "startindex", "#mode", "#install")   ),   "add_idol" => array(    "http://graph.qq.com/relation/add_idol",  //微博收聽某用戶    array("format" => "json", "#name-1", "#fopenids-1"),    "POST"  ),   "del_idol" => array(   //微博取消收聽某用戶    "http://graph.qq.com/relation/del_idol",    array("format" => "json", "#name-1", "#fopenid-1"),    "POST"  )  );  private $keysArr;  function __construct(){   if($_SESSION["openid"]){    $this->keysArr = array(     "oauth_consumer_key" => APPID,     "access_token" => $_SESSION['access_token'],     "openid" => $_SESSION["openid"]    );   }else{    $this->keysArr = array(     "oauth_consumer_key" => APPID    );   }  }  public function qq_login(){   //-------生成唯一隨機串防CSRF攻擊   $_SESSION['state'] = md5(uniqid(rand(), TRUE));   $keysArr = array(    "response_type" => "code",    "client_id" => APPID,    "redirect_uri" => CALLBACK,    "state" => $_SESSION['state'],    "scope" => SCOPE   );   $login_url = self::GET_AUTH_CODE_URL.'?'.http_build_query($keysArr);   header("Location:$login_url");  }  public function qq_callback(){   //--------驗證state防止CSRF攻擊   if($_GET['state'] != $_SESSION['state']){    return false;   }   //-------請求參數列表   $keysArr = array(    "grant_type" => "authorization_code",    "client_id" => APPID,    "redirect_uri" => CALLBACK,    "client_secret" => APPKEY,    "code" => $_GET['code']   );   //------構造請求access_token的url   $token_url = self::GET_ACCESS_TOKEN_URL.'?'.http_build_query($keysArr);   $response = $this->get_contents($token_url);   if(strpos($response, "callback") !== false){    $lpos = strpos($response, "(");    $rpos = strrpos($response, ")");    $response = substr($response, $lpos + 1, $rpos - $lpos -1);    $msg = json_decode($response);    if(isset($msg->error)){     $this->showError($msg->error, $msg->error_description);    }   }   $params = array();   parse_str($response, $params);   $_SESSION["access_token"]=$params["access_token"];   $this->keysArr['access_token']=$params['access_token'];   return $params["access_token"];  }    public function get_contents($url){   if (ini_get("allow_url_fopen") == "1") {    $response = file_get_contents($url);   }else{    $ch = curl_init();    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);    curl_setopt($ch, CURLOPT_URL, $url);    $response = curl_exec($ch);    curl_close($ch);   }   if(empty($response)){    return false;   }   return $response;  }  public function get_openid(){   //-------請求參數列表   $keysArr = array(    "access_token" => $_SESSION["access_token"]   );   $graph_url = self::GET_OPENID_URL.'?'.http_build_query($keysArr);   $response = $this->get_contents($graph_url);   //--------檢測錯誤是否發生   if(strpos($response, "callback") !== false){    $lpos = strpos($response, "(");    $rpos = strrpos($response, ")");    $response = substr($response, $lpos + 1, $rpos - $lpos -1);   }   $user = json_decode($response);   if(isset($user->error)){    $this->showError($user->error, $user->error_description);   }   //------記錄openid   $_SESSION['openid']=$user->openid;   $this->keysArr['openid']=$user->openid;   return $user->openid;  }    /**   * showError   * 顯示錯誤信息   * @param int $code 錯誤代碼   * @param string $description 描述信息(可選)   */ public function showError($code, $description = '$'){    echo "<meta charset=/"UTF-8/">";    echo "<h3>error:</h3>$code";    echo "<h3>msg :</h3>$description";    exit();  }    /**   * _call   * 魔術方法,做api調用轉發   * @param string $name 調用的方法名稱   * @param array $arg  參數列表數組   * @since 5.0   * @return array   返加調用結果數組   */ public function __call($name,$arg){   //如果APIMap不存在相應的api   if(empty($this->APIMap[$name])){    $this->showError("api調用名稱錯誤","不存在的API: <span style='color:red;'>$name</span>");   }   //從APIMap獲取api相應參數   $baseUrl = $this->APIMap[$name][0];   $argsList = $this->APIMap[$name][1];   $method = isset($this->APIMap[$name][2]) ? $this->APIMap[$name][2] : "GET";   if(empty($arg)){    $arg[0] = null;   }   $responseArr = json_decode($this->_applyAPI($arg[0], $argsList, $baseUrl, $method),true);   //檢查返回ret判斷api是否成功調用   if($responseArr['ret'] == 0){    return $responseArr;   }else{    $this->showError($responseArr['ret'], $responseArr['msg']);   }  }    //調用相應api  private function _applyAPI($arr, $argsList, $baseUrl, $method){   $pre = "#";   $keysArr = $this->keysArr;   $optionArgList = array();//一些多項選填參數必選一的情形   foreach($argsList as $key => $val){    $tmpKey = $key;    $tmpVal = $val;    if(!is_string($key)){     $tmpKey = $val;     if(strpos($val,$pre) === 0){      $tmpVal = $pre;      $tmpKey = substr($tmpKey,1);      if(preg_match("/-(/d$)/", $tmpKey, $res)){       $tmpKey = str_replace($res[0], "", $tmpKey);       $optionArgList[]= $tmpKey;      }     }else{      $tmpVal = null;     }    }    //-----如果沒有設置相應的參數    if(!isset($arr[$tmpKey]) || $arr[$tmpKey] === ""){     if($tmpVal == $pre){      continue;     }else if($tmpVal){//則使用默認的值      $arr[$tmpKey] = $tmpVal;     }else{      $this->showError("api調用參數錯誤","未傳入參數$tmpKey");     }    }    $keysArr[$tmpKey] = $arr[$tmpKey];   }   //檢查選填參數必填一的情形   if(count($optionArgList)!=0){    $n = 0;    foreach($optionArgList as $val){     if(in_array($val, array_keys($keysArr))){      $n++;     }    }    if(!$n){     $str = implode(",",$optionArgList);     $this->showError("api調用參數錯誤",$str."必填一個");    }   }   if($method == "POST"){    $response = $this->post($baseUrl, $keysArr, 0);   }else if($method == "GET"){    $baseUrl=$baseUrl.'?'.http_build_query($keysArr);    $response = $this->get_contents($baseUrl);   }   return $response;  }    public function post($url, $keysArr, $flag = 0){   $ch = curl_init();   if(! $flag) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);   curl_setopt($ch, CURLOPT_POST, TRUE);   curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);   curl_setopt($ch, CURLOPT_URL, $url);   $ret = curl_exec($ch);   curl_close($ch);   return $ret;  } }

方法三,面向對象 使用騰訊給的SDK
使用方法:騰訊SDK,API寫的很詳細,不做贅述
地址:http://wiki.connect.qq.com/%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5%E6%A6%82%E8%BF%B0

這樣就實現了QQ快捷登錄,其實很簡單的,大家可以試一試。
還有什么不清楚的,可以看看官方介紹,更詳細,

Tips:如何在本地測試QQ快速登錄
方法:修改HOST配置文件
1. 打開C:/Windows/System32/drivers/etc/host
2. 添加127.0.0.1 www.test.com
然后操作就可以了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP 。

更多PHP實現QQ快速登錄的方法相關文章請關注PHP !

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品青青大伊人av| 欧美激情a∨在线视频播放| 精品国产91乱高清在线观看| 久久久噜噜噜久噜久久| 国内外成人免费激情在线视频| 亚洲成年网站在线观看| 色综合久久精品亚洲国产| 久久国产精品影视| 精品高清美女精品国产区| 国内外成人免费激情在线视频网站| 欧美一区二区三区免费观看| 亚洲精品国精品久久99热| 日本精品性网站在线观看| 国产精品久久二区| 亚洲精品国产精品国产自| 日韩成人中文电影| 国产成人精品久久二区二区| 国产suv精品一区二区三区88区| 日韩在线播放一区| 欧洲成人免费视频| 国内精品美女av在线播放| 国产亚洲欧洲黄色| 欧美日韩国产第一页| 国产欧美一区二区白浆黑人| 欧美一级黄色网| 国产精品美女无圣光视频| 国产精品激情自拍| 中文字幕视频在线免费欧美日韩综合在线看| 成人av资源在线播放| 成人看片人aa| 久久久久久久久网站| 中文字幕成人精品久久不卡| 亚洲二区中文字幕| 精品一区精品二区| 国产精品视频成人| 国产在线a不卡| 亚洲国产成人精品女人久久久| 成人激情在线播放| 5252色成人免费视频| 日韩av网址在线观看| 亚洲自拍偷拍在线| 欧美色视频日本高清在线观看| 国产成人亚洲综合91精品| 久久精品视频免费播放| 欧美最顶级丰满的aⅴ艳星| 国产精品第2页| 日本免费在线精品| 亚洲国产中文字幕在线观看| 成人在线免费观看视视频| 97精品视频在线| 国产精品久久久久久久久影视| 欧美日韩一区二区三区| 国产有码一区二区| 久久久精品国产亚洲| 欧美福利在线观看| 国产精品入口福利| 亚洲午夜久久久影院| 国产美女久久精品香蕉69| 亚洲人成欧美中文字幕| 欧美精品videos| 亚洲一区二区黄| 欧美噜噜久久久xxx| xvideos亚洲人网站| 欧美日韩国产精品一区| 日韩av中文字幕在线免费观看| 欧美影院久久久| 日韩女优在线播放| 国产欧美一区二区三区在线看| 久久九九国产精品怡红院| 在线亚洲国产精品网| 久久亚洲私人国产精品va| 97久久久免费福利网址| 91爱视频在线| 国产精品久久视频| 亚洲欧美变态国产另类| 久久噜噜噜精品国产亚洲综合| 国产成人综合精品| 大伊人狠狠躁夜夜躁av一区| 成人欧美在线视频| 欧美肥老太性生活视频| 国产美女精品视频免费观看| 北条麻妃久久精品| 91香蕉嫩草神马影院在线观看| 日韩在线不卡视频| 91精品久久久久| 视频在线一区二区| 亚洲欧美一区二区三区情侣bbw| 欧美成人精品一区二区| 欧美黑人xxxx| 精品亚洲男同gayvideo网站| 91大神福利视频在线| 亚洲日韩欧美视频| 国语自产偷拍精品视频偷| 97在线看免费观看视频在线观看| 91久久嫩草影院一区二区| 欧美精品18videosex性欧美| 亚洲欧美激情在线视频| 亚洲色图日韩av| 黑丝美女久久久| 最近2019中文字幕一页二页| 欧美俄罗斯性视频| 欧美精品生活片| 亚洲欧洲美洲在线综合| 精品欧美国产一区二区三区| 九九热r在线视频精品| 国产精品精品一区二区三区午夜版| 欧美一级大胆视频| 2019中文字幕免费视频| 国产日韩欧美在线观看| 亚洲免费人成在线视频观看| 日韩欧美大尺度| 久久激情视频久久| 国产精品入口免费视| 精品一区二区三区四区| 懂色av影视一区二区三区| 国产精品精品视频一区二区三区| 日韩激情视频在线播放| 欧美日韩高清区| 成人av电影天堂| 国内精品久久久久久| 久久精品影视伊人网| www.亚洲男人天堂| 91精品国产综合久久久久久久久| 亚洲一级黄色片| 亚洲美女精品成人在线视频| 欧美在线一级视频| 欧美视频在线观看免费网址| 亚洲精品乱码久久久久久金桔影视| 久久青草福利网站| 国产精品久久久久久av福利| 精品在线小视频| 一区二区三区视频观看| 亚洲自拍中文字幕| 国产精品久久久久秋霞鲁丝| 亚洲精品99久久久久中文字幕| 97国产精品久久| 奇米四色中文综合久久| 日本精品一区二区三区在线| 91大神在线播放精品| 日韩有码在线视频| 精品福利在线视频| 久久精品视频免费播放| 欧美成人免费va影院高清| 亚洲男人av在线| 国产精品对白刺激| 亚洲丝袜在线视频| 久久久国产精品视频| 欧美国产日韩中文字幕在线| 久久成人精品一区二区三区| 亚洲第一中文字幕| 国产欧美精品xxxx另类| 91免费电影网站| …久久精品99久久香蕉国产| 久久免费视频观看| 欧美日韩在线观看视频小说| 成人网欧美在线视频| 亚洲欧美色图片| 欧美在线播放视频| 欧美亚洲另类制服自拍| 97超级碰碰碰久久久| 欧美日韩福利电影| 91在线观看欧美日韩| 久久精品这里热有精品| 国产日韩精品在线播放|