博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手机短信接收验证码的实现原理:
阅读量:4684 次
发布时间:2019-06-09

本文共 6588 字,大约阅读时间需要 21 分钟。

关于手机短信接收验证码的实现原理:

思路:
A:获得验证码:
1.找到相关的表。
2.用什么发送,post,get ,ajax,当然ajax首选
3.post之前要js先判断是手机号码11位,并且全部都是数字,或者用正则也行。
4.用ajax发送数据data,要对数据进行检验,过滤有效数据valid
5.insert前要先判断这手机是否验证过了,已经验证过就return false;没验证过则把随机生成的6位验证码insert 数据库表中。
6.通过提供给你api写好调用,把验证码跟msg通过ajax返回值发送给向客户,并用js做一个倒计时计数器.
B:接收验证码,提交表单:
1.接收post过来数据,把验证码跟跟刚才插入数据库中的6位key进行比较。如果相等,则说明是最后一次发送的验证码才有效。
2.对数据库insert 操作.最少要做个认证tag标志.

 

先贴出html部分:

手机认证

您的手机号码:   

输入以下图片校验码才可以获取手机验证码

校验码:
换一个
收到的验证码: (输入您手机收到的验证码)
为什么要进行手机认证?
1、认证通过后可在您的资料页点亮手机认证图标,提高你的诚信等级;
2、接收来自网站和会员发送的手机短信。

A:

下面php接收ajax接收方法:

 

/*hnb新增加的手机接收验证方法*/    public function control_checkregmobile( )    {        $response = 0;        $mobile = XRequest::getArgs('mobile');/*得到手机号  这个跟$_post接收数据是一样的*/        $checkcode = XRequest::getArgs('verifycode');/*得到验证码这个跟$_post接收数据是一样的*/                if (!empty($checkcode))         {            parent::loadUtil('session');            $nowcode = XSession::get('verifycode');            if ($checkcode!== $nowcode)             {                echo json_encode(array('response' => $response,'msg'=>'您的校验码有误!'));exit;            }        }else        {            echo json_encode(array('response' => $response,'msg'=>'您的校验码有误!'));exit;        }                      $model = parent::model('user','am');        $target = "http://api.bjszrk.com/sdk/BatchSend.aspx"; /*接口url*/                if (true === $model->doExistsMobile($mobile)) /*检测手机是否已经验证*/        {            $response = 2;            $msg='对不起,您的手机号码已经通过验证,请不要重复操作!';        }else         {            $model_certify = parent::model('certify', 'um');            list($mbcode, $error) = $model_certify->GetMobileCode($mobile); /*生成一个随机数及插入数据*/            $content="您的验证码是:".$mbcode."。欢迎注册我主良缘交友网,请勿将验证码告知他人!";            $msg=$model->postMbCode($mobile, $content);   /*调用post给api接口方法*/             $response = 1;            $msg='验证码已发送成功,请注意查收!';        }        echo json_encode(array('response'=>$response,'msg'=>$msg));    }

 

 

检测手机是否已经验证过的doExistsMobile方法如下:

public function doExistsMobile($mobile)    {        $res = false;        $sql = 'SELECT `userid` FROM ' . DB_PREFIX . 'user_attr' . " WHERE `mobile`='{
$mobile}'"; $rows = parent::$obj->fetch_first($sql); if (!empty($rows)) { $res = true; } unset($sql, $rows); return $res; }
/*GetMobileCode方法具体实现如下:*/ /*r把随机得到的6位验证码insert到数据库表中*/    public function GetMobileCode($mobile)    {        $result = 0;        $message = null;        $checkcode = XHandle::getRndChar(6, 1);        $userid=parent::$wrap_user['userid'];        $sql="update user_status set mobilesalt='$checkcode' where userid='$userid'";        parent::$obj->query($sql);        $result = 1;        $sql = (('SELECT * FROM ' . DB_PREFIX) . 'mobile_checkcode') . " WHERE `mobile`='{
$mobile}'"; $rows = parent::$obj->fetch_first($sql); if (!empty($rows)) { $array = array('checkcode' => $checkcode, 'updatetime' => time()); parent::$obj->update(DB_PREFIX . 'mobile_checkcode', $array, ('`id`=\'' . $rows['id']) . '\''); } else { $id = parent::$obj->fetch_newid(('SELECT MAX(id) FROM ' . DB_PREFIX) . 'mobile_checkcode', 1); $array = array('id' => $id, 'mobile' => $mobile, 'checkcode' => $checkcode, 'createtime' => time()); parent::$obj->insert(DB_PREFIX . 'mobile_checkcode', $array); } unset($sql); unset($rows); return array($checkcode, $message); }

 

B:

下面是得到了验证码Form表单点提交php的方法.

 

submit提交    */    public function control_rzmobile( )    {        $service = parent::service( "certify", "us" );/*接收数据,验证手机格式及号码*/        list( $mobile, $salt ) = $service->validRzMobile( );/*salt 为手机验证码*/        unset( $service );                $model = parent::model( "certify", "um" );        $result = $model->doValidMobile( $mobile, $salt );  /*调用model三张表进行数据操作*/        unset( $model );        if ( TRUE === $result )        {                        if ( $this->halttype == "jdbox" )            {                XHandle::jqdialog( "手机号码验证成功", 1 );            }            else            {                XHandle::halt( "手机号码验证成功", $this->ucfile."?c=certify", 0 );            }        }        else        {            XHandle::halt( "手机号码验证失败", "", 1 );        }    }

 

 

上面dovalidmobile函数方法具体实现:

/*手机认证提交 分别在三个表里操作对象*/    public function doValidMobile( $mobile, $validkey )    {        $result = FALSE;        $sql = "SELECT userid FROM ".DB_PREFIX.( "user_status WHERE mobilesalt='".$validkey."' AND userid='" ).parent::$wrap_user['userid']."'";        //SELECT userid FROM user_status WHERE mobilesalt='5522' AND userid='209367'        $rows = parent::$obj->fetch_first( $sql );                if ( !empty( $rows ) )        {            $status_array = array(                "mobilerz" => 1,                "mobilesalt" => XHandle::getrndchar( 6, 1 )                );            // print_r($status_array);exit;            parent::$obj->update( DB_PREFIX."user_status", $status_array, "userid='".parent::$wrap_user['userid']."'" );            $attr_array = array(                "mobile" => $mobile                );            parent::$obj->update( DB_PREFIX."user_attr", $attr_array, "userid='".parent::$wrap_user['userid']."'" );            parent::loadlib( "user" );            $star = XUser::updatestar( parent::$wrap_user['userid'] );  /*加星为user_status表里设置star星级*/            $result = TRUE;            if ( TRUE === $result )            {                $m_indexs = parent::model( "indexs", "am" );  /*作用在user_params表里加上论证标志,可能是用户左边栏加上星标志*/                $m_indexs->updateIndexs( parent::$wrap_user['userid'], array(                    "rzmobile" => 1,                    "star" => $star                    ) );                unset( $m_indexs );            }        }        return $result;    }

 

转载于:https://www.cnblogs.com/hnbiao/p/4569278.html

你可能感兴趣的文章
Arrays类学习笔记
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
闲的折腾——自己动手更换油雾分离阀/废气阀
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>
发布时间 sql语句
查看>>
黑马程序员 ExecuteReader执行查询
查看>>
记一些从数学和程序设计中体会到的思想
查看>>
题目1462:两船载物问题
查看>>
POJ 2378 Tree Cutting(树形DP,水)
查看>>
第二冲刺阶段个人博客5
查看>>
UVA 116 Unidirectional TSP (白书dp)
查看>>
第三方测速工具
查看>>
MySQL 网络访问连接
查看>>
在aws ec2上使用root用户登录
查看>>
数据访问 投票习题
查看>>
CIO知识储备
查看>>
cnblog!i'm coming!
查看>>