12月03th

thinkphp接入短信通知验证码_怎么防止被刷短信

DIY编程技术2354℃我来说两句!

信息通知在当今网络信息时代是非常重要的一个平台对客户的联络手段,对于多元化的网络社会,不断出现的新型通知手段越来越多,微信公众号,语音通知,短信通知,邮件通知等等,对于中小型平台,本人觉得最经济和实用而且送达率最高的还是最原始的短信通知。那么对于初级技术人员,对于短信通知这个部分肯定要有所了解,包括平台质量,发送要求和对接。

从使用过的短信平台来说,第一,阿里云短信,费用最便宜,送达及时,如果你有阿里云账号,这是首选;第二,网建 sms,不用报备,短信相对价格还可以,送达速度只要找客服转到 106 通道之后基本 5 秒内,如果不想认证的用户推荐用网建的,也不用实名,短信也不用报备,对接也非常方便,送达速度和价格都能接受。 

那么我就以 thinkphp 为例子,从短信注册验证码开始演示一下怎么对接短信平台。注册验证码相对来说要复杂一点,这里不得不说一点,怎么来防止被别人盗刷短信呢?因为如果要从严谨的角度来说,注册环节是暴露在所有用户面前的部分,是最有可能被盗刷短信的地方,一般情况下是在发送之前加一个图形验证码,如果图形验证码和手机号码判断正确,那么就能成功发送;发送成功,收到验证码之后,又必须做两个判断,第一,判断接收的手机号码是否为输入的那个号码,第二,判断验证码是否和发送时候生成的一致。话不多说,直接上代码,第一部分,thinkphp 前台 html 页面直接嵌入代码,通过 js 触发验证码的发送,以及倒计时重新发送。

<script type="text/javascript">

var wait = 60;

function time(o) {

if ($("#phone").val() == "") {

layer.msg("请填写手机号");

return false;

}

if ($("#code").val() == "") {

layer.msg("请填写图形验证码");

return false;

}

$.post("{:U('Reg/sendPhone')}", { phone: $("#phone").val() ,code: $("#code").val()}, function(msg) {

if(msg.sf==0){

layer.msg("验证码已经发送,注意查收");

}else{

layer.msg("发送失败");

}

},'json');

okssss(o);

}

var wait = 60;

function okssss(o) {

if (wait == 0) {

$(o).removeAttr("disabled");

$(o).val("免费获取验证码");

wait = 120;

} else {

$(o).attr("disabled", true);

$(o).val("重新发送(" + wait + ")");

wait--;

setTimeout(function() {

okssss(o);

},

1000);

}

}

</script>

前台 html 页面通过{:U('Reg/sendPhone')}方法来提交发送请求,sendphone 里面要加一个图形验证码的判断,然后 session 保存此次请求的手机号码和随机生成的验证码,以备提交表格的时候使用。

sendPhone 方法的代码如下:

if (IS_POST) {if (IS_POST) {        $phone = $_POST['phone'];  $code = $_POST['code'];if(!$this->check_verify($code)){                $this->ajaxReturn( array('nr'=>'验证码错误!','sf'=>1) );             } else{         $rand =rand(100000,900000);                session('CHECK_CODE',$rand);        session('PHONE_NUM',$phone);        $info = sendSMS($phone,"你的验证码是".$rand.",请勿泄露。【汇鑫联华社区】");        preg_match('/stat=([\d]{3})/', $info, $matches);        if(is_array($matches) && $matches[1] == 100){            session('check_status',1);        }else{             session('check_status',0);        }     $this->ajaxReturn(array('nr'=>'发送成功!','sf'=>0)); }}

上面是整个核心发送流程,那么其中 sendSMS 是短信平台的 API 发送接口,不同的平台可能发送的方法不一样,有 post 和 get 一般这两种方法发送,然后返回结果也要根据不同的短信平台返回值来判断是否发送成功,上面案例中返回值是 100 就证明发送成功。以下附一段 sendSMS 代码

function sendSMS($mobile,$content,$mobileids='',$http='http://xxxx 短信平台 API 接口/'){

$uid = 'xxx';////短信平台账号

$pwd = 'xxxx';////短信平台密钥

return send($http,$uid,$pwd,$mobile,$content,$mobileids);

}

function send($http,$uid,$pwd,$mobile,$content,$mobileids,$time='',$mid='')

{

$data = array(

'uid'=> $uid, //用户账号

'pwd'=>md5($pwd.$uid), //MD5 位 32 密码,密码和用户名拼接字符

'mobile'=>$mobile, //号码

'content'=>$content, //内容

'mobileids'=>$mobileids,

'time'=>$time, //定时发送

);

$re= postSMS($http,$data); //POST 方式提交

file_put_contents("sms.txt", $re.$content);

return $re;

}

function postSMS($url,$data='')

{

$port="";

$post="";

$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);

}

}

上面是某短信平台的 API 发送接口 demo,特别要注意的是,在发送的时候有的短信平台要求的编码不一样,一定要按照短信平台编码要求来预处理发送的内容,不然发送出去是乱码。接下来提交表格的时候,我们就直接判断短信验证码和接收的手机号码是否和发送请求的手机号码一样就可以了
综上所述,短信接口中要注意几点:1、防止短信被盗刷,最好添加一个图形验证码。2、添加手机号码是否一致的判断来避免手机代接收的情况。

本文出自:DIY博客园,链接:https://www.diybloghome.com/prology/2263.html,转载请注明!