本文轉自:http://www.thinkphp.cn/topic/1557.html
有了帳号我們就可以來做同步登入了。
打開UcService.class.php檔案,添加一個UC登入和一個登出的方法,代碼到UCenter接口開發手冊的使用者接口那裡找使用者登入示例代碼,把它複制過來,然後稍微更改一下,使其帶有傳回值,以便下一步的操作,代碼如下:
- 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 '密碼錯誤';
- } elseif($uid == -3) {
- return '安全提問錯誤';
- } else {
- return '未定義';
- }
- }
複制代碼 繼續在使用者接口那裡找到同步登入的代碼示例,找到“uc_user_synlogin($uid);”其作用是執行同步登入,然後寫成uc_synlogin方法如下:
- public function uc_synlogin($uid){
- return uc_user_synlogin($uid);
- }
複制代碼 到這裡UcService.class.php檔案的登入方法已經寫好,接下來打開前台W3note項目的控制器MemberAction.class.php檔案寫一個同步登入的方法,看代碼:
- public function checkLogin() {
- if(!$_POST['username']) $this->error('帳号錯誤!');
- if(!$_POST['password']) $this->error('密碼錯誤!');
- if(empty($_POST['verify'])) $this->error('驗證碼必須!');
- import("@.ORG.UcService");//導入UcService.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)){
- //生成認證條件
- $map = array();
- // 支援使用綁定帳号登入
- $map['username'] = $_POST['username'];
- $map["status"] = array('gt',0);
- if($_SESSION['verify'] != md5($_POST['verify'])) {
- $this->error('驗證碼錯誤!');
- }
- $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('密碼錯誤!');
- }
- 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']);
- //儲存登入資訊(相當于更新資訊)
- $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()方法的執行過程。
在項目W3note注冊的一個帳号,然後在項目W3note送出登入表單後,首先執行UCenter的登入,前面我們寫了兩個UCenter的登入方法,在調用之前需要使用“import("@.ORG.UcService");”把UcService.class.php檔案加載進來,執行個體化後得到$ucService,然後就可以使用用$ucService通路UCenterr的登入方法uc_login,傳回一個$uidarray值,$uidarray包函什麼資料?使用“dump($uidarray);”列印出來,以便下一步的操作,列印結果如下:
- array(4) {
- ["uid"] => string(1) "1"
- ["username"] => string(5) "qqabc"
- ["password"] => string(6) "123456"
- ["email"] => string(9) "[email protected]"
- }
複制代碼 下一步就是以此$uidarray作為參數傳給同步登入方法uc_synlogin($uidarray),最後echo 一下uc_synlogin($uidarray)的傳回值$loginurl,就可以實作帳号"qqabc"在UCenter登入了。帳号"qqabc"在UCenter登入成功後程式将繼續往下執行項目W3note的登入,這裡就不多說了。最後的結果是,帳号"qqabc"實作了在UCenter和項目W3note的同步登入!