ThinkPHP 3.2 用戶注冊郵箱驗證帳號找回密碼


一、前言

當然現在有的網站也有手機短信的方式找回密碼,原理就是通過發送驗證碼來驗明正身,和發送郵件驗證一樣,最終還是要通過重置密碼來完成找回密碼的流程。

本文將使用PHP+Mysql+jQuery來實現一個密碼找回的功能,一般步驟是:

1.表單輸入注冊時的郵箱;

2.驗證用戶郵箱是否正確,如果用戶郵箱不存在網站的用戶表中,則提示用戶郵箱未注冊;

3.發送郵件,如果用戶郵箱確實存在用戶表中,則組合用於驗證用戶信息的字符串,並構造URL發送到用戶郵箱中;

4.用戶登錄郵箱收取郵件,點擊URL鏈接到網站驗證程序;

5.網站程序通過用戶請求的字符串查詢本地用戶表,比對用戶信息是否正確;

6.如果正確則轉到重置密碼頁面重新設置新密碼,反之則提示用戶驗證無效。

二、HTMl代碼:

我們在找回密碼的頁面上放置一個要求用戶輸入注冊時所用的郵箱,然后提交前台js來處理交互。

<p><strong>輸入您注冊的電子郵箱,找回密碼:</strong></p> 
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> 
<p><input type="button" class="btn" id="sub_btn" value="提 交"></p> 

三、JQUERY代碼:

當用戶輸入完郵箱並點擊提交后,jQuery先驗證郵箱格式是否正確,如果正確則通過向后台sendmail.php發送Ajax請求,sendmail.php負責驗證郵箱是否存在和發送郵件,並會返回相應的處理結果給前台頁面,請看jQuery代碼:

$(function(){ 
    $("#sub_btn").click(function(){ 
        var email = $("#email").val(); 
        var preg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; //匹配Email 
        if(email=='' || !preg.test(email)){ 
            $("#chkmsg").html("請填寫正確的郵箱!"); 
        }else{ 
            $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default"); 
            $.post("sendmail.php",{mail:email},function(msg){ 
                if(msg=="noreg"){ 
                    $("#chkmsg").html("該郵箱尚未注冊!"); 
                    $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer"); 
                }else{ 
                    $(".demo").html("<h3>"+msg+"</h3>"); 
                } 
            }); 
        } 
    }); 
}) 

四、服務器端郵箱驗證是否存在:

 說明:這一步只要是用戶輸入郵箱地址的時候,驗證該郵箱是否被注冊過,以及郵箱的格式驗證是否正確,同時給用戶郵箱發送一份郵件,用戶點擊就可以修改密碼啦!

// 郵箱驗證
    public function checkEmail()
    {
        $email = I('post.email', '756684177@qq.com');
        $model = M('User');
        $condition['email'] = $email;
        $result = $model->where($condition)->find();
        if (!$result) exit('該郵箱尚未注冊');
        //同時我們為了控制URL鏈接的時效性
        $passwordToken = md5($result['id'] . $result['username'] . $result['password']);
        $link = "http://wechatu.xd107.com/home/Index/resetPassword/email/{$email}/passwordToken/{$passwordToken}";
        $str = "您好!{$result['username']}, 請點擊下面的鏈接重置您的密碼:<p></p>" . $link;
        $sendResult = send_email($email, "Tinywan世界重置密碼", $str);
        if ($sendResult['error'] == 1) exit($result);
        //修改密碼發送時間
        $passwordTime = time();
        $where['id'] = $result['id'];
        $updateResult = $model->where($where)->setField('passwordTime', $passwordTime);
        if (!$updateResult) exit('修改數據庫密碼發送時間失敗!');
        exit("系統已向您的郵箱發送了一封郵件<br/>請登錄到您的郵箱及時重置您的密碼!");
    }

五、用戶點擊鏈接打開的地址:

六、用戶點擊鏈接打開的地址

說明:首先接受參數email和token,然后根據email查詢數據表user中是否存在該Email,如果存在則獲取該用戶的信息,並且和數據庫中的token組合方式一樣構建token值,然后與url傳過來的token進行對比,如果當前時間與發送郵件時的時間相差超過24小時的,則提示“該鏈接已過期!”,反之,則說明鏈接有效,並且調轉到重置密碼頁面,最后就是用戶自己設置新密碼了。

/**
     * 密碼驗證
     */
    public function resetPassword()
    {
        $email = I('get.email');
        $passwordToken = I('get.passwordToken');
        $model = M('User');
        $condition['email'] = $email;
        $result = $model->where($condition)->find();
        if (!$result) exit('error link');
        $checkToken = md5($result['id'] . $result['username'] . $result['password']);
        if ($checkToken != $passwordToken) exit('this no exit link');
        var_dump($result['passwordtime']);
        if (time() - $result['passwordtime'] > 24 * 60 * 60) exit('The link has expires');
        $link = "http://wechatu.xd107.com/home/Index/reSet?uid={$result['id']}"; //這里跳轉到一個個人博客的二維碼
        // 跳轉至客戶密碼重置頁面
        header('location:' . $link);
    }

七、用戶重設密碼

/**
     * 重設密碼驗證
     */
    public function reSet()
    {
        $uid = I('get.uid');
        $model = M('User');
        $condition['id'] = $uid;
        $result = $model->where($condition)->find();
        //若果是POST方式提交的話,就是修改密碼了,重置密碼就是
        if (IS_POST) {
            $newPassword = I('post.password', '11111111111111');
            $email = I('post.email', '756684177@qq.com');
            $where['email'] = ':email';
            $model->password = $newPassword;
            $model->update_time = time();
            //save方法的返回值是影響的記錄數,如果返回false則表示更新出錯,因此一定要用恆等來判斷是否更新失敗
            $modPassword = $model->where($where)->bind(':email', $email)->save();
            if (!$modPassword) exit('修改密碼失敗');
            exit($email . 'update password success' . $modPassword);
        }
        var_dump($result);
        die;
    }

 

 

 

八、數據庫表結構:

DROP TABLE IF EXISTS `wechat_user`;
CREATE TABLE `wechat_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orgId` int(11) DEFAULT '0' COMMENT '組織ID',
  `username` varchar(40) DEFAULT NULL,
  `password` varchar(40) NOT NULL,
  `nickName` varchar(40) DEFAULT NULL,
  `mobile` varchar(20) DEFAULT NULL,
  `openId` varchar(50) DEFAULT NULL,
  `createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入時間',
  `checkFlag` int(2) DEFAULT NULL,
  `enabled` tinyint(2) DEFAULT '1',
  `accessExpires` int(12) DEFAULT NULL,
  `accessToken` varchar(128) DEFAULT NULL,
  `reTime` varchar(32) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `passwordTime` varchar(128) DEFAULT NULL,
  `update_time` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=444 DEFAULT CHARSET=utf8 COMMENT='組織和用戶關系表';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM