php实现的IMEI限制的短信验证码发送类


Posted in PHP onMay 05, 2015

php实现的IMEI限制的短信验证码发送类

<?php
class Api_Sms{
  const EXPIRE_SEC = 1800;    // 过期时间间隔
  const RESEND_SEC = 60;     // 重发时间间隔
  const ONE_DAY_FREQ = 5;    // 每日向同一个手机号发短信的次数
  const ONE_DAY_IMEI_COUNT = 3; // 每日向同一个手机号发送短信的IMEI个数
 
  public $error = array();
 
 
  /**
   * 向指定手机号发送验证码
   * @param $mobile
   * @param $imei
   * @return bool
   */
  public function sendVerifyCode($mobile, $imei) {
    if(!$this->isMobile($mobile)) {
      $this->error = array('code' => -1, 'msg' => '这个手机号很奇葩哦,请正确输入后重试');
      return false;
    }
 
    $redis = Api_Common::redis();
    $vcKey = 'VC_'.$mobile;
    $limitKey = 'VC_LIMIT_'.$mobile;
 
    // 验证码重发限制
    $data = json_decode($redis->get($vcKey), true);
    if($data && time() < $data['resend_expire']) {
      $this->error = array('code' => -1, 'msg' => '短信已在1分钟内发出,请耐心等待');
      return false;
    }
 
    // 手机号及IMEI限制
    $sendCnt = $redis->zScore($limitKey, $imei);
    if($sendCnt && $sendCnt >= self::ONE_DAY_FREQ) {
      $this->error = array('code' => -1, 'msg' => '没收到短信?请稍等或检查短信是否被屏蔽');
      return false;
    }
    $imeiCnt = $redis->zCard($limitKey);
    if($imeiCnt >= self::ONE_DAY_IMEI_COUNT && !$sendCnt) {
      $this->error = array('code' => -1, 'msg' => '已超过验证码发送设备限制');
      return false;
    }
 
    // 获取验证码
    if(!$data) {
      $vc = strval(rand(100000, 999999));
      $data = array('vc' => $vc, 'resend_expire' => 0);
      $redis->set($vcKey, json_encode($data));
      $redis->expire($vcKey, self::EXPIRE_SEC); // 设置验证码过期时间
    }
    $vc = $data['vc'];
 
    $content = '安全验证码:'.$vc;
    $result = $this->send($mobile, $content);
    if($result) {
      // 重设重发时限
      $data['resend_expire'] = time() + self::RESEND_SEC;
      $ttl = $redis->ttl($vcKey);
      $redis->set($vcKey, json_encode($data));
      $redis->expire($vcKey, $ttl);
 
      // 设置手机号与IMEI限制
      $redis->zIncrBy($limitKey, 1, $imei);
      $redis->expireAt($limitKey, strtotime(date('Y-m-d',strtotime('+1 day'))));
    }
    return $result;
  }
 
  /**
   * 向指定手机号发送短信
   * @param $mobile
   * @param $content
   * @return bool
   */
  public function send($mobile, $content){
    // TODO 调用具体服务商API
    return true;
  }
 
  /**
   * 判断是否为合法手机号
   * @param $mobile
   * @return bool
   */
  private function isMobile($mobile) {
    if(preg_match('/^1\d{10}$/', $mobile))
      return true;
    return false;
  }
 
  /**
   * 验证短信验证码
   * @param $mobile
   * @param $vc
   * @return bool
   */
  public function checkVerifyCode($mobile, $vc) {
    $vcKey = 'VC_'.$mobile;
    $vcData = json_decode(Api_Common::redis()->get($vcKey), true);
    if($vcData && $vcData['vc'] === $vc) {
      return true;
    }
    return false;
  }
 
  /**
   * 清除验证码
   * @param $mobile
   */
  public function cleanVerifyCode($mobile) {
    $redis = Api_Common::redis();
    $vcKey = 'VC_'.$mobile;
    $limitKey = 'VC_LIMIT_'.$mobile;
    $redis->del($vcKey);
    $redis->del($limitKey);
  }
}

另付其他网友实现的短信验证码代码

<?
/*--------------------------------
功能:   中国短信网PHP HTTP接口 发送短信
修改日期:  2009-04-08
说明:   http://http.c123.com/tx/?uid=用户账号&pwd=MD5位32密码&mobile=号码&content=内容
状态:
  100 发送成功
  101 验证失败
  102 短信不足
  103 操作失败
  104 非法字符
  105 内容过多
  106 号码过多
  107 频率过快
  108 号码内容空
  109 账号冻结
  110 禁止频繁单条发送
  111 系统暂定发送
  112 号码不正确
  120 系统升级
--------------------------------*/
$uid = '9999';   //用户账号
$pwd = '9999';   //密码
$mobile = '13912341234,13312341234,13512341234,02122334444';  //号码
$content = '中国短信网PHP HTTP接口';    //内容
//即时发送
$res = sendSMS($uid,$pwd,$mobile,$content);
echo $res;
 
//定时发送
/*
$time = '2010-05-27 12:11';
$res = sendSMS($uid,$pwd,$mobile,$content,$time);
echo $res;
*/
function sendSMS($uid,$pwd,$mobile,$content,$time='',$mid='')
{
  $http = 'http://http.c123.com/tx/';
  $data = array
    (
    'uid'=>$uid,         //用户账号
    'pwd'=>strtolower(md5($pwd)),  //MD5位32密码
    'mobile'=>$mobile,        //号码
    'content'=>$content,     //内容
    'time'=>$time,    //定时发送
    'mid'=>$mid           //子扩展号
    );
  $re= postSMS($http,$data);     //POST方式提交
  if( trim($re) == '100' )
  {
    return "发送成功!";
  }
  else
  {
    return "发送失败! 状态:".$re;
  }
}
 
function postSMS($url,$data='')
{
  $row = parse_url($url);
  $host = $row['host'];
  $port = $row['port'] ? $row['port']:80;
  $file = $row['path'];
  while (list($k,$v) = each($data)) 
  {
    $post .= rawurlencode($k)."=".rawurlencode($v)."&"; //转URL标准码
  }
  $post = substr( $post , 0 , -1 );
  $len = strlen($post);
  $fp = @fsockopen( $host ,$port, $errno, $errstr, 10);
  if (!$fp) {
    return "$errstr ($errno)\n";
  } else {
    $receive = '';
    $out = "POST $file HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Content-type: application/x-www-form-urlencoded\r\n";
    $out .= "Connection: Close\r\n";
    $out .= "Content-Length: $len\r\n\r\n";
    $out .= $post;   
    fwrite($fp, $out);
    while (!feof($fp)) {
      $receive .= fgets($fp, 128);
    }
    fclose($fp);
    $receive = explode("\r\n\r\n",$receive);
    unset($receive[0]);
    return implode("",$receive);
  }
}
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
destoon二次开发常用数据库操作
Jun 21 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
PHP上传文件时自动分配路径的方法
Jan 09 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
php 如何获取文件的后缀名
Jun 05 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 PHP
php自定义hash函数实例
May 05 #PHP
php结合安卓客户端实现查询交互实例
May 05 #PHP
php为字符串前后添加指定数量字符的方法
May 04 #PHP
支持中文、字母、数字的PHP验证码
May 04 #PHP
php替换字符串中间字符为省略号的方法
May 04 #PHP
php中JSON的使用方法
Apr 30 #PHP
PHP使用CURL实现多线程抓取网页
Apr 30 #PHP
You might like
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
php长字符串定义方法
2012/07/12 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php时间戳转换代码详解
2019/08/04 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
bootstrap响应式工具使用详解
2017/11/29 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
Python图算法实例分析
2016/08/13 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
详解Python高阶函数
2020/08/15 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
用python制作个视频下载器
2021/02/01 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
毕业生欢送会主持词
2014/03/31 职场文书
2014年变电站工作总结
2014/12/19 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书