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='组织和用户关系表';

 

时间: 2024-08-15 12:30:26

ThinkPHP 3.2 用户注册邮箱验证帐号找回密码的相关文章

ThinkPHP 3.2 用户注册邮箱验证激活帐号

本文将结合实例,讲解如何使用PHP+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. 3.将用户名密码或其他标识字符加密构造成激活识别码(你也可以叫激活码). 4.将构造好的激活识别码组成URL发送到用户提交的邮箱. 5.用户登录邮箱并点击URL,进行激活. 6.验证激活识别码,如果正确则激活帐号. 准备数据表 用户信息表中字段Email很重要,它可以用来验证用户.找回密码.甚至对网站方来说可以

GAE写的注册页面怎样通过注册邮箱验证帐号密码

问题描述 菜鸟求教请问各位高手基于googleappengine上开发的JSP用到了GAE写了个注册页面验证的时候要需要通过注册的邮箱进行验证请问怎样发送邮件到注册的邮箱并跳转进行验证

PHP用户注册邮箱验证激活帐号示例

功能需求 PHP程序开发,用户在网站注册,需要用户通过邮件链接激活帐号,当用户注册后(用户信息写入数据库),没有登录邮箱激活帐号,规定24小时后自动删除没有激活帐号的用户信息,实现激活链接过期后,用户还可以使用该信息在网站注册 准备数据表 用户信息表中字段Email很重要,它可以用来验证用户.找回密码.甚至对网站方来说可以用来收集用户信息进行Email营销,以下是用户信息表t_user的表结构:  代码如下 复制代码 CREATE TABLE IF NOT EXISTS `t_user` (  

foxmail邮箱帐号的密码如何修改?

  若你的foxmail邮箱帐号是2009年被迁移至QQ邮箱的帐号,请按照下面的步骤进行密码的修改. 一.登录QQ安全中心,绑定密保手机. 注: 若帐号未有任何密码保护方式,需要先设置密保手机后方可进行密码修改.已有密保的帐号可选择[密码管理]-[修改密码]进行密码修改. 二.输入要绑定的密保手机号码,等待短信获取验证码,输入验证码并确定,密保手机即可设置成功. 三.选择[密码管理]-[修改密码]进行密码的修改.

servlet-使用ajax验证帐号是否重复,使用innerHTML在页面得不到信息

问题描述 使用ajax验证帐号是否重复,使用innerHTML在页面得不到信息 js代码: var xhr = getXhr(); function getXhr(){ var xhr = null; try { xhr = new XMLHttpRequest(); } catch (trymicrosoft) { try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) { try { xhr

验证IP地址、登录帐号、密码、EMAIL、电话号码[包括手机和固定电话

验证IP地址.登录帐号.密码.EMAIL.电话号码[包括手机和固定电话 var patterns = new Object();  var thePat;  var r, re;     patterns.ip = /^(d{1,2}|1dd|2[0-4]d|25[0-5])(.(d{1,2}|1dd|2[0-4]d|25[0-5])){3}$/g;        patterns.id = /^[A-Za-z0-9_]{1,20}$/g;      patterns.ps教程w = /^[a-

Win32.Troj.LMir.dl-偷盗传奇帐号和密码的木马程序

病毒名称(中文): 病毒别名: 威胁级别:★☆☆☆☆ 病毒类型:木马程序 病毒长度:43520 影响系统:Win9x/WinM/eWinNT/Win2000/WinXP/Win2003 病毒行为: 这是一个偷盗传奇帐号和密码的木马程序. 该病毒能关闭安全软件,会安装消息钩子,自动HOOK所有窗口,如果是传奇游戏的窗口,则记录账号和密码,通过自带的SMTP引擎,发送到指定邮箱. 1,释放出下列文件: C:\rundll32.exe C:\WINNT\System32\cq3dll.dll 2,修改

如何设置访问共享时每次都需要输入帐号和密码?

  访问共享时,如何设置每次都需要输入帐号和密码呢,这里小编以WIN7系统做演示,XP系统类似操作. 1.首先在开始菜单中找到"附件"下的"运行",点击打开,如图所示: 2.在"运行"中,输入"gpedit.msc",点击"确定"按钮,打开组策略编辑器,如图所示: 3.在组策略编辑器中,依次打开"计算机配置"-"Windows设置"-"安全设置"-

Win32.Troj.FengShen.cm-盗取封神榜游戏帐号和密码的木马

病毒名称(中文): 病毒别名: 威胁级别:★★☆☆☆ 病毒类型:木马程序 病毒长度:23040 影响系统:Win9x\WinNT 病毒行为: 该病毒是一个盗取用户封神榜游戏帐号和密码等信息的木马.该木马运行时,拷贝自己到系统文件夹,通过写入并执行dela.bat删除自身并运行系统文件夹里病毒副本:记录并邮寄封神榜帐号和密码.计算机名.操作系统等信息,使封神榜用户的利益受到损失. 1,生成文件 %system%\fsservice.exe %当前目录%\dela.bat(自删除) 2,修改注册表