discuz與其它應用程序通訊成功後,該應用程序就能夠與discuz進行數據的交互了。javascript
如今就來看看應用程序和discuz的同步註冊和同步登陸(確認項目中已經引用了discuz接口)。
php
1.在UC_Demo項目中添加一個Web窗體Register.aspx,在頁面中添加以下代碼:html
<div> 用戶名:<asp:textbox runat="server" id="txtUserName"> </asp:textbox><br/> 密碼:<asp:textbox runat="server" id="txtPassword"> </asp:textbox><br/> <asp:button ID="btnRegiter" runat="server" text=" 註冊 " OnClick="btnRegiter_Click"/> </div>
2.註冊按鈕的click事件代碼以下:java
protected void btnRegiter_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtUserName.Text) || string.IsNullOrEmpty(txtPassword.Text)) { Response.Write("請輸入完整信息"); return; } //生成一個email,註冊時要用到 string email = string.Format("{0}@test.com", (new Guid(DateTime.Now.ToString())).ToString()); IUcClient ucClient = new UcClient(); UcUserRegister registResult = ucClient.UserRegister(txtUserName.Text, txtPassword.Text, email); if (registResult.Result == RegisterResult.Success && registResult.Uid != 0) { Response.Write("註冊成功"); } else { switch (registResult.Result) { case RegisterResult.UserNameExists: Response.Write("用戶名已存在"); break; case RegisterResult.UserNameIllegal: Response.Write("用戶名非法"); break; case RegisterResult.ContainsInvalidWords: Response.Write("包含非法字符"); break; case RegisterResult.EmailHasBeenRegistered: case RegisterResult.EmailNotAllowed: case RegisterResult.IncorrectEmailFormat: Response.Write("email異常"); break; default: Response.Write("其它異常"); break; } } }
3.輸入用戶名和密碼,點擊註冊,結果如圖所示。git
其實,在上面的代碼中有一個問題,是關於字符串編碼的。若是在用戶名一欄輸入「哈哈」或其它中文字符,那麼第一個中文字符會註冊成功 ,其它在後面註冊的中文字符都沒法註冊成功。使用管理員帳戶登陸bbs.test.com,進入UCenter中的用戶管理,咱們會發現根本就找不到一個名爲「哈哈」的用戶,只有一個用戶名爲空的用戶,如圖。
數據庫
可是,若是從新使用英文字符註冊,又沒有問題了。這就說明中文字符在傳遞給UCenter的時候亂碼了,因此,在把用戶名傳入ucClient.Register方法進行註冊時,要先改變它的編碼格式。c#
UcUserRegister registResult = ucClient.UserRegister(Server.UrlEncode(txtUserName.Text), txtPassword.Text, email);
而後再輸入中文用戶名進行註冊,就會註冊成功。如圖。api
在註冊時,關於這個用戶名還有一個長度限制,最小長度爲3,最大長度爲15。若是它跟本身主站設定的長度不想符的話,這個能夠在源碼裏進行改動。這個改動的地方會有不少,具體可參考http://wenku.baidu.com/view/b176a0d476eeaeaad1f33097.html,這其中包括了源碼的修改和數據庫的修改。瀏覽器
下面就要來進行同步登陸了。在UC_Demo中添加一個Web窗體Login.aspx,頁面代碼以下:cookie
<div> 用戶名:<asp:textbox runat="server" id="txtUserName"> </asp:textbox> <br/> 密碼:<asp:textbox runat="server" id="txtPassword"> </asp:textbox> <br/> <asp:button ID="btnLogin" runat="server" text=" 登陸 " OnClick="btnLogin_Click" style="height: 21px"/> </div>
登陸按鈕的click事件代碼以下:
protected void btnLogin_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtUserName.Text) || string.IsNullOrEmpty(txtPassword.Text)) { Response.Write("請輸入完整信息"); return; } IUcClient ucClient = new UcClient(); UcUserLogin loginResult = ucClient.UserLogin(Server.UrlEncode(txtUserName.Text), txtPassword.Text, LoginMethod.UserName); if (loginResult.Result == LoginResult.Success) { string js = ucClient.UserSynlogin(loginResult.Uid); Response.Write(js); } else { switch (loginResult.Result) { case LoginResult.NotExist: Response.Write("用戶不存在"); break; case LoginResult.PassWordError: Response.Write("密碼錯誤"); break; case LoginResult.QuestionError: Response.Write("問題錯誤"); break; default: Response.Write("其它異常"); break; } } }
注意在登陸時,並非調用了ucClient.UserLogin方法就行的,它只是告訴了UCenter要登陸,把用戶信息取出來,而後再使用 ucClient.UserSynlogin進行異步登陸,它會產生script標籤,要把這個script標籤寫入瀏覽器中。script標籤的內容格式以下:
<script type="text/javascript" src="http://bbs.test.com/api/uc.php?time=1418547640&code=e56f91uiBKKLjTuj27uZAjI7UDND609%2FpdF7wtoQDq9%2BYNReIBmAdOxkKm2MAjg6OfHt0cFSANdqH7BGuUPQ5ymBdZVzW0NGqoasFVjhfQLEAe40F56rVKeUZWRGKYtVIulEPwENBrADJKB6%2BsSWRmOHOE6HhCX8dv17" reload="1"></script><script type="text/javascript" src="http://www.uctest.com/api/uc.ashx?time=1418547640&code=e56fg6ke0oi0iDvapMNK9ze%2F8ffcc1u2G8kv8snofrLUMN5fwgZ2GDcU340IczkpYMpTf%2FWzH2R9lq0NIIKhlvbX6v30f2VPoS7aZMfp%2F7QPjpGVRSW0tIZjwuMertt2sBIFlokLcWtVH%2Bfy%2Fvs8ge6sAeoNFa78gznM" reload="1"></script>
具體產生script標籤的個數與和UCenter進行通訊的應用的個數有關。因此uc.ashx就是用在script標籤請求成功時作相應的處理。
輸入剛剛註冊的用戶信息,進行登陸,而後進入bbs.test.com,卻發現並無登陸成功,這是爲何呢?打開bbs.test.com,直接用這個用戶信息進行登陸,會出現以下狀況。
原來是這個用戶要先進行激活,否則無法登陸。這裏有一個解決方法能夠省去激活這一步,仍是要修改源碼。找到bbs根目錄下/api/uc.php,用記事本打開,找到synlogin這個function,把該方法替換爲如下代碼:
function synlogin($get, $post) { global $_G; if(!API_SYNLOGIN) { return API_RETURN_FORBIDDEN; } header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); $cookietime = 31536000; $uid = intval($get['uid']); $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'"); if ($member = DB::fetch($query)) { dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); }else { $username = $get['username']; $query = DB::query("SELECT uid, username, password, email FROM ".DB::table('ucenter_members')." WHERE username='$username'"); $member = DB::fetch($query); $password = $member['password']; $email = $member['email']; $ip = $_SERVER['REMOTE_ADDR']; $time = time(); $userdata = array( 'uid'=>$uid, 'username'=>$username, 'password'=>$password, 'email'=>$email, 'adminid'=>0, 'groupid'=>10, 'regdate'=>$time, 'credits'=>0, 'timeoffset'=>9999 ); DB::insert('common_member', $userdata); $status_data = array( 'uid' => $uid, 'regip' => $ip, 'lastip' => $ip, 'lastvisit' => $time, 'lastactivity' => $time, 'lastpost' => 0, 'lastsendmail' => 0 ); DB::insert('common_member_status', $status_data); DB::insert('common_member_profile', array('uid' => $uid)); DB::insert('common_member_field_forum', array('uid' => $uid)); DB::insert('common_member_field_home', array('uid' => $uid)); DB::insert('common_member_count', array('uid' => $uid)); DB::query('UPDATE '.DB::table('common_setting')." SET svalue='$username' WHERE skey='lastmember'"); $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'"); if ($member = DB::fetch($query)) { dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); } } }
而後咱們再把新註冊帳戶進行同步登陸時,就不用激活了。如圖所示爲新註冊用戶同步登陸後的頁面。
參考資料:http://www.cnblogs.com/CoreCaiNiao/archive/2011/08/25/2153434.html