有时我们在帮客户做网站的过程中,会遇到需要短信验证码的场景,比如用户的注册、用户的登录、用户找回密码、留言时的短信验证码验证等。这里我以阿里大鱼的短信验证码举例,来说一说具体的使用流程,已经用在客户的网站上了,这里是做一个复盘总结,希望有需要的朋友能够用得上。
整体效果如下,流程是这样的:点击“获取验证码”会验证填的手机号格式是否正确,如果正确则把数据通过ajax方式提交到网站服务器端,服务器端也做好验证工作,没有问题的话则向对应的手机号发送一个验证码,同时通过session保存生成的验证码,60秒内有效,超过60秒点击“重新获取”,并有一个倒计时提示效果。

验证码发送成功后,点击注册按钮的话,如果验证提交的数据没有问题,则把数据通过ajax提交到服务器端,服务器端同样做好数据验证即可,没有问题则把数据入库,并返回提示即可。
服务器端的验证码验证主要包括3个:传过来的手机号是否是客户在前端输入的那个手机号,传过来的验证码是否是客户输入的那个验证码,验证码的有效时间是否已经到期。
下面简单的附上部分代码,后面有做附件打包,感兴趣的朋友可以下载了解看看
1、前端部分:smsdemo.html
<!DOCTYPE html> <head> <title>阿里大鱼,php+ajax发送短信验证码和提交数据实例</title> </head> <body> <form method="post" action="" class="myfm"> <div> <input type="text" id="phone" name="phone" placeholder="请输入手机号"> </div> <div> <input type="text" id="verycode" name="verycode" placeholder="请输入验证码"> <a onclick="send_sms(this);" id="verify-btn" style="cursor: pointer;">获取验证码</a> </div> <div> <input type="password" name="password" placeholder="请输入密码 ( 最少八位 )"> </div> <div> <input type="password" name="pwdconfirm" placeholder="请再次输入密码"> </div> <input type="submit" name="dosubmit" value="注册"> </form> <script type="text/javascript" src="sms/jquery.min.js"></script> <script type="text/javascript" src="sms/sms_send.js"></script> <!--短信验证码发送--> <script type="text/javascript" src="sms/sms_do.js"></script><!--ajax数据提交--> </body> </html>
2、ajax提交电话到服务器端,并利用阿里大鱼发送短信:/sms/sms_send.js+/sms/ali/sms_send.php
//#phone 电话输入框的ID #verify-btn 获取验证码的ID
var countdown;
var flag = 0;
var sec = 60;
var int;
function send_sms(obj) {
var phone = $("#phone").val();
//console.log(phone);
var partten = /^1[3-9]\d{9}$/;
if(!partten.test(phone)){
alert("请输入正确的手机号码");
$('#phone').focus();
return false;
}
if(flag == 0){
$.post('/sms/ali/sms_send.php',{"tel":phone},function(data){
if(data.status != 1){
alert(data.msg);
}else{}
},'json')
flag = 1;
$(this).css("backgroundColor",'white');
$(this).css("borderColor",'grey');
int = setInterval(countfunc,1000);
}
else{
return false;
}
}
// 获取验证码点击后倒计时
function countfunc(){
if(sec > 0){
$("#verify-btn").text("重新获取(" + sec + ")");
sec--;
}else{
flag = 0;
sec = 60;
$("#verify-btn").css("backgroundColor",'white');
// $("#verify-btn").css("borderColor",'#d43f3a');
$("#verify-btn").text("获取验证码");
clearInterval(int);
}
}
<?php
session_start();
.......
/*
status -1 60秒内不能重复发送
status 1 发送成功
status 2
status 3 手机号不正确
*/
$phone=$_POST["tel"];
if(preg_match("/^1[34578]{1}\d{9}$/",$phone)){
// 加载区域结点配置
Config::load();
class Sms
{
.......
/**
* 发送短信
* @return stdClass
*/
public static function sendSms($phoneNumbers) {
// 初始化SendSmsRequest实例用于设置发送短信的参数
$request = new SendSmsRequest();
// 必填,设置短信接收号码
$request->setPhoneNumbers($phoneNumbers);
// 必填,设置签名名称,应严格按"签名名称"填写,请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
$request->setSignName("企业核名");
// 必填,设置模板CODE,应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
$request->setTemplateCode("SMS_205885284");
// 可选,设置模板参数, 假如模板中存在变量需要替换则为必填项
if (isset($_SESSION["smscode_time"]) && (time() - $_SESSION["smscode_time"]) < 60) {
return array('status' => -1, 'msg' => '60秒内不能重复发送');
}
function getrandchar($length){
$str = null;
$strPol = "0123456789";
$max = strlen($strPol)-1;
for($i=0;$i<$length;$i++){
$str.=$strPol[rand(0,$max)];
}
return $str;
}
$code = getrandchar(6);
$_SESSION["smscode"]=$code; //保存短信验证码
$_SESSION["phone"]=$phoneNumbers; //保存手机号
$_SESSION["smscode_time"]=time(); //保存短信生成时间
$request->setTemplateParam(json_encode(array( // 短信模板中字段的值
"code"=>$code,
), JSON_UNESCAPED_UNICODE));
// 可选,设置流水号
$request->setOutId("45656");
// 选填,上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
$request->setSmsUpExtendCode("1234567");
// 发起访问请求
$acsResponse = static::getAcsClient()->getAcsResponse($request);
if($acsResponse->Code == "OK")
return array('status' => 1, 'msg' => '发送成功!');
else
return array('status' => -1, 'msg' => $acsResponse->Message);
}
}
// 调用示例:
set_time_limit(0);
header('Content-Type: text/plain; charset=utf-8');
$response = Sms::sendSms($phone);
echo json_encode($response);
}else{
$data=array(status=>3,msg=>"手机号不正确");
echo json_encode($data);
}
3、ajax提交数据,服务器端做好对应的验证:/sms/sms_do.js和/sms/ali/sms_do.php
$(document).ready(function(){
$('.myfm input[name=dosubmit]').click(function(e){
let obj={
'phone':$('.myfm input[name=phone]').val(), //电话
'verycode':$('.myfm input[name=verycode]').val(), //短信验证码
'password':$('.myfm input[name=password]').val(), //密码
'pwdconfirm':$('.myfm input[name=pwdconfirm]').val(), //确认密码
}
if(obj.phone==''){
alert("请输入手机号");
$('.myfm input[name=phone]').focus();
return false;
}
if(!checkPhone(obj.phone)){
alert("手机号码输入有误,请重新输入");
$('.myfm input[name=phone]').focus();
return false;
}
if(obj.verycode==''){
alert("请输入你收到的验证码");
$('.myfm input[name=verycode]').focus();
return false;
}
if(obj.password==''){
alert("请输入密码");
$('.myfm input[name=password]').focus();
return false;
}
if(obj.pwdconfirm==''){
alert("请输入确认密码");
$('.myfm input[name=pwdconfirm]').focus();
return false;
}
if(obj.password != obj.pwdconfirm){
alert("密码输入不一致!");
return false;
}
$.ajax({
type : "POST", //提交方式
url : "/sms/ali/sms_do.php",//路径
data : {
"dosubmit":"dosubmit",
"ajax":"1",
'info[phone]':obj.phone,
'info[password]':obj.password,
'info[pwdconfirm]':obj.pwdconfirm,
'verycode':obj.verycode,
},//数据,这里使用的是Json格式进行传输
//dataType: "json",
success : function(result) {//返回数据根据结果进行相应的处理
if(result == "ok"){
alert('您已提交成功,我们会马上安排人员和您联系!');
}else if(result == "codeerror"){
alert('验证码错误!');
}else if(result == "timeerror"){
alert("验证码已过期!");
}else if(result == "telerrorr"){
alert("电话号码错误!");
}else{alert(result);}
}
});
e.stopPropagation();//禁止响应父元素的相关事件
e.preventDefault();//防止跳转
})
})
function checkPhone(phone){
if(!(/^1[3456789]\d{9}$/.test(phone))){
return false;
}else{
return true;
}
}
<?php
session_start();
if(isset($_POST['verycode'])){//手机验证码验证
$code = isset($_SESSION['smscode']) ? $_SESSION['smscode'] : ''; //短信验证码增加
$phone_numbers = isset($_SESSION['phone']) ? $_SESSION['phone'] : ''; //短信验证码增加
$time = isset($_SESSION['smscode_time']) ? $_SESSION['smscode_time'] : 0; //短信验证码增加
if($_POST['smscode'] != $code){
echo "codeerror";exit;
}
if(time() - $time >= 60){ // 这个是过期时间,60秒内有效
echo "timeerror";exit;
exit;
}
if($_POST['info']['phone'] != $phone_numbers){
echo 'telerrorr';
exit;
}
$_SESSION['smscode'] = '';
//处理其他事务,比如数据入库等操作
}else{
}
?>
关注公众号:太友帮,回复“阿里大鱼短信”即可免费获取 《利用阿里大鱼发送短信验证代码实例.zip》
管道链接:阿里云短信官网
2021-04-22更新
如果第三方短信服务提供商提供的是api接口的写法,短信发送实现方式如下,结合网站访客留言,短信验证码实例如下:
$url = "https://sdk2.02d8lwk.com:9988/BatchsSend2.aspx?"; $ContentS = "您好,您的验证码是:".$code.",请妥善保管。"; $ContentS = rawurlencode(mb_convert_encoding($ContentS, "gb2312", "utf-8"));//短信内容做GB2312转码处理 $CorpID = "CdDJT0dd01054"; $Pwd = "B3dd56dEC"; $Mobile = $phoneNumbers; $SendTime = ""; $curpost = "CorpID=".$CorpID."&Pwd=".$Pwd."&Mobile=".$Mobile."&Content=".$ContentS."&SendTime=".$SendTime; //POST方式请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 -https curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curpost); $result = curl_exec($ch); curl_close($ch);

