ThinkPHP與UCenter整合詳解

最近應(yīng)公司的要求,要開發(fā)一個(gè)有點(diǎn)像QQ空間那樣的會員管理中心網(wǎng)站,發(fā)現(xiàn)UCenter的很多功能酷似QQ空間,于是選擇了UCenter作為程序的會員管理中心。
前臺嘛就選擇我之前基于ThinkPHP3.1.2框架開發(fā)的WBlog好了涩馆。但是問題又來了:要求在WBlog前臺注冊的會員登錄時(shí)要與UCenter同步,這就是我這次要解決的問題--ThinkPHP與UCenter的整合行施。
我在網(wǎng)上搜索了一下,ThinkPHP與UCenter的整合并不少,但是似乎越看越覺得頭暈,不是少這就是少那,到頭來差之毫厘,謬以千里,真夠折騰的。
我仔細(xì)閱讀了UCenter的開發(fā)文檔后,經(jīng)過多次的調(diào)試,終于完成了ThinkPHP與UCenter的整合魂那。感覺這個(gè)結(jié)果是從苦水里泡出來的一樣,呵呵蛾号。⊙难牛∠式幔現(xiàn)在把整合的記錄分享給需要的童鞋。

溫馨提示:在thinphp與UCenter整合中,您需要的基本條件是,有一定的PHP基礎(chǔ),對ThinkPHP框架有所了解,會布署目錄和配置數(shù)據(jù)活逆。

好了,我們開始吧!


下載并安裝下面的程序

  • WBlog3.1.2
  • UCenter_Home_2.0_SC_UTF8
  • UCenter 1.6.0

安裝WBlog博客程序

已發(fā)布的WBlog博客程序還沒有會員中心,本次測試的會員中心是后面才寫的精刷。如果你能等的話要待我整理好WBlog的會員中心程序才發(fā)布,不能等的話也不會影響下面的程序整合,因?yàn)槟憧梢哉一蛘咦约簩懞唵蔚臐M足以下兩個(gè)條件的thikphp程序:

  • 1、可以注冊會員
  • 2蔗候、可以登錄和退出怒允。

這里我就使用WBlog3.1.2了。在服務(wù)器的根目錄新建目錄wblog1,把下載的WBlog3.1.2解壓得到的WBlog目錄里的所有文件復(fù)制到wblog1琴庵。在瀏覽器輸入http://127.0.0.1/wblog1/install/,安裝WBlog3.1.2误算。

溫馨提示:在整合時(shí)最容易搞錯(cuò)的就是路徑問題,在接下來的整合操作的根目錄都是指wblog1目錄,所以要和服務(wù)器根目錄區(qū)別開來。

安裝UCenter 1.6.0(簡體UTF-8)

這個(gè)程序到官方去下載吧迷殿。在網(wǎng)站根目錄wblog1新建 ucenter 目錄,解壓UCenter 1.6.0,把解壓得到的upload目錄里的所有文件復(fù)制到剛才新建的ucenter目錄里儿礼。在瀏覽器輸入http://127.0.0.1/wblog1/ucenter/install/,安裝UCenter 1.6.0。

安裝UCenter_Home_2.0_SC_UTF8(簡體中文版)

在網(wǎng)站根目錄wblog1新建 uh目錄并解壓UCenter_Home_2.0_SC_UTF8,把解壓得到的upload目錄里的所有文件復(fù)制到剛才新建的uh目錄里庆寺。在瀏覽器輸入http://127.0.0.1/wblog1/uh/install/,安裝UCenter_Home_2.0_SC_UTF8蚊夫。

需要注意的是,安裝UCenter 1.6.0和UCenter_Home_2.0_SC_UTF8時(shí)順序不能顛倒,否則無法安裝。


我們安裝完了WBlog3.1.2懦尝、UCenter_Home_2.0_SC_UTF8和UCenter 1.6.0三個(gè)程序后知纷。
接下來找到下載的UCenter 1.6.0,把 advanced 目錄里面的uc_client 和 examples下面的api 文件夾復(fù)制到網(wǎng)站根目錄wblog1下,和ThinkPHP在同一目錄。
找到項(xiàng)目W3note的配置文件夾wblog1/ Conf/,在其新建一個(gè)UCenter的配置文件 config_ucenter.php ,然后在WBlog1\W3note\Lib\ORG目錄下新建一個(gè)UCenter的通訊處理類文件UcService.class.php,我們先不要管文件里面寫什么代碼,后面將會講到陵霉。
好了到這里已經(jīng)把后面要操作的目錄和文件都布局好了琅轧。為了理清目錄和文件之間的層次關(guān)系,我把目錄和文件制成目錄樹列出來:
wblog1根目錄
| – index.php//前臺入口文件
| – admin.php
| – W3note//前臺項(xiàng)目
| | – Lib
| | | – ORG
| | | | –UcService.class.php //UCenter的通訊處理類文件
| | – Conf//W3note項(xiàng)目的配置目錄
| | | –config_ucenter.php //UCenter的配置文件
| |
| – Admin
| – ThinkPHP //thinkphp3.1.2核心包和一些擴(kuò)展
| – install
| – api
| | – uc.php
|
| – uc_client
| – ucenter
| – uh
這樣我們就可以一目了然了。
現(xiàn)在開始api目錄里面的uc.php 配置了,首先打開這個(gè)文件,找到36行的位置這一行代碼

require_once DISCUZ_ROOT.'./config.inc.php';

把'./config.inc.php'這一部分替換成'./W3note/Conf/config_ucenter.php'
往下找還會看到幾處的'./config.inc.php',按照上面的操作全部替換掉踊挠。這樣做目的是把前面建的配置文件config_ucenter.php導(dǎo)進(jìn)來乍桂。
接下來我登錄http://127.0.0.1/wblog1/ucenter,在打開左邊菜單“應(yīng)用管理”這一項(xiàng),然后添加一個(gè)新應(yīng)用,這時(shí)我們發(fā)現(xiàn)好多東西要填!
照著下面操作就是了。先看應(yīng)用類型,因?yàn)檫@是我們自己開發(fā)的程序,所以就選其它吧,再看應(yīng)用名稱,隨便填,只要不超過20字節(jié)就行了,我這里填wblog。
接下來是應(yīng)用的主URL,這里填網(wǎng)站的主頁http;//127.0.0.1/wblog1,注意了,后面沒有“/”睹酌。至于應(yīng)用的其他URL還有應(yīng)用IP這兩項(xiàng)就跳過,不用管它了权谁。
接下來是通信密鑰,就按其旁邊的提示填就是了,我這里填abc123456。往下是應(yīng)用的物路徑,提示說默認(rèn)為空,那就留空吧,還有查看個(gè)人資料頁面地址也留空吧憋沿。
接下來是應(yīng)用接口文件名稱,默認(rèn)為uc.php,保持原狀吧旺芽。繼續(xù)往下看,標(biāo)簽單條顯示模板還有標(biāo)簽?zāi)0鍢?biāo)記說明這兩項(xiàng)也不用理它,跳過。
是否開啟同步登錄,選是;是否接受通知也選是吧辐啄。終于填完了,那就點(diǎn)擊提交吧!
還記得前面在uc.php導(dǎo)入的文件config_ucenter.php嗎,里面可是一片空白啊,現(xiàn)在我們就來放些配置信息進(jìn)去采章。
剛才我們填好的信息提交后,會在提交按鈕下面的“應(yīng)用的UCenter配置信息”下面生成了一些配置信息,我們直接把它復(fù)制,然后粘帖到config_ucenter.php,保存。
網(wǎng)上很多教程到這里就表示通信成功了,在這里我非常驚訝!因?yàn)橥ㄐ挪⑽闯晒?我在這里折騰了一些時(shí)間,后來仔細(xì)檢了uc.php文件的代碼,發(fā)現(xiàn)59行:

require_once DISCUZ_ROOT.'./include/db_mysql.class.php';

我在布局的目錄中始終找不到db_mysql.class.php,后來發(fā)現(xiàn)db_mysql.class.php存UCenter_1.6.0_SC_UTF8\advanced\examples\include目錄中,這就是問題所在!因?yàn)槲覀冎皬?fù)制的只是UCenter_1.6.0_SC_UTF8\advanced\examples\中的api文件则披。
解決這一問題的辦法就是把上面的代碼修改為

require_once DISCUZ_ROOT.'./uc_client/lib/db.class.php';

導(dǎo)入的數(shù)據(jù)庫類文件變了,那么我們也要對其所涉及的內(nèi)容作相應(yīng)的修改,在uc.php59行的下面如

$GLOBALS['db'] = new dbstuff;
$GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
$GLOBALS['tablepre'] = $tablepre;
修改為
$GLOBALS['db'] = new ucclient_db;
$GLOBALS['db']->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCONNECT, true, UC_DBCHARSET);
$GLOBALS['tablepre'] = UC_DBTABLEPRE;//關(guān)鍵

上面數(shù)據(jù)庫的鏈接信息的靜態(tài)變量來自config_ucenter.php挨约。
好了,我們回到后臺ucenter刷新一下頁面,發(fā)現(xiàn)什么---通信成功了!
那么接下來我們的目標(biāo):
在thinkphp中會員注冊成功時(shí),UCenter Home也同時(shí)注冊成功桐磁。
首先在項(xiàng)目W3note入口文件index.php配置一個(gè)常量

define('WBLOG_ROOT_PATH', rtrim(dirname(__FILE__), '/\\') . DIRECTORY_SEPARATOR);//物理根目錄

常量WBLOG_ROOT_PATH是網(wǎng)站根目錄wblog1的物理根目錄,在我本地服務(wù)器打印輸出:
D:\phpsever\apache2\htdocs\wblog1
有必要在這里強(qiáng)調(diào)一下,理解WBLOG_ROOT_PATH很重要,因?yàn)樵谡{(diào)試過程中路徑最容易出錯(cuò)宽档。
還記得前面我們建的UcService.class.php 文件嗎?如果忘記了請看一下前面的目錄樹票渠。打開UcService.class.php文件,新建一個(gè)類UcService,然后寫一個(gè)構(gòu)造方法導(dǎo)入W3note/Conf/config_ucenter.php和uc_client/client.php兩個(gè)文件。代碼:

class UcService{
public function __construct(){
include_once(WBLOG_ROOT_PATH . 'W3note/Conf/config_ucenter.php');
include_once(WBLOG_ROOT_PATH . 'uc_client/client.php');
}

接下來我們寫一個(gè)會員注冊方法register,如

public function register($username, $password, $email){}

方法體放什么代碼呢?其實(shí)很簡單,因?yàn)閁Center的開發(fā)文檔已經(jīng)為我們準(zhǔn)備好了!
找到之前下載的UCenter_1.6.0_SC_UTF8,用瀏覽器打開UCenter_1.6.0_SC_UTF\advanced\document\index.htm,然后在左邊的菜單欄找到“用戶接口”,看到用戶注冊示例 (PHP),把其下的代碼復(fù)制過來阱洪。如下

/**
* 會員注冊
*/
public function register($username, $password, $email){
$uid = uc_user_register($username, $password, $email);//UCenter的注冊驗(yàn)證函數(shù)
if($uid <= 0) {
if($uid == -1) {
return '用戶名不合法';
} elseif($uid == -2) {
return '包含不允許注冊的詞語';
} elseif($uid == -3) {
return '用戶名已經(jīng)存在';
} elseif($uid == -4) {
return 'Email 格式有誤';
} elseif($uid == -5) {
return 'Email 不允許注冊';
} elseif($uid == -6) {
return '該 Email 已經(jīng)被注冊';
} else {
return '未定義';
}
} else {
return intval($uid);//返回一個(gè)非負(fù)數(shù)
}
}
}

這個(gè)注冊方法register的作用是,在wblog1的會員注冊中成功注冊一個(gè)會員時(shí),也會成功注冊UCenter Home的會員中心中便贵。UCenter的注冊方法我們在上面已經(jīng)寫好了,現(xiàn)在回到thinkphp。我們在前臺W3note項(xiàng)目的控制器MemberAction寫一個(gè)注冊方法,代碼如下:

/*
用戶名:$username,
密碼:$password,
郵箱:$email
*/
public function addmember(){
if($this->isPost()){
$username = $_POST['username'];
$email = $_POST['email'];
$password = trim($_POST['password']);
import("@.ORG.UcService");//導(dǎo)入U(xiǎn)cService.class.php類
$ucService = new UcService;//實(shí)例化UcService類
$uid = $ucService->register($username, $password, $email);//注冊到UCenter
if($uid){//如果上面注冊成功將返回一個(gè)int類型的數(shù)字
$M = D('Member');
if ($vo = $M->create()) {
if ($M->add()) {
$this->success('注冊成功!');
} else {
$this->error('注冊失敗!');
}
} else {
$this->error();
}
}else{
exit($uid);
}
}else{
$this->error('非法數(shù)據(jù)!');
}
}

我們在thinkphp會員注冊頁面注冊一個(gè)帳號,提交表單后,查看wblog1和UCenter的會員數(shù)據(jù)表,發(fā)現(xiàn)兩張表都存相同的帳號,說明同步注冊已經(jīng)成功了!
有了帳號我們就可以來做同步登錄了冗荸。
打開UcService.class.php文件,添加一個(gè)UC登錄和一個(gè)登出的方法,代碼到UCenter接口開發(fā)手冊的用戶接口那里找用戶登錄示例代碼,把它復(fù)制過來,然后稍微更改一下,使其帶有返回值,以便下一步的操作,代碼如下:

public function uc_login($username, $password){
list($uid, $username, $password, $email) = uc_user_login($username, $password);
if($uid > 0) {
return array(
'uid' => $uid,
'username' => $username,
'password' => $password,
'email' => $email
);
} elseif($uid == -1) {
return '用戶不存在,或者被刪除';
} elseif($uid == -2) {
return '密碼錯(cuò)誤';
} elseif($uid == -3) {
return '安全提問錯(cuò)誤';
} else {
return '未定義';
}
}

繼續(xù)在用戶接口那里找到同步登錄的代碼示例,找到“uc_user_synlogin($uid);”其作用是執(zhí)行同步登錄,然后寫成uc_synlogin方法如下:

public function uc_synlogin($uid){
return uc_user_synlogin($uid);
}

到這里UcService.class.php文件的登錄方法已經(jīng)寫好,接下來打開前臺W3note項(xiàng)目的控制器MemberAction.class.php文件寫一個(gè)同步登錄的方法,看代碼:

public function checkLogin() {
if(!$_POST['username']) $this->error('帳號錯(cuò)誤!');
if(!$_POST['password']) $this->error('密碼錯(cuò)誤!');
if(empty($_POST['verify'])) $this->error('驗(yàn)證碼必須!');
import("@.ORG.UcService");//導(dǎo)入U(xiǎn)cService.class.php類
$ucService = new UcService;
$uidarray = $ucService->uc_login($_POST['username'], $_POST['password']);
//dump($uidarray);
$loginurl=$ucService->uc_synlogin($uidarray);
echo $loginurl;//輸出同步登錄代碼,否則無法同步登錄
if(!is_string($uidarray)){
//生成認(rèn)證條件
$map = array();
// 支持使用綁定帳號登錄
$map['username'] = $_POST['username'];
$map["status"] = array('gt',0);
if($_SESSION['verify'] != md5($_POST['verify'])) {
$this->error('驗(yàn)證碼錯(cuò)誤!');
}
$memberinfo=$this->Member->where($map)->find();
if(false === $memberinfo) {
$this->error('帳號不存在或已禁用!');
}elseif($memberinfo['status']==0){
$this->error('帳號已禁用!');
}else {
$password = pwdHash($_POST['password']);
if($memberinfo['password'] != $password) {
$this->error('密碼錯(cuò)誤!');
}
session(C('USER_AUTH_KEY'), $memberinfo['id']);
session('email', $memberinfo['email'] );
session('loginUserName', $memberinfo['loginUserName']);
session('lastLoginTime', $memberinfo['lastLoginTime']);
session('loginnum', $memberinfo['loginnum']);
session('lastloginip', $memberinfo['lastloginip']);
//保存登錄信息(相當(dāng)于更新信息)
$data = array();
$data['id'] = $memberinfo['id'];
$data['lastlogintime'] = time();
$data['loginnum'] = array('exp','loginnum+1');
$data['lastloginip'] = get_client_ip();
//$data['verify'] = $authInfo['verify'];
$this->Member->save($data);
$this->success('登錄成功!',U('Member/index'));
}
}
}

我們來看一下checkLogin()方法的執(zhí)行過程承璃。
在項(xiàng)目W3note注冊的一個(gè)帳號,然后在項(xiàng)目W3note提交登錄表單后,首先執(zhí)行UCenter的登錄,前面我們寫了兩個(gè)UCenter的登錄方法,在調(diào)用之前需要使用“import("@.ORG.UcService");”把UcService.class.php文件加載進(jìn)來,實(shí)例化后得到$ucService,然后就可以使用用$ucService訪問UCenterr的登錄方法uc_login,返回一個(gè)$uidarray值,$uidarray包函什么數(shù)據(jù)?使用“dump($uidarray);”打印出來,以便下一步的操作,打印結(jié)果如下:

array(4) {
["uid"] => string(1) "1"
["username"] => string(5) "qqabc"
["password"] => string(6) "123456"
["email"] => string(9) "qq@qq.com"
}

下一步就是以此$uidarray作為參數(shù)傳給同步登錄方法uc_synlogin($uidarray),最后echo 一下uc_synlogin($uidarray)的返回值$loginurl,就可以實(shí)現(xiàn)帳號"qqabc"在UCenter登錄了。帳號"qqabc"在UCenter登錄成功后程序?qū)⒗^續(xù)往下執(zhí)行項(xiàng)目W3note的登錄,這里就不多說了蚌本。最后的結(jié)果是,帳號"qqabc"實(shí)現(xiàn)了在UCenter和項(xiàng)目W3note的同步登錄!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盔粹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子程癌,更是在濱河造成了極大的恐慌舷嗡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嵌莉,死亡現(xiàn)場離奇詭異进萄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锐峭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門中鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沿癞,你說我怎么就攤上這事援雇。” “怎么了椎扬?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵熊杨,是天一觀的道長曙旭。 經(jīng)常有香客問我,道長晶府,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任钻趋,我火速辦了婚禮川陆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛮位。我一直安慰自己较沪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布失仁。 她就那樣靜靜地躺著尸曼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萄焦。 梳的紋絲不亂的頭發(fā)上控轿,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音拂封,去河邊找鬼茬射。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冒签,可吹牛的內(nèi)容都是我干的在抛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼萧恕,長吁一口氣:“原來是場噩夢啊……” “哼刚梭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起票唆,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤朴读,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惰说,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磨德,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年吆视,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了典挑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啦吧,死狀恐怖您觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情授滓,我是刑警寧澤琳水,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布肆糕,位于F島的核電站,受9級特大地震影響在孝,放射性物質(zhì)發(fā)生泄漏诚啃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一私沮、第九天 我趴在偏房一處隱蔽的房頂上張望始赎。 院中可真熱鬧,春花似錦仔燕、人聲如沸造垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽五辽。三九已至,卻和暖如春外恕,著一層夾襖步出監(jiān)牢的瞬間杆逗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工吁讨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓迎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓建丧,卻偏偏與公主長得像排龄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子翎朱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容