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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
使用无限生命期Session的方法
Oct 09 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
thinkphp实现上一篇与下一篇的方法
Dec 08 PHP
php实现无限级分类(递归方法)
Aug 06 PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
YII框架关联查询操作示例
Apr 29 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
php中实现记住密码自动登录的代码
2011/03/02 PHP
php获取文件大小的方法
2014/02/26 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python生成并处理uuid的实现方式
2020/03/03 Python
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
求职简历中自我评价
2014/01/28 职场文书
中学生运动会入场词
2014/02/12 职场文书
新年寄语大全
2014/04/12 职场文书
教师考核表个人总结
2015/02/12 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang
Nginx配置使用详解
2022/07/07 Servers
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python