首先介绍下短信注册登录流程:

  1. 注册页面点击获取手机号验证码按钮,用jquery的click事件POST或GET方法把手机号发送到后台控制器;
  2. 后台控制器创建函数,收到手机号后生成随机码,例如:6位的随机数$code = rand(100000,999999);,生成之后用SESSION助手函数保存,例如:session('name',$手机号.$验证码);
  3. 利用阿里云短信服务接口将生成的随机码,以短信形式发送给注册用户;
  4. 用户在注册页面输入接收到的验证码,点击提交登录,后台处理用户提交的手机号+验证码,与自己后台session存储的手机号+验证码是否匹配,匹配则判断登录成功,否则提示用户登录失败;
  • 一句话:点击获取手机验证码--->提交手机号到后台--->后台生成手机验证码--->用session保存手机验证码及手机号--->用阿里云短信服务平台的接口发送给用户--->用户输入手机号验证码并提交----->后台比较提交的验证码是否与session保存的一致--->返回判断状态;

阿里云短信服务(文档):短信发送API(SendSms)---PHP

阿里云短信服务(SDK及DEMO下载):SDK及DEMO下载

阿里云短信服务(接口调试常见错误码):短信接口调用错误码

具体实现代码(使用阿里云短息服务[SDK轻量版])如下:

第一步:下载PHP版本的[SDK轻量版]代码,解压,重命名为api文件夹名称,并将该文件夹存放在Thinkphp根目录位置(存放位置可以自己选择);

第二步,在根目录/Application/Common/Controller/创建控制层AlismsController.class.php

<?php
namespace Common\Controller;
use Think\Controller;
use Aliyun\DySDKLite\SignatureHelper;
require_once "./Api/SignatureHelper.php"; //第一步中阿里云接口存放SignatureHelper.php的路径
class AlismsController extends Controller { public function _initialize(){
$this->accessKeyId = "AccessKeyId"; //AccessKeyId
$this->accessKeySecret = "AccessKeySecret"; //AccessKeySecret
$this->SignName = "短信签名"; //签名
$this->CodeId = "短信验证码模板ID"; //验证码模板ID
} //发送验证码
public function code($phone,&$msg){ if(!isphone($phone)){
$msg = "手机号不正确";
return false;
} $params["PhoneNumbers"] = $phone;
$params["TemplateCode"] = $this->CodeId; //模板 //记录存储验证码
$code = rand(100000,999999);
session("iphonecode",$phone.$code);//session存储手机号+验证码
$params['TemplateParam'] = ["code" => $code]; //验证码 return $this->send($params,$msg);
} //验证手机号是否正确
  private function isphone($phone){
if (!is_numeric($phone)) {
return false;
}
return preg_match("/^1[34578]{1}\d{9}$/", $phone) ? true : false;
} //发送短信消息
private function send($params=[],&$msg){ $params["SignName"] = $this->SignName; if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
$params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
}
$helper = new SignatureHelper();
$content = $helper->request(
$this->accessKeyId,
$this->accessKeySecret,
"dysmsapi.aliyuncs.com",
array_merge($params, array(
"RegionId" => "cn-hangzhou",
"Action" => "SendSms",
"Version" => "2017-05-25",
))
); if($content===false){
$msg = "发送异常";
return false;
}else{
$data = (array)$content;
if($data['Code']=="OK"){
$msg = "发送成功";
return true;
}else{
$msg = "发送失败 ".$data['Message'];
return false;
}
}
}
}

第三步,在根目录/Application/Admin/Controller/创建控制层LoginController.class.php

<?php
namespace Admin\Controller;
use Think\Controller;
use Common\Controller\AlismsController;
class LoginController extends Controller{ public function sendCode(){
$code = new AlismsController(); //此类存放在Common\Controller\
$code->code($_POST['iphone'],$msg);
$this -> ajaxReturn($msg);
}
}
?>

另外:短信验证码60S倒计时及AJAX POST提交手机号JS如下:

<!--短信验证码60S倒计时及AJAX POST提交手机号-->
<script type="text/javascript">
var countdown=60;
function sendcode(){
var obj = $("#smsbtn");
settime(obj);
$.ajax({
type: 'POST',
url: '__CONTROLLER__/sendCode.html',
data: {"iphone":$("#name").val()},
dataType:'json',
success: function(data){
alert('返回数据:'+data);
console.log("提交成功");
},
error: function(data){
console.log("提交失败");
}
});
}
function settime(obj) { //发送验证码倒计时
if (countdown == 0) {
obj.attr('disabled',false);
obj.val("发送验证码");
countdown = 60;
return;
} else {
obj.attr('disabled',true);
obj.val("重新发送(" + countdown + "s)");
countdown--;
}
setTimeout(function() {
settime(obj) }
,1000)
}
</script>

其他HTML代码展示在这里就不在展示了;

最新文章

  1. Hibernate入门学习-安装hibernate插件
  2. 二维码生成Zxing.net DEMO
  3. Java代理(jdk静态代理、动态代理和cglib动态代理)
  4. Hibernate 的dialect 大全
  5. Windows命令行查看文件的MD5
  6. Python代码编辑器
  7. WPF学习笔记-TextBox光标位置如何放到最后?
  8. [PWA] 2. Service worker life cycle
  9. 201521123048 《Java程序设计》第13周学习总结
  10. Python网络编程socket练习(TCP)
  11. 学习总结:工程管理与makefile
  12. iOS页面切换动画实现方式。
  13. C#制作ActiveX插件
  14. windows curl命令详解
  15. CodeForces - 1101B
  16. [转帖]Linux 硬件和系统配置查看命令小结
  17. 极验验证使用-滑动&amp;选字验证码
  18. SpringMVC集成springfox-swagger2自动生成接口文档
  19. JS方法转字符串
  20. Java VisualVM 插件地址

热门文章

  1. IT职业后半段发展问题
  2. 何谓sdk,何谓api
  3. html提交表单到Servlet
  4. android编码学习
  5. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习
  6. shell中打印带有时间的日志的命令(转)
  7. 单片机成长之路(51基础篇) - 004 STC89C52MCU 软件实现系统复位
  8. C# 中字符串转换成日期
  9. 利用git 进行多人协作开发
  10. 线程封装组件(BackgroundWorker)和线程(Thread)