摘要:簡介本篇教程不僅僅是登錄教程,關鍵問題還有解決一個多域名共用一個登錄問題。而騰訊申請登錄時候,并不能把這些二級域名都加入允許的域名列表。畢竟很多情況下還不確定二級域名。
簡介
本篇教程不僅僅是qq登錄教程,關鍵問題還有解決一個多域名共用一個qq登錄問題。
網站做大了,很多網站開始給用戶提供一個二級域名的主頁?;蛘咦约罕旧砭陀泻芏喽売蛎诱尽6v訊申請qq登錄時候,并不能把這些二級域名都加入允許的域名列表。畢竟很多情況下還不確定二級域名。
這個時候,我們也不能申請很多qq登錄,不現實。今天主要就講解下此種情況下的解決方案。
域名轉換解決該問題的一個核心方法就是域名轉換。就是在qq登錄之前,先跳轉到具有qq登錄權限的域名下。讓其幫我獲取信息,之后再跳轉回原域名。
假設我有一個可以qq登錄的域名:bidianer.com。當我處于一個其他域名或者二級域名的時候,假設是weiya.me,這個時候我直接跳轉騰訊,肯定是有問題的。
所以,第一步我先從weiya.me跳轉bidianer.com域名下面的一個方法,然后通過bidianer.com下的方法進行一次跳轉,獲取到code后。跳轉回之前域名weiya.me,同時在url中帶上code,這樣就和從騰訊那里過來的一樣。
這里解釋下為什么拿到code之后萬事大吉。因為,拿到code之后,你獲取用戶信息什么的,騰訊是不限制來源域名的。哪怕你web版本拿到,你到app去請求也沒人管你。
轉換實現 HOST轉換我們這里使用Thinkphp框架實現,因為用的人多,第二個因為簡單,看看猜猜就會了。
由于這個會經常使用,我們放在model里面
新建一個AuthModel.class.php模型,新建一個transferHost轉換的方法
首先確定一個具有qq登錄權限域名。
$open_host = "bidianer.com"; // 開放平臺綁定的域名
第二步,確定當前的域名是否具有登錄權限,如果沒有,我們就跳轉下。
// 確定當前的域名HOST $curr_host = $_SERVER["HTTP_HOST"]; // 當前頁面的域名 // 比較當前域名是否和綁定的域名一致,就是看看是否具有權限而已 if ($curr_host && ($open_host != $curr_host)) { $jump_url = "http://".$open_host."/".$_SERVER["PATH_INFO"]."?backhost=".$curr_host; redirect($jump_url); }
這里好好的講講那個條件判斷,
$curr_host && ($open_host != $curr_host)
這里首先確認獲取到了當前HOST然后和綁定的$open_host比較下,如果當前我們就在bidianer.com,那么不會執行跳轉。否則就會跳轉。
下面我們看下跳轉的鏈接。
"http://".$open_host."/".$_SERVER["PATH_INFO"]."?backhost=".$curr_host;
其中$open_host是開放平臺綁定的域名,也就是具有qq登錄權限的域名,這里是bidianer.com
而域名后面加上的是$_SERVER["PATH_INFO"]也就是還是跳轉到bidianer.com下面的和當前方法一樣的方法。這就需要weiya.me和bidianer.com兩個服務器代碼完全相同。
還有一點,跳轉時候,后面跟著一個參數backhost。他的取值是當前網站的HOST也就是weiya.me。這時為了之后跳轉回來做準備的。所以,我們還需要將該參數保存下來。放入session或者放入qq登錄url的state參數。
補充一點,qq登錄的state參數,你傳過去的值,從qq跳轉回來會原封不動的帶回來。
這里我們給一下完整的轉換代碼
public function transferHost(){ $open_host = "bidianer.com"; // 開放平臺綁定的域名 $curr_host = $_SERVER["HTTP_HOST"]; // 當前頁面的HOST $back_host = I("param.backhost"); // 獲取返回鏈接 if ($curr_host && ($open_host != $curr_host)) { $jump_url = "http://".$open_host."/".$_SERVER["PATH_INFO"]."?backhost=".$curr_host; redirect($jump_url); } $redirect_uri = urlencode("http://bidianer.com/sign/qqCallBack"); // 這里是qq待會跳轉回來的地址,自定義 // 這里是獲取qq登錄地址,直接跳轉去qq了(可以看下面教程) $url = $this->getQQLoginUrl($back_host , $redirect_uri); redirect($url); }獲取qq登錄跳轉鏈接
執行完跳轉操作后,我們現在一定在具有登錄權限的域名下。所以我們獲取qq登錄鏈接準備跳轉騰訊qq。
這個官方很詳細給了文檔,簡單。直接給代碼
/** * 獲取QQ登錄所需要的URL * @param string $back_host 當前所處的實際域名地址,這里是weiya.me。qq跳轉回bidianer.com,還需要跳轉回$back_host * @param string $redirect_uri qq登錄跳轉回來的地址 * @return string */ public function getQQLoginUrl($back_host , $redirect_uri) { $qq_conf = C("QQ_LOGIN");//這里是appid,我寫在配置了,隱私問題也就不寫出來了 $url ="https://graph.qq.com/oauth2.0/authorize"; // 下面內容放入state,如果有back_host,也就是在weiya.me,qq跳轉回后還要再跳一次。如果沒有,那么就說明在bidianer.com $state = $back_host ? base32_encode($back_host) : base32_encode($_SERVER["HTTP_HOST"]); $scope = "get_user_info"; return $url."?response_type=code" . "&client_id=".$qq_conf["APPID"] . "&redirect_uri=".$redirect_uri . "&scope=".$scope . "&state=".$state; }控制器代碼
到這里為止,準備去qq獲取信息的部分就完成了,下面給出controller代碼。其實也就是調用model代碼。
/** * QQ 登錄 */ public function inByQQ() { $this->authModel->transferHost(); }QQ登錄回跳 返回原域名
上面的步奏以后,第一步code信息已經獲取到。我們首先從url中取出state和code。
state:我們之前放入的原域名地址。
code:微信給我們獲取信息的鑰匙。
從qq回來后,我們其實還在bidianer.com的域名下。這個時候我們還要驗證下,原始域名是否是bidianer.com,如果不是,跳轉回原域名。
方法類似之前從原域名跳過來的,只不過反過來而已。所以我們新建方法unTransferHost。反解,不知道這么寫對不對。
/** * 還原域名轉換,從一級域名回轉到之前的二級或者三級域名 * 解決第三方登錄問題,登錄完成后跳回企業域名下 * @return bool */ public function unTransferHost() { $state = I("get.state"); $code = I("get.code"); if ($state) { $host = base32_decode($state); if ($host && ($host != $_SERVER["HTTP_HOST"])) { // 這里記得要帶上code,我們忙這么大一圈就是為了這個code $jump_url = "http://".$host."/".$_SERVER["PATH_INFO"]."?code=".$code; redirect($jump_url); // 返回原域名了 } } // 這邊也放了一份session,不過沒啥鳥用 session("qq_code",$code); return $code; }獲取用戶信息
這個時候,我們從bidianer.com到了weiya.me域名。而且我們也獲取了code。這個時候,我們可以獲取下一步信息了。
下面就簡單了。
我們直接給出控制器代碼。
/** * qq回跳地址 */ public function qqCallBack() { // 這里就是上面的內容,反轉換 $code = $this->authModel->unTransferHost(); $open_info = $this->authModel->getQQUserInfo($code); }
控制器中的getQQUserInfo如下:
/** * 獲取qq綁定用戶的第三方信息 * @param $code * @return array|int */ public function getQQUserInfo($code) { // 這里是封裝的curl請求,相信你都開始做qq登錄開發了,這個肯定會。 $curl = new Curl(); $qq_conf = C("QQ_LOGIN");// appid和key我寫在配置里了,你們要用你們的。 $get_token_url ="https://graph.qq.com/oauth2.0/token?code=".$code."&client_id=".$qq_conf["APPID"]."&client_secret=".$qq_conf["APPKEY"]."&grant_type=authorization_code&redirect_uri=".C("REDIRECT_URI"); $result = $curl->get($get_token_url); parse_str($result, $param); // 連接失敗 if (!$param["access_token"]) { return -1; } $get_opid_url = "https://graph.qq.com/oauth2.0/me?access_token=".$param["access_token"]; $opid = $curl->get($get_opid_url); $opid_param = json_decode(substr(trim($opid), 9, -2), true); // 連接失敗 if (!$opid_param["openid"]) { return -2; } $qq_conf = C("QQ_LOGIN"); $curl = new Curl(); $firstChar = new StringFristChar(); $GLOBALS["CRULOPT_SSL"] = false; // 必須指定 CURL 的 SSL 參數為 false 才能正常使用 QQ 的接口 $url = "https://graph.qq.com/user/get_user_info?openid=".$opid_param["openid"]."&access_token=".$param["access_token"]."&oauth_consumer_key=".$qq_conf["APPID"]; $rst = $curl->get($url); }
獲取到信息后大概是這個樣子:
$qq_info = [ "ret" => 0, "msg" => "", "is_lost" => 0, "nickname" => "嚴穎", "gender" => "男", "province" => "江蘇", "city" => "南京", "year" => "1992", "figureurl" => "http://qzapp.qlogo.cn/qzapp/101218247/BC5B732892966E8FFBD48763B431C2B3/30", "figureurl_1" => "http://qzapp.qlogo.cn/qzapp/101218247/BC5B732892966E8FFBD48763B431C2B3/50", "figureurl_2" => "http://qzapp.qlogo.cn/qzapp/101218247/BC5B732892966E8FFBD48763B431C2B3/100", "figureurl_qq_1" => "http://q.qlogo.cn/qqapp/101218247/BC5B732892966E8FFBD48763B431C2B3/40", "figureurl_qq_2" => "http://q.qlogo.cn/qqapp/101218247/BC5B732892966E8FFBD48763B431C2B3/100", "is_yellow_vip" => "0", "vip" => "0", "yellow_vip_level" => "0", "level" => "0", "is_yellow_year_vip" => "0", ];
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22115.html
摘要:寫在前面本周剛在項目中實現了微信第三方網站掃碼登錄。準備與注意事項微信公眾平臺跟微信開放平臺是兩個不同的平臺,別搞混了。參數在微信開放平臺中查看。 寫在前面 本周剛在項目中實現了微信第三方網站掃碼登錄。因為第一次寫相關項目,所以遇到了很多坑。所以寫這篇文章是希望像我之前那樣的小白也能從容的開發,不要浪費無謂的時間,這篇文章盡量寫的詳細簡單。準備與注意事項 微信公眾平臺跟微信開放平臺是...
摘要:可是,我們的域名有這三個域名僅僅是不同的環境,因此,的跨域名訪問就引出來了。無論是一二級域名,和不同域名下的跨域,無非要達到兩點客戶端訪問同一個所有域名對應的服務器訪問的的數據的位置必須一致。 關閉httponly引起的問題 場景1: 測試A:咦,為什么test環境登錄不了呢? 程序員:清緩存。 測試B:握草,dev也登錄不了。。。誰看看! 程序員:清緩存。 測試們:。。。唉 場景...
摘要:微信年月日發公告稱,個人主體注冊公眾號數量上限由個調整為個。大家都知道每個微信公眾號在進行開發時,授權回調的域名只能設置一個,正常的開發一般一套環境就對應一個域名。 微信2018年11月16日發公告稱,個人主體注冊公眾號數量上限由2個調整為1個。企業類主體注冊公眾號數量上限由5個調整為2個。這個對馬上要注冊公眾號的企業來說頓時心情不好了。 大家都知道每個微信公眾號在進行開發時,授權回調...
摘要:例如要想在多個二級域名中共享,需要設置為頂級域名,這樣就可以在所有二級域名里面或者到這個的值了。頂級域名只能獲取到設置為頂級域名的,設置為其他子級域名的無法獲取。 Cookie和Session詳解 Cookie Cookie只存儲在客服端 Cookie是什么:Cookies是web服務器存放在用戶硬盤的一段文本,Cookies允許一個wen站點在用戶的機器存放一些文本的信息,并可以在以...
閱讀 2655·2021-11-23 09:51
閱讀 1644·2021-11-22 13:54
閱讀 2781·2021-11-18 10:02
閱讀 936·2021-08-16 10:57
閱讀 3554·2021-08-03 14:03
閱讀 1872·2019-08-30 15:54
閱讀 3527·2019-08-23 14:39
閱讀 598·2019-08-23 14:26