当前位置: 首页 > 后端技术 > PHP

每日划水:短信验证码开发实例

时间:2023-03-30 03:55:39 PHP

前言我一生的文章都会放在这里,我的博客,希望每一行代码,每一段文字,都能对你有所帮助。https://github.com/CrazyCodes...大家好,我是CrazyCodes。在日常开发中,有没有遇到需要开发发送短信验证码的接口?短信验证码发送如何处理?在这篇文章中,我将分享短信验证码发送的设计。初学者以聚合数据为例。初学者会做百度找一串熟悉又陌生的代码(代码我都记不住了)//Initialize$curl=curl_init();//设置捕获的urlcurl_setopt($curl,CURLOPT_URL,'http://www.baidu.com');//将头文件信息设置为数据流输出curl_setopt($curl,CURLOPT_HEADER,1);//将获取的信息设置为文件流形式返回,而不是直接输出。curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);//设置post方式提交curl_setopt($curl,CURLOPT_POST,1);//设置post数据$post_data=array("username"=>"coder","password"=>"12345");curl_setopt($curl,CURLOPT_POSTFIELDS,$post_data);//执行命令$data=curl_exec($curl);//关闭URL请求curl_close($curl);//显示获取到的数据print_r($数据);官方还给出了一段代码,可维护性稍差('content-type:text/html;charset=utf-8');$sendUrl='http://v.juhe.cn/sms/send';//短信接口URL$smsConf=array('key'=>'******************',//你申请的APPKEY'mobile'=>'1891351****',//接收短信的用户手机号码'tpl_id'=>'111',//您申请的短信模板ID,根据实际情况修改'tpl_value'=>'#code#=1234&#company#=aggregateddata'//你设置的模板变量,根据实际情况修改);$content=juhecurl($sendUrl,$smsConf,1);//请求发送短信if($content){$result=json_decode($content,true);$error_code=$result['error_code'];if($error_code==0){//状态为0,表示短信发送成功echo"short消息发送成功,SMSID:".$result['result']['sid'];}else{//状态不为0,表示失败$msg=$result['reason'];echo"短信发送失败(".$error_code."):".$msg;}}else{//返回内容异常,可根据下方业务逻辑修改。echo"请求发送短信失败";}/***请求接口返回的内容*@paramstring$url[请求的URL地址]*@paramstring$params[请求的参数]*@paramint$ipost[是否使用POST格式]*@返回字符串*/functionjuhecurl($url,$params=false,$ispost=0){$httpInfo=array();$ch=curl_init();curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0(WindowsNT5.1)AppleWebKit/537.22(KHTML,likeGecko)Chrome/25.0.1364.172Safari/537.22');curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);curl_setopt($ch,CURLOPT_TIMEOUT,30);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);如果)($ispost{curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$params);curl_setopt($ch,CURLOPT_URL,$url);}else{if($params){curl_setopt($ch,CURLOPT_URL,$url.'?'.$params);}else{curl_setopt($ch,CURLOPT_URL,$url);}}$response=curl_exec($ch);if($response===FALSE){//echo"cURLError:".卷曲错误($ch);返回假;}$httpCode=curl_getinfo($ch,CURLINFO_HTTP_CODE);$httpInfo=array_merge($httpInfo,curl_getinfo($ch));curl_close($ch);return$response;}这么看,“还不错,就是想改一遍,至于改什么,我也不知道,就是想改一遍”界面,那我就开始我自己的表演。首先阅读这篇文章。你需要了解设计模式中的策略模式。依赖注入接口(interface)接口用于规范发送短信的动作。namespaceApp\Api\Common;interfaceMessageUseInterface{publicfunctioninsert($mobile,$code);}要求所有发送短信的动作必须继承该接口并实现insert方法。短信接口设置好之后,我们还需要设置一个父类,就是短信类。具体实现如下:namespaceApp\Api\Common;useGuzzleHttp\Client;classMessage{/***@param$mobile*@param$tpl*@param$code*@paramMessageUseInterface$use*@returnmixed*@throws\GuzzleHttp\Exception\GuzzleException*/publicfunctionsend($mobile,$tpl,$code,MessageUseInterface$use){$client=newClient();}$response=$client->request('POST','http://v.juhe.cn/sms/send',['form_params'=>['mobile'=>$mobile,'tpl_id'=>$tpl,'tpl_value'=>sprintf('#code#=%s',$code),'key'=>'xxxxxxxxxxxx']]);$use->insert($mobile,$code);返回json_decode($response->getBody(),true);}}该类创建send方法,参数为mobile、接收短信验证码的手机号码、tpl_id、聚合数据提供的模板代码、MessageUseInterface发送的验证码接口的具体实现创建是使用GuzzleHttp实现POST请求,按照聚合数据规定发送验证码。$use->insert($mobile,$code);就是调用通过MessageUseInterface传入的实体类实体类然后我们创建实体类。这里以手机号+验证码登录为例namespaceApp\Api\Common\Message;使用App\Api\Common\MessageUseInterface;使用App\Api\Common\Redis;类Login实现MessageUseInterface{publicfunctioninsert($mobile,$code){$redis=Redis::init();$key=sprintf('登录码:%s',$mobile);$redis->setex($key,600,$code);}}Login继承了MessageUseInterface接口,实现了insert方法。这里redis设置的规范是module:手机号->value(需要发送的验证码)。至此,我们发送短信验证码的例子就结束了。我们可以通过以下方式调用,或者使用Laravel的服务提供者(newMessage())->send($tel,141345,mt_rand(100000,999999),newRegister());这样解决了各种乱七八糟的验证码,也提高了代码的可维护性。如果老板有新需求,比如支付验证码,只需要创建一个Pay验证码类就可以完成支付验证码功能。致谢以上只是一个简单的例子,实体类没有做更多的扩展,请发挥你的创造力。感谢您阅读到这里,希望本文能对您有所帮助。谢谢。