ThinkPHP6项目基本操作(阿里云短信SDK+redis)
一、安装阿里云短信SDK
阿里云短信SDK PHP文档(百度即可)
参考阿里云官方文档安装阿里云短信SDK:
composer require alibabacloud/sdk安装完成后会在vendor文件夹生成阿里云的常用功能,不仅仅是短信模块。

二、封装到项目lib中
因为短信模块可能在其他应用中也有使用,所以封装在lib中,在common\lib文件夹下创建sms\AliSms文件夹,将阿里云短信的功能封装在AliSms中:

先在可视化调试中页面测试是否可以发送短信,PhoneNumbers填写接收短信的手机号码,SignName是签名名称(短信服务–国内消息–签名管理),TemplateCode填写短信模板名称(短信服务–国内消息–模板管理):

点击发起调用,查看是否有收到短信:

发送成功后将右侧代码粘贴到lib库中AliSms.php,里面的部分参数我是写在配置文件里的:
declare(strict_types=1);namespace app\common\lib\sms\AliSms;use AlibabaCloud\Client\AlibabaCloud;use AlibabaCloud\Client\Exception\ClientException;use AlibabaCloud\Client\Exception\ServerException;class AliSms{/*** 阿里云发送短信* @param string $phone* @param int $code* @return bool* @throws ClientException*/public static function sendCode(string $phone, int $code) : bool {if(empty($phone) || empty($code)){return false;}AlibabaCloud::accessKeyClient(config("aliyun.access_key_id"), config("aliyun.access_secret"))->regionId(config("aliyun.region_id"))->asDefaultClient();$templateParam = ["code" => $code];try {$result = AlibabaCloud::rpc()->product('Dysmsapi')// ->scheme('https') // https | http->version('2017-05-25')->action('SendSms')->method('POST')->host(config("aliyun.host"))->options(['query' => ['RegionId' => config("aliyun.region_id"),'PhoneNumbers' => $phone,'SignName' => config("aliyun.sign_name"),'TemplateCode' => config("aliyun.template_code"),'TemplateParam' => json_encode($templateParam),],])->request();print_r($result->toArray());} catch (ClientException $e) {return false;// echo $e->getErrorMessage() . PHP_EOL;} catch (ServerException $e) {return false;// echo $e->getErrorMessage() . PHP_EOL;}return true;}}
Business层:
declare(strict_types=1);namespace app\common\business;use app\common\lib\sms\AliSms\AliSms;class Sms{public static function sendCode(string $phoneNumber) : bool {$code = rand(100000, 999999);$sms = AliSms::sendCode($phoneNumber, $code);if($sms){// 需要记录redis及失效时间1分钟}return true;}}
Controller层:
namespace app\api\controller;use app\api\validate\User;use app\BaseController;use think\exception\ValidateException;use app\common\business\Sms as SmsBus;class Sms extends BaseController{public function code(){$phoneNumber = input("param.phone_number","","trim");$data = ['phone_number' => $phoneNumber];// 已采用自定义异常方法拦截,如果没有采用自定义拦截,需要try...catchvalidate(User::class)->scene("send_code")->check($data);/*try {validate(User::class)->scene("send_code")->check($data);}catch (ValidateException $e){return show(config("status.error"), $e->getError());}*/if(SmsBus::sendCode($phoneNumber)){return show(config("status.success"),"发送验证码成功");}return show(config("status.error"),"发送验证码失败");}}
定义路由文件:
api.php
use think\facade\Route;Route::rule('smscode', 'sms/code','POST');
三、radis记录验证码
1. 安装redis服务
官网下载:https://redis.io/download
根据自己的系统安装redis服务,然后开启服务。
windows上双击redis-server.exe,出现以下界面就是开启了服务:

Tips: 这个窗口不要关闭哦,否则服务就关掉了!
2. 可视化redis管理软件
初学者可以通过可视化工具查看redis管理的数据,就像navcat查看数据库差不多。
RDM官网:https://rdm.dev/
(官网是收费的,但是咱们天朝学子应该知道怎么办,就不多说了。。。)

3. PHP安装redis扩展
在控制台输入php -m查看php安装的扩展,如果有找到redis扩展就不用安装了。
在控制台输入php -i查看PHP Extension Build信息,然后下载对应的redis扩展版本.
redis下载官网
Zend Extension Build => API320190902,NTS,VC15PHP Extension Build => API20190902,NTS,VC15
然后放到php扩展目录:D:\phpstudy_pro\Extensions\php\php7.4.3nts\ext一般集成环境会有这个文件,然后查看php.ini文件里有配置redis:
extension=php_redis.dll打开php扩展的redis:

4. 配置缓存redis
ThinkPHP默认是使用文件缓存,这里发送验证码的接口我是写在api应用下的,所以我复制了一份cache配置文件到api应用的config目录下,并修改了配置:
// +----------------------------------------------------------------------// | 缓存设置// +----------------------------------------------------------------------return [// 默认缓存驱动'default' => env('cache.driver', 'redis'),// 缓存连接方式配置'stores' => ['file' => [// 驱动方式'type' => 'File',// 缓存保存目录'path' => '',// 缓存前缀'prefix' => '',// 缓存有效期 0表示永久缓存'expire' => 0,// 缓存标签前缀'tag_prefix' => 'tag:',// 序列化机制 例如 ['serialize', 'unserialize']'serialize' => [],],// 更多的缓存连接'redis' => ['host' => '127.0.0.1','port' => 6379,'type' => 'redis',]],];
5. redis保存短信验证码,设置过期时间
a.配置redis前缀和失效时间
return ["code_pre" => "sms_code_pre_", // key 前缀"code_expire" => 60, // 失效时间 60 秒];
b.修改Business层代码
public static function sendCode(string $phoneNumber) : bool {$code = rand(100000, 999999);$sms = AliSms::sendCode($phoneNumber, $code);if($sms){// 需要记录redis及失效时间1分钟cache(config("redis.code_pre").$phoneNumber, $code, config("redis.code_expire"));}return $sms;}
c.重新测试发送短信接口,查看redis是否记录成功
用Postman发送POST请求http://tp6.com/api/smscode,显示发送成功:

手机接收到短信验证码403777,刷新RDM里面已经有了一条记录,并显示了验证码和失效时间,时间从60开始递减,减到0就不能再访问,刷新一下这个key就没有了。

6. 验证短信验证码
这里只需要使用cache("key")就可以获取radis记录的值,如果没有查询到就是过期了,没有过期再判断是否相等就行了。




