Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert einen SMS-Bestätigungscode zur Überprüfung der Mobiltelefonnummer und der IMEI

PHP implementiert einen SMS-Bestätigungscode zur Überprüfung der Mobiltelefonnummer und der IMEI

墨辰丷
墨辰丷Original
2018-06-11 10:37:563428Durchsuche

Was dieser Artikel mit Ihnen teilt, ist eine PHP-Klasse, die die Mobiltelefonnummer und die IMEI überprüfen und den SMS-Verifizierungscode senden kann. Ich kann sie jedem empfehlen, der sie benötigt.

Die von PHP implementierte IMEI-beschränkte SMS-Verifizierungscode-Sendeklasse

<?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(&#39;code&#39; => -1, &#39;msg&#39; => &#39;这个手机号很奇葩哦,请正确输入后重试&#39;);
      return false;
    }
 
    $redis = Api_Common::redis();
    $vcKey = &#39;VC_&#39;.$mobile;
    $limitKey = &#39;VC_LIMIT_&#39;.$mobile;
 
    // 验证码重发限制
    $data = json_decode($redis->get($vcKey), true);
    if($data && time() < $data[&#39;resend_expire&#39;]) {
      $this->error = array(&#39;code&#39; => -1, &#39;msg&#39; => &#39;短信已在1分钟内发出,请耐心等待&#39;);
      return false;
    }
 
    // 手机号及IMEI限制
    $sendCnt = $redis->zScore($limitKey, $imei);
    if($sendCnt && $sendCnt >= self::ONE_DAY_FREQ) {
      $this->error = array(&#39;code&#39; => -1, &#39;msg&#39; => &#39;没收到短信?请稍等或检查短信是否被屏蔽&#39;);
      return false;
    }
    $imeiCnt = $redis->zCard($limitKey);
    if($imeiCnt >= self::ONE_DAY_IMEI_COUNT && !$sendCnt) {
      $this->error = array(&#39;code&#39; => -1, &#39;msg&#39; => &#39;已超过验证码发送设备限制&#39;);
      return false;
    }
 
    // 获取验证码
    if(!$data) {
      $vc = strval(rand(100000, 999999));
      $data = array(&#39;vc&#39; => $vc, &#39;resend_expire&#39; => 0);
      $redis->set($vcKey, json_encode($data));
      $redis->expire($vcKey, self::EXPIRE_SEC); // 设置验证码过期时间
    }
    $vc = $data[&#39;vc&#39;];
 
    $content = &#39;安全验证码:&#39;.$vc;
    $result = $this->send($mobile, $content);
    if($result) {
      // 重设重发时限
      $data[&#39;resend_expire&#39;] = 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(&#39;Y-m-d&#39;,strtotime(&#39;+1 day&#39;))));
    }
    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(&#39;/^1\d{10}$/&#39;, $mobile))
      return true;
    return false;
  }
 
  /**
   * 验证短信验证码
   * @param $mobile
   * @param $vc
   * @return bool
   */
  public function checkVerifyCode($mobile, $vc) {
    $vcKey = &#39;VC_&#39;.$mobile;
    $vcData = json_decode(Api_Common::redis()->get($vcKey), true);
    if($vcData && $vcData[&#39;vc&#39;] === $vc) {
      return true;
    }
    return false;
  }
 
  /**
   * 清除验证码
   * @param $mobile
   */
  public function cleanVerifyCode($mobile) {
    $redis = Api_Common::redis();
    $vcKey = &#39;VC_&#39;.$mobile;
    $limitKey = &#39;VC_LIMIT_&#39;.$mobile;
    $redis->del($vcKey);
    $redis->del($limitKey);
  }
}

Zusätzliche SMS-Verifizierungscodes, die von anderen Internetnutzern implementiert wurden

<?
/*--------------------------------
功能:   中国短信网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 = &#39;9999&#39;;   //用户账号
$pwd = &#39;9999&#39;;   //密码
$mobile = &#39;13912341234,13312341234,13512341234,02122334444&#39;;  //号码
$content = &#39;中国短信网PHP HTTP接口&#39;;    //内容
//即时发送
$res = sendSMS($uid,$pwd,$mobile,$content);
echo $res;
 
//定时发送
/*
$time = &#39;2010-05-27 12:11&#39;;
$res = sendSMS($uid,$pwd,$mobile,$content,$time);
echo $res;
*/
function sendSMS($uid,$pwd,$mobile,$content,$time=&#39;&#39;,$mid=&#39;&#39;)
{
  $http = &#39;http://http.c123.com/tx/&#39;;
  $data = array
    (
    &#39;uid&#39;=>$uid,         //用户账号
    &#39;pwd&#39;=>strtolower(md5($pwd)),  //MD5位32密码
    &#39;mobile&#39;=>$mobile,        //号码
    &#39;content&#39;=>$content,     //内容
    &#39;time&#39;=>$time,    //定时发送
    &#39;mid&#39;=>$mid           //子扩展号
    );
  $re= postSMS($http,$data);     //POST方式提交
  if( trim($re) == &#39;100&#39; )
  {
    return "发送成功!";
  }
  else
  {
    return "发送失败! 状态:".$re;
  }
}
 
function postSMS($url,$data=&#39;&#39;)
{
  $row = parse_url($url);
  $host = $row[&#39;host&#39;];
  $port = $row[&#39;port&#39;] ? $row[&#39;port&#39;]:80;
  $file = $row[&#39;path&#39;];
  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 = &#39;&#39;;
    $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);
  }
}
?>

Zusammenfassung: Oben Ich hoffe, dass der gesamte Inhalt dieses Artikels für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:

PHP-Methoden für String-Funktionsoperationen

PHP-Methoden für Verzeichnisoperationen

PHP verwendet die Snoopy-Klasse, um das Seiten-Crawling zu implementieren

Das obige ist der detaillierte Inhalt vonPHP implementiert einen SMS-Bestätigungscode zur Überprüfung der Mobiltelefonnummer und der IMEI. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn