摘要:簡(jiǎn)介本篇教程不僅僅是登錄教程,關(guān)鍵問題還有解決一個(gè)多域名共用一個(gè)登錄問題。而騰訊申請(qǐng)登錄時(shí)候,并不能把這些二級(jí)域名都加入允許的域名列表。畢竟很多情況下還不確定二級(jí)域名。
簡(jiǎn)介
本篇教程不僅僅是qq登錄教程,關(guān)鍵問題還有解決一個(gè)多域名共用一個(gè)qq登錄問題。
網(wǎng)站做大了,很多網(wǎng)站開始給用戶提供一個(gè)二級(jí)域名的主頁。或者自己本身就有很多二級(jí)域名子站。而騰訊申請(qǐng)qq登錄時(shí)候,并不能把這些二級(jí)域名都加入允許的域名列表。畢竟很多情況下還不確定二級(jí)域名。
這個(gè)時(shí)候,我們也不能申請(qǐng)很多qq登錄,不現(xiàn)實(shí)。今天主要就講解下此種情況下的解決方案。
域名轉(zhuǎn)換解決該問題的一個(gè)核心方法就是域名轉(zhuǎn)換。就是在qq登錄之前,先跳轉(zhuǎn)到具有qq登錄權(quán)限的域名下。讓其幫我獲取信息,之后再跳轉(zhuǎn)回原域名。
假設(shè)我有一個(gè)可以qq登錄的域名:bidianer.com。當(dāng)我處于一個(gè)其他域名或者二級(jí)域名的時(shí)候,假設(shè)是weiya.me,這個(gè)時(shí)候我直接跳轉(zhuǎn)騰訊,肯定是有問題的。
所以,第一步我先從weiya.me跳轉(zhuǎn)bidianer.com域名下面的一個(gè)方法,然后通過bidianer.com下的方法進(jìn)行一次跳轉(zhuǎn),獲取到code后。跳轉(zhuǎn)回之前域名weiya.me,同時(shí)在url中帶上code,這樣就和從騰訊那里過來的一樣。
這里解釋下為什么拿到code之后萬事大吉。因?yàn)椋玫?b>code之后,你獲取用戶信息什么的,騰訊是不限制來源域名的。哪怕你web版本拿到,你到app去請(qǐng)求也沒人管你。
轉(zhuǎn)換實(shí)現(xiàn) HOST轉(zhuǎn)換我們這里使用Thinkphp框架實(shí)現(xiàn),因?yàn)橛玫娜硕啵诙€(gè)因?yàn)楹?jiǎn)單,看看猜猜就會(huì)了。
由于這個(gè)會(huì)經(jīng)常使用,我們放在model里面
新建一個(gè)AuthModel.class.php模型,新建一個(gè)transferHost轉(zhuǎn)換的方法
首先確定一個(gè)具有qq登錄權(quán)限域名。
$open_host = "bidianer.com"; // 開放平臺(tái)綁定的域名
第二步,確定當(dāng)前的域名是否具有登錄權(quán)限,如果沒有,我們就跳轉(zhuǎn)下。
// 確定當(dāng)前的域名HOST $curr_host = $_SERVER["HTTP_HOST"]; // 當(dāng)前頁面的域名 // 比較當(dāng)前域名是否和綁定的域名一致,就是看看是否具有權(quán)限而已 if ($curr_host && ($open_host != $curr_host)) { $jump_url = "http://".$open_host."/".$_SERVER["PATH_INFO"]."?backhost=".$curr_host; redirect($jump_url); }
這里好好的講講那個(gè)條件判斷,
$curr_host && ($open_host != $curr_host)
這里首先確認(rèn)獲取到了當(dāng)前HOST然后和綁定的$open_host比較下,如果當(dāng)前我們就在bidianer.com,那么不會(huì)執(zhí)行跳轉(zhuǎn)。否則就會(huì)跳轉(zhuǎn)。
下面我們看下跳轉(zhuǎn)的鏈接。
"http://".$open_host."/".$_SERVER["PATH_INFO"]."?backhost=".$curr_host;
其中$open_host是開放平臺(tái)綁定的域名,也就是具有qq登錄權(quán)限的域名,這里是bidianer.com
而域名后面加上的是$_SERVER["PATH_INFO"]也就是還是跳轉(zhuǎn)到bidianer.com下面的和當(dāng)前方法一樣的方法。這就需要weiya.me和bidianer.com兩個(gè)服務(wù)器代碼完全相同。
還有一點(diǎn),跳轉(zhuǎn)時(shí)候,后面跟著一個(gè)參數(shù)backhost。他的取值是當(dāng)前網(wǎng)站的HOST也就是weiya.me。這時(shí)為了之后跳轉(zhuǎn)回來做準(zhǔn)備的。所以,我們還需要將該參數(shù)保存下來。放入session或者放入qq登錄url的state參數(shù)。
補(bǔ)充一點(diǎn),qq登錄的state參數(shù),你傳過去的值,從qq跳轉(zhuǎn)回來會(huì)原封不動(dòng)的帶回來。
這里我們給一下完整的轉(zhuǎn)換代碼
public function transferHost(){ $open_host = "bidianer.com"; // 開放平臺(tái)綁定的域名 $curr_host = $_SERVER["HTTP_HOST"]; // 當(dāng)前頁面的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待會(huì)跳轉(zhuǎn)回來的地址,自定義 // 這里是獲取qq登錄地址,直接跳轉(zhuǎn)去qq了(可以看下面教程) $url = $this->getQQLoginUrl($back_host , $redirect_uri); redirect($url); }獲取qq登錄跳轉(zhuǎn)鏈接
執(zhí)行完跳轉(zhuǎn)操作后,我們現(xiàn)在一定在具有登錄權(quán)限的域名下。所以我們獲取qq登錄鏈接準(zhǔn)備跳轉(zhuǎn)騰訊qq。
這個(gè)官方很詳細(xì)給了文檔,簡(jiǎn)單。直接給代碼
/** * 獲取QQ登錄所需要的URL * @param string $back_host 當(dāng)前所處的實(shí)際域名地址,這里是weiya.me。qq跳轉(zhuǎn)回bidianer.com,還需要跳轉(zhuǎn)回$back_host * @param string $redirect_uri qq登錄跳轉(zhuǎn)回來的地址 * @return string */ public function getQQLoginUrl($back_host , $redirect_uri) { $qq_conf = C("QQ_LOGIN");//這里是appid,我寫在配置了,隱私問題也就不寫出來了 $url ="https://graph.qq.com/oauth2.0/authorize"; // 下面內(nèi)容放入state,如果有back_host,也就是在weiya.me,qq跳轉(zhuǎn)回后還要再跳一次。如果沒有,那么就說明在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; }控制器代碼
到這里為止,準(zhǔn)備去qq獲取信息的部分就完成了,下面給出controller代碼。其實(shí)也就是調(diào)用model代碼。
/** * QQ 登錄 */ public function inByQQ() { $this->authModel->transferHost(); }QQ登錄回跳 返回原域名
上面的步奏以后,第一步code信息已經(jīng)獲取到。我們首先從url中取出state和code。
state:我們之前放入的原域名地址。
code:微信給我們獲取信息的鑰匙。
從qq回來后,我們其實(shí)還在bidianer.com的域名下。這個(gè)時(shí)候我們還要驗(yàn)證下,原始域名是否是bidianer.com,如果不是,跳轉(zhuǎn)回原域名。
方法類似之前從原域名跳過來的,只不過反過來而已。所以我們新建方法unTransferHost。反解,不知道這么寫對(duì)不對(duì)。
/** * 還原域名轉(zhuǎn)換,從一級(jí)域名回轉(zhuǎn)到之前的二級(jí)或者三級(jí)域名 * 解決第三方登錄問題,登錄完成后跳回企業(yè)域名下 * @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,我們忙這么大一圈就是為了這個(gè)code $jump_url = "http://".$host."/".$_SERVER["PATH_INFO"]."?code=".$code; redirect($jump_url); // 返回原域名了 } } // 這邊也放了一份session,不過沒啥鳥用 session("qq_code",$code); return $code; }獲取用戶信息
這個(gè)時(shí)候,我們從bidianer.com到了weiya.me域名。而且我們也獲取了code。這個(gè)時(shí)候,我們可以獲取下一步信息了。
下面就簡(jiǎn)單了。
我們直接給出控制器代碼。
/** * qq回跳地址 */ public function qqCallBack() { // 這里就是上面的內(nèi)容,反轉(zhuǎn)換 $code = $this->authModel->unTransferHost(); $open_info = $this->authModel->getQQUserInfo($code); }
控制器中的getQQUserInfo如下:
/** * 獲取qq綁定用戶的第三方信息 * @param $code * @return array|int */ public function getQQUserInfo($code) { // 這里是封裝的curl請(qǐng)求,相信你都開始做qq登錄開發(fā)了,這個(gè)肯定會(huì)。 $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 參數(shù)為 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); }
獲取到信息后大概是這個(gè)樣子:
$qq_info = [ "ret" => 0, "msg" => "", "is_lost" => 0, "nickname" => "嚴(yán)穎", "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", ];
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22115.html
摘要:寫在前面本周剛在項(xiàng)目中實(shí)現(xiàn)了微信第三方網(wǎng)站掃碼登錄。準(zhǔn)備與注意事項(xiàng)微信公眾平臺(tái)跟微信開放平臺(tái)是兩個(gè)不同的平臺(tái),別搞混了。參數(shù)在微信開放平臺(tái)中查看。 寫在前面 本周剛在項(xiàng)目中實(shí)現(xiàn)了微信第三方網(wǎng)站掃碼登錄。因?yàn)榈谝淮螌懴嚓P(guān)項(xiàng)目,所以遇到了很多坑。所以寫這篇文章是希望像我之前那樣的小白也能從容的開發(fā),不要浪費(fèi)無謂的時(shí)間,這篇文章盡量寫的詳細(xì)簡(jiǎn)單。準(zhǔn)備與注意事項(xiàng) 微信公眾平臺(tái)跟微信開放平臺(tái)是...
摘要:可是,我們的域名有這三個(gè)域名僅僅是不同的環(huán)境,因此,的跨域名訪問就引出來了。無論是一二級(jí)域名,和不同域名下的跨域,無非要達(dá)到兩點(diǎn)客戶端訪問同一個(gè)所有域名對(duì)應(yīng)的服務(wù)器訪問的的數(shù)據(jù)的位置必須一致。 關(guān)閉httponly引起的問題 場(chǎng)景1: 測(cè)試A:咦,為什么test環(huán)境登錄不了呢? 程序員:清緩存。 測(cè)試B:握草,dev也登錄不了。。。誰看看! 程序員:清緩存。 測(cè)試們:。。。唉 場(chǎng)景...
摘要:微信年月日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由個(gè)調(diào)整為個(gè)。大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開發(fā)時(shí),授權(quán)回調(diào)的域名只能設(shè)置一個(gè),正常的開發(fā)一般一套環(huán)境就對(duì)應(yīng)一個(gè)域名。 微信2018年11月16日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由2個(gè)調(diào)整為1個(gè)。企業(yè)類主體注冊(cè)公眾號(hào)數(shù)量上限由5個(gè)調(diào)整為2個(gè)。這個(gè)對(duì)馬上要注冊(cè)公眾號(hào)的企業(yè)來說頓時(shí)心情不好了。 大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開發(fā)時(shí),授權(quán)回調(diào)...
摘要:例如要想在多個(gè)二級(jí)域名中共享,需要設(shè)置為頂級(jí)域名,這樣就可以在所有二級(jí)域名里面或者到這個(gè)的值了。頂級(jí)域名只能獲取到設(shè)置為頂級(jí)域名的,設(shè)置為其他子級(jí)域名的無法獲取。 Cookie和Session詳解 Cookie Cookie只存儲(chǔ)在客服端 Cookie是什么:Cookies是web服務(wù)器存放在用戶硬盤的一段文本,Cookies允許一個(gè)wen站點(diǎn)在用戶的機(jī)器存放一些文本的信息,并可以在以...
閱讀 2666·2021-11-23 09:51
閱讀 1651·2021-11-22 13:54
閱讀 2790·2021-11-18 10:02
閱讀 948·2021-08-16 10:57
閱讀 3563·2021-08-03 14:03
閱讀 1880·2019-08-30 15:54
閱讀 3535·2019-08-23 14:39
閱讀 607·2019-08-23 14:26