福哥今天带着大家完成绑定邮箱功能的后一部分——验证绑定邮箱激活码功能。这个激活码的验证需要几个步骤:1)根据激活码使用AES算法解密得到原始数据;2)判断激活码内的用户状态是否正常;3)判断激活码内的邮箱地址是否被占用;4)写入绑定邮箱数据。
解密激活码比较简单,不过要考虑一个时间差的问题,因为激活码的时间戳精确到1个小时,而生成激活码有可能在59分操作的,那么当收到邮件时候已经是下一个小时了。为了解决这个问题,我们需要先检验当前这个小时和上一个小时,两个之中一定会有一个成功的。
判断激活码的用户状态和判断激活码的邮箱地址都比较简单,在生成激活码时候就已经处理过了。为什么要在这里又操作一次呢?这是为了以防万一啊!如果此时用户被删除了呢?如果此时邮箱地址被其他人抢先绑定了呢?
写入绑定邮箱数据,写入后就算完成了绑定操作了。
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;
}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方法进行绑定邮箱激活码的判断。
这是绑定成功的界面内容,很简单就不过多介绍了。

今天福哥带着童鞋们完成了绑定邮箱表单的后一部分——验证绑定邮箱激活码的功能。这下绑定邮箱表单功能就算完全地做好了。绑定邮箱表单属于多步骤且异步的复杂功能,大家有可能会感觉有点晕。没关系,做的多了,就会慢慢习惯了!
下一课我们将开发安全问题表单的功能,敬请期待~~