短信验证码开发教程-4.后端篇
这篇⽂件教⼤家怎么处理后端的业务逻辑。后端的业务我把它分成2块来处理:1. 获取短信验证码的业务处理。 2. 提交表单完成模拟注册。
⼀. 获取短信验证码 :打开sms/register.php这个⽂件,在表单中找到“获取验证码”的button标签。获取验证码是通过这个按钮触发js 事件,ajax调⽤后台接⼝来完成发送的。
我们在sms/tool⽬录中,创建⼀个ndCode.php⽂件,这个php⽂件主要⽤于处理后端的发送短信验证码业务。我先来阐述⼀下开发的思路:
1. 引⼊数据验证类,sms/tool/CheckTool.php
2. 接收前端ajax发送过来的表单数据:⽤户的⼿机号码和图形验证码。
3. 验证表单提交的数据合法性。
4. 如果数据全部合法,就调⽤短信宝的短信接⼝,发送短信验证码。
5. 最后记录发送时间和发送的⼿机号码。这⼀点很重要,可以⽤来限制⼀个⼿机号码,在⼀段时间⾥⾯
只能对短信宝的短信接⼝请求⼀次,从⽽限制了重复提交。我这⾥为了演⽰⽅便,把时间记录在ssion⾥⾯,⼩伙伴们也可以记录在数据库⾥⾯。
代码如下:
<?php
// 引⼊验证类
require'CheckTool.php';
// 短息请求错误码
$statusStr = array(
"0" => "短信发送成功",
"-1" => "参数不全",
"-2" => "服务器空间不⽀持,请确认⽀持curl或者fsocket,联系您的空间商解决或者更换空间!",
"30" => "密码错误",
"40" => "账号不存在",
"41" => "余额不⾜",
"42" => "帐户已过期",
"43" => "IP地址限制",
"50" => "内容含有敏感词"
);
$res = array();
$postCode = trim($_POST['code']);
$postPhone = trim($_POST['phone']);
// 验证图形验证码的合法性
$isOk = CheckTool::checkCode($postCode);
if (true !== $isOk) {
echo responErr($isOk, 'code');
exit();
}
// 验证⼿机号码的合法性
$isOk = CheckTool::checkPhone($postPhone);
if (true !== $isOk) {
echo responErr($isOk, 'phone');
exit();
}
// 调⽤短信发送接⼝
$isOk = ndSms($postPhone);
// 短信发送失败
if (0 != $isOk) {
echo responErr($statusStr[$isOk], 'nd');
exit();
}
// 短信发送成功
$res['flg'] = 1;
// 记录发送时间
// 记录发送时间
$_SESSION['nd_time'] = time();
/
/ 记录⽤户的⼿机号码
$_SESSION['nd_phone'] = $postPhone;
echo json_encode($res);
/**
* 调⽤短信宝的短信接⼝,发送短信请求。
* @param $phoneNum
* @return string
*/
function ndSms($phoneNum) {
$data = include('../config/config.php');
if (empty($data)) {
return"40";
}
$url = '/sms?';
$urName = $data['smsbao_name']; //数据库获取⽤户名
$password = md5($data['smsbao_password']); //数据库获取密码
$phone = $phoneNum;
$code = rand(100000, 999999);
$content = '【短信宝】你的短信验证码为'.$code.',请及时查收,如⾮本⼈操作,请忽略。';
$url .= 'u=' . $urName . '&p=' . $password . '&m=' . $phone . '&c=' . urlencode($content);
$_SESSION['sms_code'] = $code;
return file_get_contents($url);
}
/**
* 向前端发送错误信息
* @param $msg
* @param $type
* @return string
*/
function responErr($msg, $type)
{
$res = array();
$res['flg'] = -1;
$res['err'] = $msg;
$res['type'] = $type;
return json_encode($res);
}
⼆. 提交表单完成模拟注册: 当收到短信宝接⼝发出的短信验证码时,把验证码填⼊到表单中,点击提交按钮就完成了整个模拟验证过程。 表单提交到当前页⾯上,也就是sms/register.php中。我们先分析⼀下,具体需要做哪些事情:
(1). 当页⾯加载时,获取⽤户上次发送短信验证码的时间,以及当前时间。如果:当前时间 - 上次发送时间 < 间隔时间,那么前端的发送按钮进⼊倒计时状态。
(2). 验证表单提交的数据。成功后跳转。
代码如下:
<?php
/
/ 开启ssion
ssion_start();
// 引⼊⼯具类
require('tool/CheckTool.php');
require('tool/Helpers.php');
$diff = '';
// 得到上次短信请求时间,和当前时间做对⽐。
if (ist($_SESSION['nd_time']) && is_int($_SESSION['nd_time'])) {
$currentTime = time();
$diff = $currentTime - $_SESSION['nd_time'];
$diff = $diff < 60 ? 60 - $diff : '';
}
// 获取表单数据,进⾏验证,成功后跳转到登⼊页⾯。
if (!empty($_POST['is_nd'])) {
// 去除提交数据的两端空格。
$data = Helpers::removeSpaces($_POST);
$res = CheckTool::exec($data);
if (!is_array($res) && true === $res) {
// 清除记录的验证码和⼿机号码
$_SESSION['sms_code'] = null;
$_SESSION['nd_phone'] = null;
unt($_SESSION['sms_code']);
unt($_SESSION['nd_phone']);
header("Location:login.php");
exit();
}
}
>
提交完成后,跳转到成功提⽰页⾯sms/login.php中。代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta chart="UTF-8">
<title>登⼊页⾯</title>
</head>
<body>
<p >恭喜你!登⼊成功!
<a href="register.php">返回</a>注册界⾯。
</p>
</body>
</html>
好了,后端的业务逻辑都在这⾥了。关于前端的接⼝调⽤,短信发送后的倒计时等功能,我们留到这个系列的最后⼀篇,“前端篇”来介绍。