国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

多個(gè)不同域名共用一個(gè)QQ登錄實(shí)例教程

hikui / 1407人閱讀

摘要:簡(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.mebidianer.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中取出statecode

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

相關(guān)文章

  • python實(shí)現(xiàn)微信第三方網(wǎng)站掃碼登錄(Django)

    摘要:寫在前面本周剛在項(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)是...

    lemanli 評(píng)論0 收藏0
  • yii2中session跨域名的問題

    摘要:可是,我們的域名有這三個(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)景...

    rollback 評(píng)論0 收藏0
  • 企業(yè)只能申請(qǐng)兩個(gè)微信公眾號(hào),微信開發(fā)不夠用?不,一個(gè)公眾號(hào)就夠了!

    摘要:微信年月日發(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)...

    wthee 評(píng)論0 收藏0
  • Cookie和Session詳解

    摘要:例如要想在多個(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ī)器存放一些文本的信息,并可以在以...

    Little_XM 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<