TP5.1使用创蓝短信实现验证码的发送以及频控
代码较多所以就不做过多的文字说明了,部分说明直接作为代码注释,有问题可以评论提出
用于存放短信发送日志的数据表结构:
//接口返回Json数据public function jsonOk($data='',$code=200,$msg="请求成功"){return Json(array("code"=>$code,"msg"=>$msg,"data"=>$data));}//供前端调用的发送短信验证码接口public function getMobileCode(){$data = Request::param();//用TP的验证器做接收数据的验证$validate = Validate::rule(['mobile|手机号码'=>'require|mobile']);$validateRes = $validate->check($data);if(!$validateRes){return $this->jsonOk(NULL,400,$validate->getError());}$verifyCode = rand(100000,999999);//创蓝短信在平台认证后只能使用指定字段发送短信,否则创蓝接口会报签名错误,签名指的是【XXXX】部分,其中XXXX要和平台对应$mobileMsg = "【XXXX】验证码为:".$verifyCode.",五分钟内有效。";$mobile = $data['mobile'];return $this->sendSMS(0,$mobile,$mobileMsg,'getPhoneVerifyCode',$verifyCode);}//对接口请求信息根据日志数据表做基本的限制并请求创蓝接口发送短信,并对接口返回JSON做解析判断是否成功并返回给前端结果public function sendSMS($smsSrc,$phoneNumber,$content,$smsFunc,$verfyCode){$userId = '0';$ip = $_SERVER["REMOTE_ADDR"];//获取该手机号今日已发验证码次数以及最后一条验证码的发送时间$date = date('Y-m-d');$smsRs = Db::table('s_log_sms')->field("count(smsId) counts,max(createTime) createTime")->where(["smsPhoneNumber"=>$phoneNumber])->whereTime('createTime', 'between', [$date.' 00:00:00', $date.' 23:59:59'])->find();//获取请求IP地址今日已发验证码次数以及最后一条验证码的发送时间$ipRs = Db::table('s_log_sms')->field("count(smsId) counts,max(createTime) createTime")->where(["smsIP"=>$ip])->whereTime('createTime', 'between', [$date.' 00:00:00', $date.' 23:59:59'])->find();//每个手机每天只能接收5条,且间隔不小于60秒,每个IP每天只能发送50条,且间隔不小于60秒//创蓝平台中可以设置每个手机号每日最多发送多少条,但是即使超过接口信息也会返回成功,所以要做后台判断if(($smsRs['counts']>=5||($smsRs['createTime'] !='' && ((time()-strtotime($smsRs['createTime']))<60)))||($ipRs['counts']>50||($ipRs['createTime']!='' && ((time()-strtotime($ipRs['createTime']))<60)))){if($smsRs['counts'] >= 5||$ipRs['counts']>50) {return $this->jsonOk(NULL,400,"已达今日发送上限");}return $this->jsonOk(NULL,400,"请勿频繁发送短信");}//POST请求体中account和password填写你创蓝平台对应的$postArr = array ('account' => 'XXXXXXXXXX,'password' => 'XXXXXXXXXX','msg' => $content,'phone' => $phoneNumber,'report' => false);$postResJson = $this->curlPost( 'https://smsbj1.253.com/msg/send/json', $postArr);$postRes = json_decode($postResJson);//data为需要写入数据表的日志数据$data = array();$data['smsSrc'] = $smsSrc;$data['smsUserId'] = $userId;$data['smsPhoneNumber'] = $phoneNumber;$data['smsContent'] = $content;$data['smsReturnCode'] = $postResJson;$data['smsCode'] = $verfyCode;$data['smsIP'] = $ip;$data['smsFunc'] = $smsFunc;$data['createTime'] = date('Y-m-d H:i:s');Db::table('s_log_sms')->insert($data);if ($postRes->code == 0) {return $this->jsonOk(NULL,200,"验证码发送成功");} else {//创蓝接口返回的请求结果中code字段若为0则发送成功,若不为0则可以通过errorMsg字段获取错误信息return $this->jsonOk(NULL,400,"验证码发送失败:".$postRes->errorMsg);}}//使用CURL请求创蓝短信接口public function curlPost($url,$postFields){$postFields = json_encode($postFields);$ch = curl_init ();curl_setopt( $ch, CURLOPT_URL, $url );curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );curl_setopt( $ch, CURLOPT_POST, 1 );curl_setopt( $ch, CURLOPT_POSTFIELDS, $postFields);curl_setopt( $ch, CURLOPT_TIMEOUT,1);curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);$ret = curl_exec ( $ch );if (false == $ret) {$result = curl_error( $ch);} else {$rsp = curl_getinfo( $ch, CURLINFO_HTTP_CODE);if (200 !== $rsp) {$result = "请求状态 ". $rsp . " " . curl_error($ch);return $this->jsonOk(NULL,400,$result);} else {$result = $ret;}}curl_close ( $ch );return $result;}
成功请求后查看日志表中数据:
TP5.1使用创蓝短信实现验证码的发送以及频控相关推荐
- java实现创蓝短信
前段时间因为节约成本,公司改用创蓝短信,以此记录一下自己从0到最后写完这个接口(不喜勿喷),有任何问题欢迎私信小弟' 第一步习惯性观看官网api,官网地址是https://www.253.com,找到 ...
- MyCnCart之创蓝短信升级版
创蓝短信接口整合进入Mycncart系统以来,众多客户使用该短信接口,对于只是针对国内进行运营的网站来讲,默认接口功能足以满足需要. 如果您的网站既从事国内运营销售,也从事国外的商品销售,则可以使用创 ...
- 【转】前端验证码倒计时、后台发送验证码、创蓝短信接口
前端代码:倒计时 <!DOCTYPE html> <html> <head lang="en"> <meta charset=&q ...
- 前端验证码倒计时、后台发送验证码、创蓝短信接口
前端代码:倒计时 <!DOCTYPE html> <html> <head lang="en"> <meta charset=&q ...
- Fastadmin创蓝短信插件源码
<?php namespace addons\clsms\library; use think\Config;//创蓝SMS短信发送--如有问题,请加微信 andiff424 QQ:165607 ...
- 通过云片网实现短信以及验证码的发送
最近做的这个项目是一个类似于众筹的网站,众所周知,现在主流的网站都会涉及到注册验证码的发送以及验证,购买商品以及送礼这些都可能会有短信的提醒,那么这些短信都是怎么实现的呢?这个项目中需要实现验证码以及 ...
- PHP对接 创蓝短信
//无需鉴权 const API_SEND_URL = 'http://smssh1.253.com/msg/send/json'; //创蓝发送短信接口URL const API_ACCOUNT = ...
- ZABBIX短信告警-创蓝短信平台
1.登录短信平台后台,查看教程并下载不同脚本语言模板,填入以下信息 #创蓝接口域名 host = "smssh1.253.com" #创蓝API账号 account = " ...
- fastadmin创蓝短信插件第二版
<?php namespace addons\clsms; use think\Addons; /*** 插件*/ class Clsms extends Addons {/*** 插件安装方法 ...
最新文章
- android 线性布局位置,android – 如何在线性布局中更改视图的位置.
- 猜数字游戏,正确率为零
- 关于对 NUMA 理解(学习笔记,便于以后查阅)
- Reverse Vowels of a String
- 键盘连击测试_测试梗欢迎补充
- python小案例下载_python 小案例demo06
- linux opencv cmake,OpenCV基础篇之使用CMake管理工程
- 什么时候需要任务调度?
- python iocp_[网络开发]IOCP完整例子
- asp.net高校宿舍后勤管理系统案例
- 音乐剪辑_android版,全能视频音乐剪辑大师
- 会计计算机,什么是好的计算机会计软件?
- 菜鸟CTO谈物流科技:科学家也要贴地飞行
- 前端实现自定义表情【微信表情】
- 软件工程之软件设计③(概要设计说明书,详细设计说明书)
- day7-字典和集合作业
- ubuntu 网卡流量_Ubuntu下使用nload查看网卡实时流量
- java身份证号/手机号隐藏中间几位
- 自定义照相机官方指南
- Android第三方登录详解2
热门文章
- 软件测试行业的未来趋势及规划
- c语言字符集的作用,1.属于C语言字符集中可显示字符的是()
- Python爬取喜马拉雅有声小说【转载】
- 星球乐园 | 害怕水逆是因为你已经很久没有读完一本书
- Mitaka正式发布 盘点OpenStack中国贡献
- 【投资心经】一位资深操盘手的吐血总结
- Matlab基于元胞自动机实现NaSch模型
- 链克迎来大涨?迅雷:这只是前戏,“王炸”还在后头呢!
- 音视频QoE核心指标
- ..\Src\INA226.c(142): error: #20: identifier “GPIO_IDR_IDR9“ is undefined