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 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
PHP 编写的 25个游戏脚本
May 11 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
服务器web工具 php环境下
Dec 29 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
Yii多表联合查询操作详解
Jun 02 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 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之第五天
2006/10/09 PHP
PHP反射机制用法实例
2014/08/28 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
详解php实现页面静态化原理
2017/06/21 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
js切换光标示例代码
2013/10/10 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
django项目搭建与Session使用详解
2018/10/10 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
哈理工毕业生的求职信
2013/12/22 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python