摘要:微博登錄是最常用的第三方賬號(hào)登錄之一。當(dāng)前狀態(tài)是未提交審核,待你開(kāi)發(fā)完了上線后,提交微博審核,審核通過(guò)后即可正常使用。集成微博登錄首先簡(jiǎn)介一下,第三方登錄開(kāi)發(fā)的流程。文件是首頁(yè),其實(shí)他的唯一作用就是產(chǎn)生一個(gè)微博登錄跳轉(zhuǎn)鏈接。
微博登錄是最常用的第三方賬號(hào)登錄之一。由于其網(wǎng)站用戶量大,可操作接口功能多,所以受到很多開(kāi)發(fā)者的青睞。
既然是第三方,如果想使用它們的賬號(hào)進(jìn)行登錄,那么第一步就應(yīng)該申請(qǐng)一個(gè)開(kāi)發(fā)賬號(hào)。
前面啰嗦兩句,這里有兩個(gè)條件是硬性的,否則將影響你的開(kāi)發(fā)。
微博賬號(hào),這個(gè)應(yīng)該都有。
域名和服務(wù)器,也就是說(shuō)你要有你自己的網(wǎng)站。不過(guò)為公司開(kāi)發(fā)就方便多了。
申請(qǐng)開(kāi)發(fā)賬號(hào)首先去微博開(kāi)放平臺(tái):http://open.weibo.com/connect,點(diǎn)擊立即接入,填寫(xiě)一個(gè)表單,驗(yàn)證一下網(wǎng)站就OK了
之后你在我的應(yīng)用里面就可以看到你申請(qǐng)的應(yīng)用。當(dāng)前狀態(tài)是未提交審核,待你開(kāi)發(fā)完了上線后,提交微博審核,審核通過(guò)后即可正常使用。(未審核之前只能是測(cè)試賬號(hào)訪問(wèn))
到這一步為止,我們就可以先進(jìn)行開(kāi)發(fā)工作。進(jìn)入網(wǎng)站信息頁(yè)面,首先獲取我們需要的app_id和secret信息。
下面我們進(jìn)入開(kāi)發(fā),我們這里使用YII2框架,高級(jí)版本。其他框架原理相同。
YII2集成微博登錄首先簡(jiǎn)介一下,第三方登錄開(kāi)發(fā)的流程。
通過(guò)填入各項(xiàng)參數(shù),生成一個(gè)URL鏈接,跳轉(zhuǎn)到微微博。
微博驗(yàn)證完這些參數(shù)有效之后,跳轉(zhuǎn)回你給定的返回地址,同時(shí)帶上一個(gè)參數(shù)code
你獲取到code參數(shù)后,用code作為參數(shù),請(qǐng)求一個(gè)地址,獲取token
該token就是你的鑰匙,拿著它你可以獲取微博的所有可訪問(wèn)接口。(比如獲取用戶信息,獲取用戶ID),所以要收好了,我們把它放session
下面就是你自己網(wǎng)站業(yè)務(wù)邏輯了。
1、新建數(shù)據(jù)表第一步,我們來(lái)建立網(wǎng)站常用的業(yè)務(wù)數(shù)據(jù)表,來(lái)開(kāi)發(fā)賬號(hào)綁定功能。我們需要兩張表。
用戶表CREATE TABLE `br_user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_nickname` varchar(30) NOT NULL, `user_password` varchar(80) NOT NULL, `user_email` varchar(255) NOT NULL, `auth_key` varchar(128) DEFAULT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `USEREMAIL` (`user_email`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT="用戶信息表";第三方賬號(hào)表
CREATE TABLE `br_open_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "微信登錄id", `open_id` varchar(64) NOT NULL COMMENT "第三方登錄的open_id", `user_id` int(11) NOT NULL COMMENT "網(wǎng)站用戶ID", `nickname` varchar(300) NOT NULL COMMENT "第三方用戶昵稱", `type` tinyint(1) NOT NULL DEFAULT "1" COMMENT "1:微博", `create_time` int(11) unsigned NOT NULL COMMENT "創(chuàng)建時(shí)間", PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8;
用戶表沒(méi)什么好說(shuō)的,我們說(shuō)一下第三方信息表。
open_id是第三方登錄時(shí)候給你的一個(gè)用戶唯一標(biāo)識(shí),不會(huì)改變。
user_id為你自己網(wǎng)站的用戶ID,這樣可以把本站用戶和第三方賬號(hào)關(guān)聯(lián)了起來(lái)。
nickname這個(gè)字段看需求,一般存放第三方用戶昵稱,而本站的用戶昵稱還是存在用戶表,這樣假設(shè)用戶不想用第三方昵稱,可以隨意修改而也保留第三方昵稱。
type的作用重點(diǎn)是,你網(wǎng)站可能不止使用一個(gè)第三方登錄,比如微博,qq,微信,這樣我們做個(gè)區(qū)分。
2、整合代碼開(kāi)發(fā)之前,我們要先去微博官網(wǎng)下載一個(gè)SDK來(lái)加速我們的開(kāi)發(fā)。畢竟人家都寫(xiě)好了,拿來(lái)用比較方便。
下載下來(lái)大概長(zhǎng)這個(gè)樣子:
其中saetv2.ex.class.php是他的核心文件,其他文件基本都是輔助作用。
index.php文件是首頁(yè),其實(shí)他的唯一作用就是產(chǎn)生一個(gè)微博登錄跳轉(zhuǎn)鏈接。
config.php是一些配置文件,就是你剛剛從官網(wǎng)申請(qǐng)來(lái)的app_id之類的
callback.php是你跳轉(zhuǎn)到微博后,它再跳轉(zhuǎn)回來(lái)的一個(gè)地址。
weibolist.php是授權(quán)成功后,你獲取到他的微博列表的一個(gè)demo
這個(gè)文件夾文件可以直接放在網(wǎng)站根目錄訪問(wèn),不過(guò)我們不準(zhǔn)備這樣做,我們要把他們拆分了,直接集成到Y(jié)II
首先針對(duì)config.php文件,這個(gè)也最簡(jiǎn)單,我們打開(kāi)它,發(fā)現(xiàn)只有幾行代碼。
其實(shí)就是配置了app_id,app_secret,callback我們把他們?nèi)拥結(jié)ii配置文件params.php
"weibo"=>[ "app_key"=>"你的app_key", "app_secret"=>"你的app_secret", "back_url"=>"你的回跳地址,比如:http://www.bidianer.com/login/weibo-back(這是我的)" ],下面我們看下,saetv2.ex.class.php,打開(kāi)后我們發(fā)現(xiàn),這個(gè)文件里面有兩個(gè)類,為了便于開(kāi)發(fā),我們將其拆分成為2個(gè)文件存放。第一個(gè)文件存放靠上面的類,第二個(gè)文件存放靠下面的類。同時(shí),我們將其拷貝到Y(jié)ii2目錄vendor/yiisoft/yii2/web,這個(gè)隨自己喜歡。
我們將拆分后的文件命名為SaeAuth.php和SaeTClientV2.php,類名同文件名。同時(shí)加上命名空間yii web(這里反斜杠打不出來(lái))。
3、控制器開(kāi)發(fā)下面我們來(lái)到控制器開(kāi)始做真正開(kāi)發(fā)工作。
1、新建LoginController.php,在init方法中,我們將配置信息加載過(guò)來(lái):
$this->app_key = Yii::$app->params["weibo"]["app_key"]; $this->app_secret = Yii::$app->params["weibo"]["app_secret"]; $this->back_url = Yii::$app->params["weibo"]["back_url"];2、新建登錄首頁(yè)index方法,同時(shí)生成微博跳轉(zhuǎn)鏈接
$sea = new SaeAuth($this->app_key , $this->app_secret); $weibo_url = $sea->getAuthorizeURL($this->back_url);在此之前你需要 use yii web SaeAuth(這里反斜杠打不出來(lái))
3、接下來(lái)我們新建weibo-back方法來(lái)處理微博回跳后處理。
獲取微博返回參數(shù)code
$code = Yii::$app->request->get("code");獲取token
$sea = new SaeAuth($this->app_key , $this->app_secret); if ($code) { $keys = array(); $keys["code"] = $code; $keys["redirect_uri"] = $this->back_url; try { $token = $sea->getAccessToken( "code", $keys ) ; } catch (Exception $e) { throw new NotFoundHttpException; } }下面如果獲取token成功,我們就將其放入session存起來(lái),留著后面用
if ($token) { $session = Yii::$app->session; $session["token"] = [ "access_token"=>$token["access_token"], "uid"=>$token["uid"], "lifetime"=> 24*3600 // 這里我設(shè)置了一天,你們可以自己設(shè)置合適時(shí)間 ]; $this->redirect(Url::toRoute("/login/complete-info")); }為啥我們不在這個(gè)頁(yè)面處理其他邏輯?因?yàn)椋?b>code不能重復(fù)利用,啥意思?就是在這個(gè)頁(yè)面:http://www.bidianer.com/login/weibo-back?code=XXXX你不能刷新,否則微博就給你個(gè)錯(cuò)誤。所以我們拿到code獲取token,就趕緊放session跑路,到其他頁(yè)面,慢慢弄。
4、完善用戶信息
下面我們到一個(gè)關(guān)鍵步奏了,這個(gè)方法主要做兩件事,判斷用戶是否綁定賬號(hào),如果沒(méi)有,顯示表單,補(bǔ)全信息綁定。如果綁定了,OK,直接自動(dòng)登錄,跳走。
下面先進(jìn)行簡(jiǎn)單的一步:檢測(cè)用戶是否綁定賬號(hào)。
之前br_open_info表有個(gè)字段叫open_id這是微博給你的一個(gè)用戶唯一識(shí)別碼,而且不會(huì)變。下次第三方請(qǐng)求后,我們可以從微博獲取這個(gè)open_id去數(shù)據(jù)庫(kù)查詢一下,如果存在,則用戶已經(jīng)綁定過(guò)。反之,未綁定。
我們session中放著token,我們可以利用它去獲取用戶唯一ID
$token = Yii::$app->session->get("token"); $c = new SaeTClientV2( $this->app_key , $this->app_secret , $token["access_token"] ); $uid_get = $c->get_uid(); $uid = $uid_get["uid"];下面在common/models中新建OpenInfo.php,直接調(diào)用查詢:
$open_user = OpenInfo::findOne(["open_id"=>$uid , "type"=>"1"]); // 其中 type = 1 代表微博。如果存在,則說(shuō)明用戶已經(jīng)綁定賬號(hào),直接自動(dòng)登錄。
if($open_user) { $user = User::findOne($open_user->user_id); // 當(dāng)open_info信息存在,則直接取其user_id去用戶表查詢用戶信息 Yii::$app->user->login($user, 3600 * 24 * 30); $this->goHome(); }如果沒(méi)有綁定,我們獲取用戶基本信息,展示用戶補(bǔ)全信息表單,填寫(xiě)綁定賬號(hào)。
$user_message = $c->show_user_by_id( $uid);//根據(jù)ID獲取用戶等基本信息 return $this->render("completeInfo",["info"=>$user_message]);我們到completeInfo視圖打印下用戶信息:
還是非常詳細(xì)的。啥都有。
我們把用戶頭像展示在表單頂端,幫助用戶自動(dòng)填寫(xiě)昵稱(用微博昵稱),讓用戶填寫(xiě)下郵箱和密碼,補(bǔ)全資料,然后提交,綁定賬號(hào)。
4、用戶注冊(cè)這樣用戶設(shè)置完郵箱和密碼后,就可以注冊(cè)。這里的注冊(cè)和你網(wǎng)站賬號(hào)注冊(cè)流程一致。
不過(guò)在這里提交表單時(shí)候,我們需要多提交一些信息,我們把這些信息放在表單隱藏域中。
" /> // 頭像 " /> // 微博用戶唯一識(shí)別碼 " /> // 微博用戶昵稱這樣當(dāng)用戶插入到br_user表之后,我們將本地用戶賬號(hào)和第三方用戶賬號(hào)關(guān)聯(lián)。即在br_open_info表插入一條數(shù)據(jù)。
注冊(cè)代碼
$user = new User(); $user->setPassword($post["user_password"]); $user->generateAuthKey(); $user->user_nickname = $post["user_nickname"]; $user->user_email = $post["user_email"]; $user->user_headimg = isset($post["user_headimg"])? $post["user_headimg"] : null; $user->save();注冊(cè)成功后,我們將獲得user_id
5、賬號(hào)綁定下面進(jìn)行賬號(hào)綁定
$open = new OpenInfo(); $open->open_id = $post["open_id"]; $open->user_id = $user->user_id; $open->nickname = $post["open_nickname"]; $open->type = 1; // type=1為微博 $open->create_time = time(); if($open->validate()) { $open->save(); }下次當(dāng)該用戶再次點(diǎn)擊微博登錄按鈕,就會(huì)執(zhí)行以下操作
跳轉(zhuǎn)到微博獲取code,回跳到網(wǎng)站頁(yè)面
通過(guò)code獲取token,將token放入session
通過(guò)token獲取微博用戶open_id
通過(guò)open_id去第三方用戶信息表br_open_info查詢
如果發(fā)現(xiàn)有記錄,則根據(jù)br_open_info表存儲(chǔ)的user_id去br_user表獲取用戶信息
自動(dòng)登錄,直接跳轉(zhuǎn)走
整個(gè)過(guò)程用戶無(wú)需輸入任何賬號(hào)密碼信息,十分便捷。
嚴(yán)穎 2016-09-28
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30510.html
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來(lái)的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問(wèn)后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開(kāi)發(fā)而生,讓開(kāi)發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來(lái)的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問(wèn)后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開(kāi)發(fā)而生,讓開(kāi)發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
摘要:多入口模式,多入口分為后臺(tái)前端,微信,其他或接口對(duì)接,不同的業(yè)務(wù)不同的設(shè)備進(jìn)入不同的入口。對(duì)接微信公眾號(hào),使用了一款優(yōu)秀的微信非官方,系統(tǒng)內(nèi)已集成了該,調(diào)用方式會(huì)在文檔說(shuō)明,也可直接看其文檔進(jìn)入深入開(kāi)發(fā)。 RageFrame 為二次開(kāi)發(fā)而生,讓開(kāi)發(fā)變得更簡(jiǎn)單。 前言 RageFrame項(xiàng)目創(chuàng)建于2016年4月16日,基于Yii2框架開(kāi)發(fā)的應(yīng)用開(kāi)發(fā)引擎,目前正在成長(zhǎng)中,目的是為了集成更多...
閱讀 2943·2021-09-22 15:20
閱讀 3026·2021-09-22 15:19
閱讀 3576·2021-09-22 15:15
閱讀 2490·2021-09-08 09:35
閱讀 2433·2019-08-30 15:44
閱讀 3075·2019-08-30 10:50
閱讀 3865·2019-08-29 16:25
閱讀 1655·2019-08-26 13:55