首先介绍下短信注册登录流程:
- 注册页面点击获取手机号验证码按钮,用jquery的click事件POST或GET方法把手机号发送到后台控制器;
- 后台控制器创建函数,收到手机号后生成随机码,例如:6位的随机数$code = rand(100000,999999);,生成之后用SESSION助手函数保存,例如:session('name',$手机号.$验证码);
- 利用阿里云短信服务接口将生成的随机码,以短信形式发送给注册用户;
- 用户在注册页面输入接收到的验证码,点击提交登录,后台处理用户提交的手机号+验证码,与自己后台session存储的手机号+验证码是否匹配,匹配则判断登录成功,否则提示用户登录失败;
- 一句话:点击获取手机验证码--->提交手机号到后台--->后台生成手机验证码--->用session保存手机验证码及手机号--->用阿里云短信服务平台的接口发送给用户--->用户输入手机号验证码并提交----->后台比较提交的验证码是否与session保存的一致--->返回判断状态;
阿里云短信服务(文档):短信发送API(SendSms)---PHP
阿里云短信服务(SDK及DEMO下载):SDK及DEMO下载
阿里云短信服务(接口调试常见错误码):短信接口调用错误码
具体实现代码(使用阿里云短息服务[SDK轻量版])如下:
第一步:下载PHP版本的[SDK轻量版]代码,解压,重命名为api文件夹名称,并将该文件夹存放在Thinkphp根目录位置(存放位置可以自己选择);
第二步,在根目录/Application/Common/Controller/创建控制层AlismsController.class.php
<?php
namespace CommonController;
use ThinkController;
use AliyunDySDKLiteSignatureHelper;
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 AdminController;
use ThinkController;
use CommonControllerAlismsController;
class LoginController extends Controller{
public function sendCode(){
$code = new AlismsController(); //此类存放在CommonController
$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代码展示在这里就不在展示了;