整合ec和ucenter

最近在做一個電子商務網站,需要在上面掛一個論壇,discuz無疑是最佳的選擇,自然就得需要實現ecshop與discuz的同步登陸,否則空掛一個論壇在上面毫無意義。同步登陸不僅方便用戶,也能很好的黏住用戶和統一管理用戶數據。好在之前研究過Ucenter的通信原理,所以實現起來還是比較有底氣的,不過還是花了幾天的時間才搞定。下面就談談ecshop和discuz的整合過程,整合過程中出現的問題及解決方法。
  ecshop也是康盛的產品,同步登陸的東西有些文件已經存在,所以相對於整合非康盛的產品來說要稍微容易一些,但實現的方法是一致的。廢話不多說,直接進入主題。1.安裝ecshop和discuz,我用的ecshop版本大概是2.7,discuz選擇的是x1.5,這個地方得注意編碼的一致,否則後面會出錯。2.將discuz中的uc_client整個文件夾直接copy到ecshop根目錄下。3.進入ecshop後臺->會員整合->安裝Ucenter,這一步比較簡單,一般不會出什麼問題。這三步完成後去discuz的ucenter後臺->應用管理中查看ecshop和discuz是否已經通信成功。這三步完成後似乎就可以了,其實不然,還差得遠呢。我總結一下自己整合過程中出現的幾個問題及解決方法:(1)通信失敗;(2)通信成功,但是ecshop和discuz不能同步登陸;(3)ecshop新註冊的用戶到discuz登陸需要激活;(4)ecshop新註冊的用戶不能同步登陸到discuz;(5)discuz註冊的用戶不能同步登陸到ecshop;(6)在ecshop登陸或註冊的用戶,在discuz退出後,不能同步退出到ecshop。解決方法:(1)查看Ucenter後臺->應用管理,頂部提示如果通信失敗嘗試修改Ucenter的IP地址,進去一看IP是127.0.0.1果然有問題,直接去掉,問題解決。(2)通信成功但是不能同步登陸,用FF的firebug跟蹤請求發現根本沒有同步登陸的請求,而且還報錯:Bad Request,Invalid HostName,百思不得其解,果斷百度一下發現是discuz後臺->站長->Ucenter設置中IP地址是127.0.0.1,直接去掉,但是還不能同步登陸,跟蹤discuz同步登陸的代碼發現$_G['setting']['allowsynlogin']是0,但是Ucenter應用管理中明明已經開啓同步登陸,於是想到可能是緩存的原因,去discuz後臺更新緩存,結果同步登陸終於OK。(3)跟蹤同步登陸代碼發現ecshop新註冊的用戶只存放到Ucenter中,激活之後纔會寫入到pre_common_member中,同時dsetcookie。這個問題的解決方法很明顯即增加對pre_common_member及pre_common_member_count的寫入(該文件爲discuz下的api目錄中的uc.php)。

1 if($member = DB::fetch($query)) {
2     dsetcookie('auth', authcode("$member[password]\t$member[uid]"'ENCODE'),$cookietime);
3 }else{//非激活狀態下寫入
4     $query = DB::query("SELECT email FROM ".DB::table('ucenter_members')." WHERE uid='$uid'");
5     if($a = DB::fetch($query)){
6         $email $a['emaiil'];
7     }else{
8         $email '';
9     }
10     $userdata array(
11         'uid' $get['uid'],
12         'username' $get['username'],
13         'password' $get['password'],
14         'email' $email,
15         'adminid' = 0,
16         'groupid' = 10,
17         'regdate' $get['time'],
18         'credits' = 0,
19         'timeoffset' = 9999
20     );
21     DB::insert('common_member'$userdata);
22     DB::insert('common_member_count'array('uid'=>$get['uid']));
23     dsetcookie('auth', authcode("$get[password]\t$get[uid]"'ENCODE'), $cookietime);
24 }

加完之後此問題解決。(4)因爲之前研究過Ucenter通信的原理,所以該問題的第一反應就是ecshop註冊完後沒有調用同步登陸的代碼,於是找到ecshop註冊文件user.php在註冊代碼後面加上:

1 $user->login($username,$password);$ucdata = isset($user->ucdata) ?  $user->ucdata : '';

問題順利解決。(5)該問題跟(4)一樣的道理,也是在註冊文件member_register.php中增加同步登陸的調用:

1 $synlogin $_G['setting']['allowsynlogin'] ? uc_user_login($_G['uid']) : '';

這個地方需要注意:一定要在註冊模板register.htm中輸出$synlogin,因爲這個返回值其實就是一段js腳本(發同步登陸的通知),需要放到頁面中才能執行。該問題也順利得到解決。(6)這個問題比較怪異,在ecshop登陸後只能在ecshop同步退出,在discuz則不能,而如果在discuz登陸,在ecshop和discuz均能同步退出。用firebug查看cookie發現從discuz退出的時候cookie也已經清空,但就是不能在ecshop同步退出,困惑之下只能google,按照上面的一個說法在清空cookie時增加第四個cookie路徑參數,問題果然得到解決,看來操作cookie的時候真的得注意cookie的路徑及域。
  以上就是自己在整合ecshop和discuz時的過程,遇到的問題及解決方法,看到此文並且有這個需要的童鞋希望能幫到你的一點小忙。PS:技術文章真的不好寫,每個地方都得仔細斟酌,生怕寫錯了誤導到別人,不過疏漏有時候在所難免,如果發現有錯誤之處還望指正。

聲明: 本文由( 張林 )原創編譯,轉載請保留鏈接: ecshop與discuz的整合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章