如今,短信验证码已成为网站、APP的基础必备应用,应用场景十分丰富,随着移动互联网的发展会越来越多。作为一名码农,对第三方短信接口也是必须掌握的。本文php中文网将介绍使用工厂模式怎么实现ThinkPHP6.0
接入阿里云短信。
一、环境要求
PHP版本 >= 7.1.0
开发环境必须安装有Composer
已开通阿里云短信服务,并且已获取AccessKey,创建模板和签名
最重要的,阿里云账户余额一定要有钱。
这里我就不演示开通短信服务和创建签名模板了,小伙伴们可以查看官方文档:https://help.aliyun.com/document_detail/108072.html?spm=a2c4g.11186623.6.565.1b4825903BoqGV
二、使用Composer
安装Thinkphp6.0
如果您是第一次安装,请在命令行中切换到您的web目录执行下面的命令
composer create-project topthink/think sms
本教程将安装在C盘www目录下 三、使用
Composer
安装 Alibaba Cloud SDK for PHP
进到刚刚创建的sms项目下执行下面的命令
composer require alibabacloud/sdk
四、使用编辑器打开项目 ,并在
config文件夹
下创建sms.php
配置文件来管理阿里短信配置信息
<?php return [ //阿里云短信API接口地址 'host' => 'dysmsapi.aliyuncs.com', //AccessKey ID 'access_key_id' => '您的AccessKey ID', //Access Key Secret 'access_key_secret' => '您的Access Key Secret', //地区ID 'region_id' => 'cn-hangzhou', //模板CODE 'template_code' => '您的模板CODE', //签名名称 'sign_name' => '您的短信签名名称', ];
五、顺便在config文件夹
下打开cache.php
添加Redis
缓存配置,后面发送短信验证码会用到
<?php // +---------------------------------------------------------------------- // | 缓存设置 // +---------------------------------------------------------------------- return [ // 默认缓存驱动 'default' => env('cache.driver', 'redis'), // 缓存连接方式配置 'stores' => [ 'file' => [ // 驱动方式 'type' => 'File', // 缓存保存目录 'path' => '', // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 'expire' => 0, // 缓存标签前缀 'tag_prefix' => 'tag:', // 序列化机制 例如 ['serialize', 'unserialize'] 'serialize' => [], ], // Redis缓存 'redis' => [ //服务器地址 'host' => '127.0.0.1', //redis端口 'port' => 6379, //驱动方式 'type' => 'redis', //缓存前缀 'prefix' => 'sms_code_', ] ], ];
六、在app
目录下创建common/lib/sms/Sms.php
接口类,用来约束发送短信验证码的方法
<?php namespace app\common\lib\sms; //定义实现发送短信验证码的接口类,用来约束发送验证码的方法 interface Sms { /** * @desc 发送短信验证码的方法 * @param string $phone 手机号 * @param int $code 验证码 * @return mixed */ public static function sendCode(string $phone, int $code); }
七、在common/lib/sms
目录下创建AliSms类来实现Sms接口的smsSend()
<?php namespace app\common\lib\sms; use AlibabaCloud\Client\AlibabaCloud; use AlibabaCloud\Client\Exception\ClientException; use AlibabaCloud\Client\Exception\ServerException; class AliSms implements Sms { /** * @desc 阿里云发送短信验证码 * @param string $phone 手机号 * @param int $code 验证码 * @return mixed|void * @throws ClientException */ public static function sendCode(string $phone, int $code) { //判断手机号和验证码是否为空 if (empty($phone) || empty($code)){ return false; } AlibabaCloud::accessKeyClient(config('sms.access_key_id'), config('sms.access_key_secret'))->regionId(config('sms.region_id'))->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product('Dysmsapi') // ->scheme('https') // https | http ->version('2017-05-25') ->action('SendSms') ->method('POST') ->host(config('sms.host')) ->options([ 'query' => [ 'RegionId' =>config('sms.region_id'), 'SignName' => config('sms.sign_name'), 'PhoneNumbers' => $phone, 'TemplateCode' => config('sms.template_code'), 'TemplateParam' => json_encode(['code' => $code]), ], ])->request(); } catch (ClientException $e) { return false; } catch (ServerException $e) { return false; } return true; } }
八、在common\lib
目录下创建生成短信验证码的类 Code.php
<?php namespace app\common\lib; class Code { /** * @desc 生成4位或6位短信验证码,默认为4位 * @param int $length 验证码长度 * @return int */ public static function getCode(int $length = 4) { $code = rand(1000,9999); if ($length == 6){ $code = rand(100000,999999); } return $code; } }
九、在common目录下创建service/Sms.php
<?php namespace app\common\Service; use app\common\lib\Code; class Sms { /** * @param string $phone 手机号 * @param int $lengthCode 验证码长度 * @param string $type 短信厂家,默认选用AliSms * @return mixed */ public static function sendCode(string $phone,int $lengthCode,string $type='AliSms') { //生成短信验证码 $code = Code::getCode(4); //使用工厂模式 调用Lib层发送短信 $class = "app\common\lib\sms\\".$type; $sms = $class::sendCode($phone,$code); if ($sms){ //发送成功,把短信验证码存储Redis缓存中,并给失效时间 cache($phone,$code,300); } return $sms; } }
十、在common目录下创建validate/SmsValidate
验证器
<?php namespace app\common\validate; use think\Validate; class SmsValidate extends Validate { //验证规则 protected $rule = [ 'phone' => 'require|mobile', 'code' => 'require|number' ]; //错误信息 protected $message = [ 'phone.require' => '请输入手机号', 'phone.mobile' => '手机号格式错误', 'code.require' => '短信验证码不能为空', 'code.number' => '短信验证码必须为纯数字' ]; //验证场景 protected $scene = [ 'sendCode' => ['phone'] ]; }
十一、在controller目录下创建Sms.php
<?php namespace app\controller; use app\common\validate\SmsValidate; class Sms { /** * @desc 发送短信验证码 * @return \think\response\Json */ public function code() { if (request()->isPost()){ //获取手机号 $data = [ 'phone' => request()->param('phone','','trim'), ]; //参数校验 $validate = new SmsValidate(); if (!$validate->scene('sendCode')->check($data)){ return json(['code'=>0,'msg'=>$validate->getError()]); } //发送短信验证码 if (\app\common\Service\Sms::sendCode($data['phone'],6,'AliSms')){ return json(['code'=>1,'msg'=>'发送成功,请注意查收。']); }else{ return json(['code'=>0,'msg'=>'发送失败,请稍后重试!']); } } } }
十二、使用PostMan
测试发送短信验证码
不输入手机号或输入错误手机号会给相应的提示。
输入正确的手机号,提示发送短信验证成功这时我们来看看收到的验证码和缓存中的验证码是否一致
到这里我们的发送验证码已经完成
十三、这时我们需要校验验证码是否正确,在app\controller
目录下创建Login.php
<?php namespace app\controller; use app\common\validate\SmsValidate; class Login { public function index() { //接收参数 $data = [ 'phone' => request()->param('phone','','trim'), 'code' => request()->param('code','','trim'), ]; //参数校验 $validate = new SmsValidate(); if (!$validate->check($data)){ return json(['code'=>0,'msg'=>$validate->getError()]); } //从Redis中获取验证码 $redisCode = cache($data['phone']); //判断验证码是否正确 if (empty($redisCode)){ return json(['code'=>0,'msg'=>'验证码已过期,请重新发送!']); } if ($redisCode != $data['code']){ return json(['code'=>0,'msg'=>'验证码输入错误,请重新输入!']); } return '验证成功'; } }
十四、使用PostMan
校验验证码是否正确
输入错误的验证码,会给出响应的提示
输入正确的验证码,提示验证成功
看到这里我相信很多小伙伴的验证码都已发送成功了。
不知道小伙伴们有没有发现文中有两处参数校验的代码相识度很高,在后续的thinkphp技术文章中我会对这个问题进行优化,感兴趣的小伙伴请关注。
以上是使用工厂模式实现Thinkphp6.0接入阿里云短信的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了ThinkPHP的内置测试框架,突出了其关键功能(例如单元和集成测试),以及它如何通过早期的错误检测和改进的代码质量来增强应用程序可靠性。

本文讨论了在无服务器体系结构中使用ThinkPHP的关键注意事项,专注于性能优化,无状态设计和安全性。它突出了诸如成本效率和可扩展性之类的收益,但也应对挑战

本文讨论了在ThinkPHP微服务中实施服务发现和负载平衡,重点是设置,最佳实践,集成方法和推荐工具。[159个字符]

ThinkPHP的IOC容器提供了高级功能,例如懒惰加载,上下文绑定和方法注入PHP App中有效依赖性管理的方法。Character计数:159

ThinkPHP具有轻巧的设计,MVC架构和可扩展性。它通过各种功能提高可扩展性,加快开发并提高安全性。

本文概述了使用ThinkPhp和RabbitMQ构建分布式任务队列系统,重点是安装,配置,任务管理和可扩展性。关键问题包括确保高可用性,避免常见的陷阱,例如不当


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载
最流行的的开源编辑器