參考網站:
http://blog.163.com/zhaozunjie@126/blog/#m=0 ---這個163的博客,很多ucenter的文章~~~很多php的知識~~~~
http://www.thinkphp.cn/code/1843.html
http://blog.csdn.net/u011771214/article/details/41781643---------ucenter的安裝。里面tp中除了uc的放置位置,都是直接用的;URL只要找到api的上面,里面的uc.php文件名不好更改
http://m.shanmao.me/index.php?s=/Index/acticle/tid/1755-----tp中操作都參考這個,discuz的方向操作不好參考,都直接復制的~~~
https://www.liudon.org/737.html
http://blog.sina.com.cn/s/blog_81827fc70100xaid.html----參考手冊
http://blog.163.com/zhaozunjie@126/blog/static/1398240612010101855623646/----提到的幾點都落實了,ucenter新添加應用的 配置注意問題;
http://blog.csdn.net/lwx2615/article/details/6817071----tp通信老失敗,參考這文章才通信成功的,可以在本地新建一個小項目,
內容不多,調試成功了,可以逐步更改里面的配置,查看哪些和通信成功失敗有關的,小項目不用是tp的;test項目小,沒那么復雜,更改配置也比較容易;
ucenter手冊:
http://m.shanmao.me/index.php?s=/Index/acticle/tid/1755
uc開發接口手冊:
https://www.phpddt.com/manual/ucenter/html/user.htm## ------ ucenter自己網站的手冊都不好下載看的,這里我見過最規范的uc文檔~~~
參考博客和手冊;
1.安裝ucenter ,再安裝discuz
在ucenter里添加應用~~~~安裝配置就不寫了,上面博客都有;
discuz安裝時,注意配置ucenter的url接口。
discuz中應用,ucenter設置的時候,注意url,---我寫成127.。。。的格式的,用域名好像不行~~~(這里測試了很久)
這樣用域名訪問discuz后台,上面欄目ucenter的點擊,左邊邊框還出不來,
用ip方法discuz后台才可以;
也可以直接訪問登錄ucenter,左邊就出來了,不過也左邊不用也行,下面配置都用不到~~~
1.配置,確保通信成功~~~
1.discuz通信:
尤其注意:應用的主 URL:
鏈接到項目里的api前,會自動找uc.php
注意:通信密鑰要和項目中config_ucenter.php中密鑰一致!!!!
define('UC_KEY', 'a845N/eivvBpreT2sfhih7x5q19gvkj4VRNf5T4');//~~~要和項目中一樣;
有時候項目更改了,該文件不會自動更改;----把原來添加的應用刪除再添加,就出現這樣的問題,UC_KEY不會自動更新;
2.配置tp項目:使得tp的通信成功
在ucenter中添加應用:url寫到。。。。/uc (不要斜桿),會自定找api和下面的uc.php.
uc.php從ucenter文件中賦值過來,有$get['action'] $get['time'] 自己配置,如果沒抓取到的時候,設置為test time(),
確保uc.php引用文件路徑都找到---uc.php如果執行有錯誤的話,通信會失敗;
client為ucenter復制過來的;
config.ini.php為ucenter添加應用時候,最下面生成的配置;----后續這里會添加tp項目的配置數據庫,和cookie配置----這個里面數據庫登錄用戶,密碼等配置錯誤,----通信會失敗(具體操作哪個數據庫寫錯倒不會通信失敗)
<?php define('UC_CONNECT', 'mysql'); define('UC_DBHOST', 'localhost'); define('UC_DBUSER', 'root'); define('UC_DBPW', '123456'); define('UC_DBNAME', '******'); define('UC_DBCHARSET', 'utf8'); define('UC_DBTABLEPRE', '`******`.uc_'); define('UC_DBCONNECT', '0'); define('UC_KEY', 'r1QbKaB099Z41b04Q968A715v9P092Pem5Tccah13bwfk021g2l2r740c152CdU5'); define('UC_API', 'http://127.0.0.1/b******/****'); define('UC_CHARSET', 'utf-8'); define('UC_IP', ''); define('UC_APPID', '8'); define('UC_PPP', '20'); /*discuz表格 前綴 photos登錄discuz從ucenter用戶表中抓取插入用戶信息~~*/ define('DISCUZ_DANAME','*****'); define('DISCUZ_DBRRE','pre_'); //同步登錄 Cookie 設置 $cookiedomain = 'local.****.****.net'; // cookie 作用域, 這里前面不能加http://,否則區域無效~~~,這個是uc.php接受鏈接來設置自己項目用的;這里填寫所在羡慕的域名~~ $cookiepath = '/'; // cookie 作用路徑 $dbhost = 'localhost'; // 數據庫服務器 $dbuser = 'root'; // 數據庫用戶名 $dbpw = '****'; // 數據庫密碼 $dbname = '****'; // 數據庫名 $pconnect = 0; // 數據庫持久連接 0=關閉, 1=打開 $tablepre = 'tf_'; // 表名前綴, 同一數據庫安裝多個論壇請修改此處 $dbcharset = 'utf8'; // MySQL 字符集, 可選 'gbk', 'big5', 'utf8', 'latin1', 留空為按照論壇字符集設定
include 中有一個mysql的類文件,ucenter中賦值過來的;
url寫到discuz,會自動去找api下的uc.php文件的;
config/config_ucenter.php文件中賦值,添加應用時,配置信息;
(client文件夾,可以從ucenter文件夾里復制過來``)
2.tp登錄,確保discuz也登錄~~同步登錄,同步修改用戶信息
tp這注冊:確保ucenter也有數據查入,如果通信成功,配置好的話是這樣的:
//ucenter注冊操作;~~~需要事務嗎 $uc_uid = uc_user_register($username, $password);//~~這里email不填寫~~~后台屏蔽了驗證; if($uc_uid <= 0) { if ($uc_uid == -1) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,用戶名不合法'); $json->Send(); } elseif ($uc_uid == -2) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,包含要允許注冊的詞語'); $json->Send(); } elseif ($uc_uid == -3) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,用戶名已經存在於平台上'); $json->Send(); } elseif ($uc_uid == -4) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,Email 格式有誤'); $json->Send(); } elseif ($uc_uid == -5) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,Email 不允許注冊'); $json->Send(); } elseif ($uc_uid == -6) { $json->setErr('0','已注冊成功,用戶同步到平台出錯,Email 已經被注冊'); $json->Send(); } else { $json->setErr('0','已注冊成功,用戶同步到平台出錯,未定義'); $json->Send(); } }
默認注冊只會玩uc數據庫中插入數據,但這樣,discuz中第一次登錄要激活,discuz用戶表中才會有數據,才可以登錄;---我們把配置改了,確保注冊,discuz表中的數據就上去~~
uc_client/module/user.php
參考博客:http://blog.csdn.net/iastro/article/details/52587643
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') { $regip = empty($regip) ? $this->base->onlineip : $regip; $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); //added begin~~~discuz 數據表格攔截激活,先插入數據;~~~注意:這里如果ucenter已經加入了數據,discuz不會放入數據;(調試開發中會有這樣漏洞) $discuz_dbname = DISCUZ_DANAME; $discuz_table_pre = DISCUZ_DBRRE; $table_info = $discuz_dbname.'.'.$discuz_table_pre; $this->db->query("INSERT INTO ".$table_info."common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'"); $this->db->query("INSERT INTO ".$table_info."common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'"); $this->db->query("INSERT INTO ".$table_info."common_member_profile SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_field_forum SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_field_home SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'"); //added end return $uid; }
注意user_add 的這個寫法,ucenter里面如果已經有數據,就不管discuz中是否有數據,都不會再往里面放數據了~~調試的時候注意;
note:phpmyadmin,左側邊欄,展示數據表名是有限的,不一定會把所有的表格都展示出來,一開始,我看博客上有的表格是多余的,就沒有添加~~~~點擊dbname才會看到所有的表格,discuz的表格還是多的,都展開,瀏覽器不下拉都展示不了~~~~大概3 4頁才都出來!!
這里用到2個常量,都是在config中定義的,discuz的表格名稱和前綴~~~注意配置好了~~~
//2.ucenter實現登錄~~~ //通過接口判斷登錄帳號的正確性,返回值為數組 list($uc_login_uid,$uc_login_username,$uc_login_password,$uc_login_email) = uc_user_login(trim($_POST['username']), trim($_POST['password'])); if ($uc_login_uid > 0){ //生成同步登錄的代碼 js代碼。后面輸出。 $ucsynlogin = uc_user_synlogin($uc_login_uid); $json->setAttr('ucsynlogin',$ucsynlogin); }elseif($uc_login_uid == '-1'){ $json->setErr('0','已登錄成功,用戶同步登錄到平台用戶不存在'); $json->Send(); }elseif($uc_login_uid == '-2'){ $json->setErr('0','已登錄成功,用戶同步登錄到平台密碼錯誤'); $json->Send(); }else{ $json->setErr('0','已登錄成功,用戶同步登錄平台錯誤未知'); $json->Send(); }
$ucsynlogin----輸出結果:
<script type="text/javascript" src="http://*******/discuz/api/uc.php?time=1503386589&code=c204c7bZe5hxoHmlwYe1yZKG8K7%2BbQ6VfvKT%2BPYYefGurOrZC9kQ1Oqqmibu%2BVcnnYcAK33phDTiTNYpxmegxjufcJqUiITmdm8nIMdPLJxpr8%2FEKABCg0PFmB9eW8f%2BKGL34e%2B8ptlG%2Bu%2BgJOOwupKl9b0%2BbNA1XJ0uxSfoyPhiZw" reload="1"></script>
<script type="text/javascript" src="http://local.photos.net/uc/api/uc.php?time=1503386589&code=66d11oXbvKbQptWZHTxzl8Y2lm64U1addkNVaiiMtUFMddxDfYq2Qax4NEenOBsRTxkstHkm86T5zTDyoMJwEEQw%2Fm6UsLTPvRgGpycynPowSA9ABBSnM5Ir7iaxJhUnW1K0styUM2gSLOimsPyy7ZqS000dvlx%2BpgxjY8b%2FqNpMjw" reload="1"></script>
確保里面鏈接,復制到瀏覽器可以正常實現~~~把這個script標簽append到html頁面,可以實現,遠程刷新,設置cookie~~~
修改用戶密碼,確保同步
修改用戶名,確保同步userrename沒有封裝好的方法可以直接用,我是自己構建方法,類似add_user,直接把uc discuz數據一起改了。
3.discuz登錄,確保tp也登錄~~~(discuz中的script代碼沒抓取出來,未實現,把discuz登錄都攔截到tp項目中登錄)
config_global.php配置cookiedomain cookiepath
apps.php 配置。
最后沒實現,而是把discuz注冊,登錄,攔截到tp項目中去的,這樣減少不少用戶信息沖突~~~
(ucenter安裝好discuz后,discuz 文件中的config配置,注意:同步discuz登錄,需要修改discuz的cookie配置,該文件超級管理才有編輯權限~~~)
需要多用戶登錄~~~配置好apps.php ,這個是從ucenter文件中獲取的,從ucenter/data/cache/apps.php,同步登錄,這里必須最少數組內2個內容;
tp中是session登錄的,discuz中script的src傳遞的是cookie全局設置的方法,需要把cookie的值判斷再賦值給session,就可以了。注意:退出銷毀2個;
2.discuz登錄,tp如何可以和discuz也同步登錄;
(見另外一個文章)