介绍
介绍
福哥今天带着大家完成绑定邮箱功能的后一部分——验证绑定邮箱激活码功能。这个激活码的验证需要几个步骤:1)根据激活码使用AES算法解密得到原始数据;2)判断激活码内的用户状态是否正常;3)判断激活码内的邮箱地址是否被占用;4)写入绑定邮箱数据。
解密激活码比较简单,不过要考虑一个时间差的问题,因为激活码的时间戳精确到1个小时,而生成激活码有可能在59分操作的,那么当收到邮件时候已经是下一个小时了。为了解决这个问题,我们需要先检验当前这个小时和上一个小时,两个之中一定会有一个成功的。
判断激活码的用户状态和判断激活码的邮箱地址都比较简单,在生成激活码时候就已经处理过了。为什么要在这里又操作一次呢?这是为了以防万一啊!如果此时用户被删除了呢?如果此时邮箱地址被其他人抢先绑定了呢?
写入绑定邮箱数据,写入后就算完成了绑定操作了。
模型user
bindEmail
public function bindEmail(string $dataEncrypted):bool { $tfdo = $this->tfphp->getDatabase()->getTFDO(); $myAES = new TFAES($this->tfphp); $timestamp = date("YmdH0000"); $data = $myAES->decrypt($dataEncrypted, TFConfig::get("projectAESPK", "system"). $timestamp, ""); $arr = unserialize($data); if(!is_array($arr) || $arr['id'] == 0 || $arr['email'] == ""){ $timestamp = date("YmdH0000", strtotime("-1 hour")); $data = $myAES->decrypt($dataEncrypted, TFConfig::get("projectAESPK", "system"). $timestamp, ""); $arr = unserialize($data); if(!is_array($arr) || $arr['id'] == 0 || $arr['email'] == ""){ return 1; } } $userID = $arr['id']; $email = $arr['email']; $userInfo = $this->getByTable("user", array($userID)); if($userInfo == null){ return 2; } $userInfo = $this->getByTable("userByEmail", array($email)); if($userInfo != null && $userInfo['userID'] != $userID){ return 3; } $ret = $tfdo->update("user", array( 'userEmail'=>$email ), null, "userID = @int", array( $userID )); if(!$ret){ return 4; } return 0; }
接口控制器
doVerify
private function doVerify(){ $req = $this->tfphp->getRequest(); $post = $req->post; $user = new user($this->tfphp); $data = $req->get->get("data"); try{ // request test if($data == ""){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001071, "错误请求"); } // create user $ret = $user->bindEmail($data); switch ($ret){ case 1: return $this->tfphp->getResponse()->responseJSON_CM(200, 1001072, "激活码无效"); break; case 2: return $this->tfphp->getResponse()->responseJSON_CM(200, 1001073, "用户名不存在"); break; case 3: return $this->tfphp->getResponse()->responseJSON_CM(200, 1001074, "邮箱地址已经存在"); break; case 4: return $this->tfphp->getResponse()->responseJSON_CM(200, 1001075, "绑定邮箱失败"); break; } } catch(\TypeError $e){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001071, "错误请求"); } // output return $this->tfphp->getResponse()->responseJSON_CM(200, 0, "OK"); }
讲解
因为验证绑定邮箱激活码不需要操作表单,这里就没有视图和JS的事情了。我们只是在页面里通过AJAX请求验证激活码接口进行激活处理就行了。
模型user
bindEmail
首先使用当前小时和上一小时两个时间进行激活码解密处理。
接着判断用户状态是否正常。
然后判断邮箱地址是否被占用。
最后将邮箱地址写入用户数据表。
接口控制器
doVerify
这里面调用模型user的bindEmail方法进行绑定邮箱激活码的判断。
效果
这是绑定成功的界面内容,很简单就不过多介绍了。
总结
今天福哥带着童鞋们完成了绑定邮箱表单的后一部分——验证绑定邮箱激活码的功能。这下绑定邮箱表单功能就算完全地做好了。绑定邮箱表单属于多步骤且异步的复杂功能,大家有可能会感觉有点晕。没关系,做的多了,就会慢慢习惯了!
下一课我们将开发安全问题表单的功能,敬请期待~~