<?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. hadoop 学习笔记

    参考资料:<Hadoop 权威指南> 1 map处理完后,hadoop框架会将结果安装键进行排序,然后将排好的结果传给reduce 2 需要低延迟的应用不适合HDFS,对于低延迟应用HBa ...

  2. 内部排序->其它->地址排序(地址重排算法)

    文字描述 当每个记录所占空间较多,即每个记录存放的除关键字外的附加信息太大时,移动记录的时间耗费太大.此时,就可以像表插入排序.链式基数排序,以修改指针代替移动记录.但是有的排序方法,如快速排序和堆排 ...

  3. python之类中如何判断是函数还是方法

    通常我们认为在类中的函数为方法,类外面声明def为函数,这种说法有点片面 方法1: class Work(object): def show(self): print("执行show方法&q ...

  4. javascript高级技巧篇(作用域安全、防篡改、惰性载入、节流、自定义事件,拖放)

    安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式字符串.每个类在内部都有一个[[Class]]属性 ...

  5. Java中String类两种实例化的区别(转)

    原文:http://blog.csdn.net/wangdajiao/article/details/52087302 一.String类的第一种方式 1.直接赋值 例:String str = &q ...

  6. 内核atom机制

    内核版本:linux2.6.22.6 硬件平台:JZ2440 驱动源码 atom_ipc_poll_key_int_drv.c : #include <linux/module.h> #i ...

  7. winform嵌入word解决方案一

    最近一直想用VC#2005做个内嵌WORD/OFFICE的WINFORM程序,目前主要有以下解决途径: 1.直接通过API把WORD/OFFICE的窗口句柄给放到WINFORM中(感觉较为复杂): 2 ...

  8. SpringBoot-整合log4j日志记录

    新建log4j配置文件 文件名称log4j.properties #log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=info,er ...

  9. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  10. Linux系统启动和内核管理

    Linux组成 由 kernel 和 rootfs 组成 单内核:(进程管理,内存管理,网络管理, 驱动程序,文件系统, 安全功能) /boot/vmlinuz-VERSION-release 辅助的 ...