php实现的IMEI限制的短信验证码发送类
php实现的IMEI限制的短信验证码发送类
<?php
classApi_Sms{
constEXPIRE_SEC=1800;//过期时间间隔
constRESEND_SEC=60;//重发时间间隔
constONE_DAY_FREQ=5;//每日向同一个手机号发短信的次数
constONE_DAY_IMEI_COUNT=3;//每日向同一个手机号发送短信的IMEI个数
public$error=array();
/**
*向指定手机号发送验证码
*@param$mobile
*@param$imei
*@returnbool
*/
publicfunctionsendVerifyCode($mobile,$imei){
if(!$this->isMobile($mobile)){
$this->error=array('code'=>-1,'msg'=>'这个手机号很奇葩哦,请正确输入后重试');
returnfalse;
}
$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分钟内发出,请耐心等待');
returnfalse;
}
//手机号及IMEI限制
$sendCnt=$redis->zScore($limitKey,$imei);
if($sendCnt&&$sendCnt>=self::ONE_DAY_FREQ){
$this->error=array('code'=>-1,'msg'=>'没收到短信?请稍等或检查短信是否被屏蔽');
returnfalse;
}
$imeiCnt=$redis->zCard($limitKey);
if($imeiCnt>=self::ONE_DAY_IMEI_COUNT&&!$sendCnt){
$this->error=array('code'=>-1,'msg'=>'已超过验证码发送设备限制');
returnfalse;
}
//获取验证码
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('+1day'))));
}
return$result;
}
/**
*向指定手机号发送短信
*@param$mobile
*@param$content
*@returnbool
*/
publicfunctionsend($mobile,$content){
//TODO调用具体服务商API
returntrue;
}
/**
*判断是否为合法手机号
*@param$mobile
*@returnbool
*/
privatefunctionisMobile($mobile){
if(preg_match('/^1\d{10}$/',$mobile))
returntrue;
returnfalse;
}
/**
*验证短信验证码
*@param$mobile
*@param$vc
*@returnbool
*/
publicfunctioncheckVerifyCode($mobile,$vc){
$vcKey='VC_'.$mobile;
$vcData=json_decode(Api_Common::redis()->get($vcKey),true);
if($vcData&&$vcData['vc']===$vc){
returntrue;
}
returnfalse;
}
/**
*清除验证码
*@param$mobile
*/
publicfunctioncleanVerifyCode($mobile){
$redis=Api_Common::redis();
$vcKey='VC_'.$mobile;
$limitKey='VC_LIMIT_'.$mobile;
$redis->del($vcKey);
$redis->del($limitKey);
}
}
另付其他网友实现的短信验证码代码
<?
/*--------------------------------
功能:中国短信网PHPHTTP接口发送短信
修改日期: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='中国短信网PHPHTTP接口';//内容
//即时发送
$res=sendSMS($uid,$pwd,$mobile,$content);
echo$res;
//定时发送
/*
$time='2010-05-2712:11';
$res=sendSMS($uid,$pwd,$mobile,$content,$time);
echo$res;
*/
functionsendSMS($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;
}
}
functionpostSMS($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$fileHTTP/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]);
returnimplode("",$receive);
}
}
?>
以上所述就是本文的全部内容了,希望大家能够喜欢。