ThinkPHP3.2.3框架下接入阿里云短信服务接口实现:注册登录

时间:2022-11-26 10:29:33

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

  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代码展示在这里就不在展示了;