随着《网络安全法》的出台,有关部门对互联网用户的管理逐步切换到实名制状态,这其中就包括用户评论留言功能需要遵循后台实名前台自愿的原则,未实名的用户将被禁止评论。西枫里博客严格按照相关规定,对用户进行实名制核验。
现在的实名制方式最直接的莫过于通过身份证信息联网公安网络进行核验。这就存在两个问题:
1、用户是否愿意在小网站上上传身份证件?
2、小网站如何与公安网络连接核验?
直接的结果是这样的实名制方式在小网站是彻底行不通。那么只有采取间接实名制方式进行操作。间接实名制有两种方式,一是通过实名制的手机进行核验。二是通过银行卡信息进行核验。
对于小网站来说,绑定手机号无疑是最简单有效的方式。因为手机号的实名制工作已经推行多年。
本文将介绍如何通过手机验证码的方式进行手机的绑定。
首先,需要准备短信平台。也就是可以下行或者上行短信的API接口。本站采用的是阿里云的短信平台,原因只有一个,可以按条付费。使用多少就付多少钱。但多数平台是采用短信包形式的,也就是一个固定条数的短信包,在固定期限内用完,好处就是如果用量大,单价会更低一些。
1、申请阿里云短信:阿里云->云通信->短信服务->免费开通。个人和企业均可,个人开通的话限制更多一些,比如只有一个短信签名,不能发送营销短信等等。开通成功后将获得AppKey、AppSecret、AppCode。
2、需要设置短信签名和短信模版。短信发送是按固定格式发送的,也就是签名+模版形式。
进入控制台,找到云服务。找到短信服务,点击设置
进入设置后,先设置短信签名。一般就是网站名称。比如本站短信签名:西枫里博客。签名用途选择自有产品或业务名。证明文件,个人用户可以不用上传。备注就描述下使用场景,比如本站备注为注册会员绑定手机号发送验证码功能。
模版设置。模版名称任意取一个吧。主要是下方的短信内容这一块。就是写一下发送到用户手上的短信模版。例如本站:您的验证码为${code},验证码10分钟内有效,如非本人操作,请忽略。注意:这里不要写短信签名如果【西枫里博客】短信签名会在系统发送的时候自动调用的。另外就是变量采用变量格式编写。比如验证码,本站就写为${code}。申请说明和前面的短信签名的备注一样就好了。
这些都设置完成后等待阿里云审批吧,一般一个工作日内会完成审批。
接下来就是短信接入部分了,前端部分这里就不说了,主要是一个表单,输入手机号点击获取验证码,可以通过jquery操作。为了方式短信被恶意用来做短信炸弹,需要对发送短信按钮进行倒计时操作,具体实现方式可以通过jquery.cookie来实现,不明白的可以网上搜一下,有很详细的相关教程。这里我们主要来说下后台API的接入。根据我们使用的程序语言(本站为PHP),我们采用appcode简单认证来实现,拷贝demo代码到项目中适当修改
public function sendcode() { $mobiphone=input('mobiphone');//获取接收人手机号 $num=rand(100000,999999);//随机数字作为验证码 session('code',$num);//验证码写入session session('mobiphone',$mobiphone);//用户手机号码写入session session('codetime',time());//验证码发送时间写入session //关键部分,API接口获取的模版变量。参数传递为{“no”:”123456”},我们在平台 上定义的为code,后面的是验证码。使用urlencode转换一下 $ParamString=urlencode('{'."code".':'."$num".'}'); $host = "http://sms.market.alicloudapi.com"; $path = "/singleSendSms"; $method = "GET"; $appcode = "你自己的AppCode"; $headers = array(); array_push($headers, "Authorization:APPCODE " . $appcode); $querys = "ParamString=$ParamString&RecNum=$mobiphone&SignName=西枫里博客&TemplateCode=你自己的模版CODE"; $bodys = ""; $url = $host . $path . "?" . $querys; $curl = curl_init(); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_FAILONERROR, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false);//这里有个小坑,关掉header头信息 if (1 == strpos("$".$host, "https://")) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); } $data=curl_exec($curl); $arr=json_decode($data,true); if($arr['success']==true){ return 1; }else{ return 2; } }
这就完成的短信发送操作了。后面将对验证码进行站内处理
public function bind() { if(request()->isPost()){ $path=cookie('path'); $data=input('param.');//接收表单数据 //三条信息比对。 if($data['mobiphone']!=session('mobiphone')){ $this->error('不能更换手机号绑定'); } if($data['code']!=session('code')){ $this->error('短信验证码不正确'); } if(time()>(session('codetime')+600)){ $this->error('验证码已超时,请重新获取'); } $edit=Db::name('user')->where('id',session('uid'))->update(['mobiphone'=>$data['mobiphone'],'email'=>$data['email'],'status'=>1]); if($edit){ $this->success('实名认证成功',$path); }else{ $this->error('实名认证失败'); } }else{ $this->error('非法请求'); } }
由于本人采用thinkPHP框架操作,相关函数仅供参考,根据您自己的程序环境自行定义。
至此,一个完整的短信验证码就开发完成了。最重要的就是解决了实名制的问题。