<?php

namespace frontend\models;

use Yii;
use yii\base\Model; class ChangeMobileSendRequestForm extends Model
{
public $mobile; /**
* @inheritdoc
*/
public function rules()
{
return [
['mobile', 'trim'],
['mobile', 'required'],
['mobile', 'match', 'pattern' => '/^1[3|5|7|8|][0-9]{9}$/'],
['mobile', 'unique', 'targetClass' => '\common\models\User', 'message' => '该手机号已被注册!'],
['mobile', function ($attribute, $params) {
$session = Yii::$app->session;
if ($session->has('mobileChangeNext') && $session['mobileChangeNext'] > time()) {
$this->addError($attribute, '发送验证码过于频繁。');
}
}]
];
} /**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'mobile' => '手机号',
];
} public function sendMsg($runValidation = true)
{
if ($runValidation && !$this->validate()) {
return false;
} $session = Yii::$app->session;
$session['mobileChangeTimeout'] = time() + 600;
$session['mobileChangeNext'] = time() + 60;
$session['mobileChange'] = $this->mobile;
$code=(string) mt_rand(100000, 999999);
$session['mobileChangeVerifyCode'] = $code;
$rest=Yii::$app->smser->send($this->mobile, "亲爱的用户,您的验证码是{$session['mobileChangeVerifyCode']},请于10分钟内使用。如非本人操作,请忽略该短信。");
return ['rest'=>$rest,'code'=>$code];
}
}

在控制器:

    public function actionSendMsg()
{
$model = new ChangeMobileSendRequestForm();
Yii::$app->response->format = Response::FORMAT_JSON; $model->mobile = Yii::$app->request->post('mobile');
$message = '';
$res=$model->sendMsg();
if ($res['rest']) {
return ['status' => 'ok','code'=>$res['code']];
} else {
$message = $model->getFirstError('mobile') or $message = '验证码发送失败,请稍后再试!';
} return ['status' => 'err', 'message' => $message];
}

view视图:

<?php
use yii\helpers\Html;
use yii\helpers\Url;
use yii\bootstrap\ActiveForm;
use frontend\assets\CountdownAsset; /* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */ CountdownAsset::register($this); $this->title = '手机';
$this->params['breadcrumbs'][] = ['label' => '个人中心', 'url' => ['/i']];
$this->params['breadcrumbs'][] = $this->title;
?>
<?php if ($step === '1') :?>
<div class="edit-form">
<div class="callout callout-info">
<p>当前手机号:<?= Yii::$app->user->identity->symbolMobile ?>,如需更换,请输入登录密码进行下一步。</p>
</div>
<?php $form = ActiveForm::begin([
'layout' => 'horizontal',
'fieldConfig' => [
'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
'horizontalCssClasses' => [
'label' => 'col-md-2',
'wrapper' => 'col-md-8',
'hint' => ''
]
]
]) ?>
<?= $form->field($verifyPasswordForm, 'password')->passwordInput() ?>
<div class="form-group">
<div class="col-md-offset-2 col-md-8">
<?= Html::submitButton('下一步 <i class="fa fa-angle-double-right"></i>', ['class' => 'btn btn-warning', 'disabled' => true]) ?>
</div>
</div>
<?php ActiveForm::end()?>
</div>
<?php elseif ($step === '2') :?>
<div class="edit-form">
<?php $form = ActiveForm::begin([
'enableAjaxValidation' => true,
'validateOnChange' => false,
'validateOnBlur' => false,
'layout' => 'horizontal',
'fieldConfig' => [
'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
'horizontalCssClasses' => [
'label' => 'col-md-2',
'wrapper' => 'col-md-8',
'hint' => ''
]
]
]) ?>
<div class="alert alert-success alert-msg-ok hidden" role="alert"></div>
<div class="alert alert-danger alert-msg-err hidden" role="alert"></div>
<?= $form->field($changeMobileForm, 'mobile') ?>
<?= $form->field($changeMobileForm, 'verifyCode', ['template' => "{label}\n{beginWrapper}\n<div class=\"row\">\n<div class=\"col-xs-6\">\n{input}\n</div>\n<div class=\"col-xs-6\">\n" . '<button type="button" class="btn btn-default btn-sendmsg2" data-mobile-target="#changemobileform-mobile" data-loading-text="验证码发送中..." autocomplete="off">发送验证码</button>' . "\n</div>\n</div>{hint}\n{error}\n{endWrapper}"]) ?>
<div class="form-group">
<div class="col-md-offset-2 col-md-8">
<?= Html::submitButton('<i class="fa fa-upload"></i> 提交', ['class' => 'btn btn-warning', 'disabled' => true]) ?>
</div>
</div>
<?php ActiveForm::end()?>
</div>
<?php
$urlSendMsg = Url::to(['/i/send-msg']);
$js = <<<JS
$('.btn-sendmsg2').click(function() {
var target = $(this).attr('data-mobile-target');
var mobile = $(target).val();
var \$form = $(this.form);
\$form.find('.alert-msg-err, .alert-msg-ok').addClass('hidden');
$.ajax({
url : '{$urlSendMsg}',
type : 'post',
data : {mobile : mobile},
dataType : 'json',
success : function (data) {
if (data.status === 'ok') {
alert(data.code); //暂时文本发送取代短信发送
\$form.find('.alert-msg-ok').html('验证码发送成功!<em>60</em> 秒后可再次发送!').removeClass('hidden');
\$form.find('.btn-sendmsg2').prop('disabled', true);
\$form.find('.alert-msg-ok em').countdown((new Date()).getTime() + 59000, function (event) {
$(this).text(event.strftime('%S'));
}).on('finish.countdown', function(event) {
\$form.find('.alert-msg-ok').addClass('hidden');
\$form.find('.btn-sendmsg2').prop('disabled', false);
});
} else {
\$form.find('.alert-msg-err').text(data.message).removeClass('hidden');
}
},
error : function () {
alert('验证码发送失败!');
}
});
});
JS;
$this->registerJs($js);
?>
<?php endif;?>
<?php
$script = <<<SCRIPT
$("form input").bind("change keypress", function() {\$(this.form).find("button").prop("disabled", false);$(this.form).find("input").unbind("change keypress")})
SCRIPT;
$this->registerJs($script);

yii2验证密码->手机号码短信发送>手机短信发送频繁问题的更多相关文章

  1. 利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  2. 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取

    装饰者模式的学习(c#) 案例转自https://www.cnblogs.com/stonefeng/p/5679638.html //主体基类 using System;using System.C ...

  3. C#简单实现发送手机短信

    偶然想起,像编写一个从电脑向手机发送短信的程序,从网上查找到有三种方式:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册;(2) ...

  4. JAVA发送手机短信

    <p><span>JAVA发送手机短信,流传有几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册 ...

  5. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework

    1.调用前组装参数 2.调用发送信息服务脚本   .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...

  6. 第一次发博,发个简单的Java程序发送手机短信验证

    最近在准备一个项目,想的登录时候用手机验证,就通过上网查阅了一下手机验证的实现方法,原来超级简单,下面将一步一步介绍. 1.去中国网建注册一个账号密码,首次注册送五条免费短信和3条免费彩信.具体的网址 ...

  7. 四:java调接口实现发送手机短信验证码功能

    1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...

  8. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

  9. Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_152 短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务 ...

随机推荐

  1. Runloop, 多线程

    Runloop是个死循环,为甚么? 1. 保证程序不退出 2.监听用户的事件, 触摸,时钟,网络事件 UITrackingMode,只能触摸事件,没有触摸事件了,直接就停止了 Runloop: sou ...

  2. ios APP改名推送名字还是旧的

    重启手机就行了 https://community.jiguang.cn/t/ios-app/14759

  3. 查找->动态查找表->键树(无代码)

    文字描述 键树定义 键树又叫数字查找树,它是一棵度大于或等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号.例如,若关键字是数值,则结点中只包含一个数位:若关键字是单词, ...

  4. Python创建第一个django应用

    在helloworld工程的基础上,我们准备创建第一个基于web的django应用,把这个应用名字命名为Guest   1.首先,是如何创建这个应用包,当然第一选择我们可以进入到cmd中,执行如下命令 ...

  5. java Scanner和Random的Demo

    import java.util.Scanner;//导入包 import java.util.Random; public class ScannerDemo{ public static void ...

  6. 【Python全栈-后端开发】Django入门基础

    Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...

  7. 如何快速REPAIR TABLE

    早上到公司,刚准备吃早餐,手机响了,一看是服务器自动重启了.好吧,准备修复数据吧.游戏服的游戏日志使用的是MyISAM.众所周知,MyISAM表在服务器意外宕机或者mysqld进程挂掉以后,MyISA ...

  8. composer安装其实可以很简单 两行命令就解决了

    最近接了一个cakephp项目,就想着用composer安装实施,因为Composer 可以方便地帮你安装项目中声明所依赖的外部工具库(libraries).之前没有接触过,相对比较陌生,但是相信ph ...

  9. wordpress 无法发送邮件

    前几天创建了几个wordpress项目,有些项目中用到了用户注册,但是在实际操作中发现,用户注册无法接收到认证链接,在查找了相关资料后大多归类为几个原因: 服务器本身不支持mail()函数 未配置相关 ...

  10. 安装setuptools

    1.下载地址:https://pypi.python.org/pypi/setuptools 2.这是一个压缩文件,将其解压到安装目录,并进入该文件夹,按住shift键后,在文件夹空白处点击鼠标右键, ...