天天看點

ThinkPHP3.1.2整合UCenter詳解(四)

本文轉自:http://www.thinkphp.cn/topic/1557.html

有了帳号我們就可以來做同步登入了。

打開UcService.class.php檔案,添加一個UC登入和一個登出的方法,代碼到UCenter接口開發手冊的使用者接口那裡找使用者登入示例代碼,把它複制過來,然後稍微更改一下,使其帶有傳回值,以便下一步的操作,代碼如下:

  1. public function uc_login($username, $password){
  2. list($uid, $username, $password, $email) = uc_user_login($username, $password);
  3.  if($uid > 0) {
  4.  return array(
  5.  'uid' => $uid,
  6.  'username' => $username,
  7.  'password' => $password,
  8.  'email' => $email
  9.  );
  10.  } elseif($uid == -1) {
  11.  return '使用者不存在,或者被删除';
  12.  } elseif($uid == -2) {
  13.  return '密碼錯誤';
  14.  } elseif($uid == -3) {
  15.  return '安全提問錯誤';
  16.  } else {
  17.  return '未定義';
  18.  }
  19.  }

複制代碼 繼續在使用者接口那裡找到同步登入的代碼示例,找到“uc_user_synlogin($uid);”其作用是執行同步登入,然後寫成uc_synlogin方法如下:

  1. public function uc_synlogin($uid){
  2.  return uc_user_synlogin($uid);
  3.  }

複制代碼 到這裡UcService.class.php檔案的登入方法已經寫好,接下來打開前台W3note項目的控制器MemberAction.class.php檔案寫一個同步登入的方法,看代碼:

  1. public function checkLogin() {
  2.  if(!$_POST['username']) $this->error('帳号錯誤!');
  3.  if(!$_POST['password']) $this->error('密碼錯誤!');
  4.  if(empty($_POST['verify'])) $this->error('驗證碼必須!');
  5.  import("@.ORG.UcService");//導入UcService.class.php類
  6. $ucService = new UcService;
  7. $uidarray = $ucService->uc_login($_POST['username'], $_POST['password']);
  8.  //dump($uidarray);
  9. $loginurl=$ucService->uc_synlogin($uidarray);
  10. echo $loginurl;//輸出同步登入代碼,否則無法同步登入
  11.  if(!is_string($uidarray)){
  12.  //生成認證條件
  13. $map = array();
  14.  // 支援使用綁定帳号登入
  15. $map['username'] = $_POST['username'];
  16. $map["status"] = array('gt',0);
  17.  if($_SESSION['verify'] != md5($_POST['verify'])) {
  18. $this->error('驗證碼錯誤!');
  19.  }
  20. $memberinfo=$this->Member->where($map)->find();
  21.  if(false === $memberinfo) {
  22. $this->error('帳号不存在或已禁用!');
  23.  }elseif($memberinfo['status']==0){
  24. $this->error('帳号已禁用!');
  25.  }else {
  26. $password = pwdHash($_POST['password']);
  27.  if($memberinfo['password'] != $password) {
  28. $this->error('密碼錯誤!');
  29.  }
  30. session(C('USER_AUTH_KEY'), $memberinfo['id']);
  31. session('email', $memberinfo['email'] );
  32. session('loginUserName', $memberinfo['loginUserName']);
  33. session('lastLoginTime', $memberinfo['lastLoginTime']);
  34. session('loginnum', $memberinfo['loginnum']);
  35. session('lastloginip', $memberinfo['lastloginip']);
  36.  //儲存登入資訊(相當于更新資訊)
  37. $data = array();
  38. $data['id'] = $memberinfo['id'];
  39. $data['lastlogintime'] = time();
  40. $data['loginnum'] = array('exp','loginnum+1');
  41. $data['lastloginip'] = get_client_ip();
  42.  //$data['verify'] = $authInfo['verify'];
  43. $this->Member->save($data);
  44. $this->success('登入成功!',U('Member/index'));
  45.  }
  46.  }
  47.  }

複制代碼 我們來看一下checkLogin()方法的執行過程。

在項目W3note注冊的一個帳号,然後在項目W3note送出登入表單後,首先執行UCenter的登入,前面我們寫了兩個UCenter的登入方法,在調用之前需要使用“import("@.ORG.UcService");”把UcService.class.php檔案加載進來,執行個體化後得到$ucService,然後就可以使用用$ucService通路UCenterr的登入方法uc_login,傳回一個$uidarray值,$uidarray包函什麼資料?使用“dump($uidarray);”列印出來,以便下一步的操作,列印結果如下:

  1. array(4) {
  2.  ["uid"] => string(1) "1"
  3.  ["username"] => string(5) "qqabc"
  4.  ["password"] => string(6) "123456"
  5.  ["email"] => string(9) "[email protected]"
  6.  }

複制代碼 下一步就是以此$uidarray作為參數傳給同步登入方法uc_synlogin($uidarray),最後echo 一下uc_synlogin($uidarray)的傳回值$loginurl,就可以實作帳号"qqabc"在UCenter登入了。帳号"qqabc"在UCenter登入成功後程式将繼續往下執行項目W3note的登入,這裡就不多說了。最後的結果是,帳号"qqabc"實作了在UCenter和項目W3note的同步登入!