站長分享ThinkPHP6項目基本操作(阿里云短信redis)
2023-01-04 加入收藏
一、安裝阿里云短信SDK
composer require alibabacloud/sdk
安裝完成后會在vendor文件夾生成阿里云的常用功能,不僅僅是短信模塊。

二、封裝到項目lib中
因為短信模塊可能在其他應用中也有使用,所以封裝在lib中,在common\lib文件夾下創建sms\AliSms文件夾,將阿里云短信的功能封裝在AliSms中:

先在可視化調試中頁面測試是否可以發送短信,PhoneNumbers填寫接收短信的手機號碼,SignName是簽名名稱(短信服務–國內消息–簽名管理),TemplateCode填寫短信模板名稱(短信服務–國內消息–模板管理):

點擊發起調用,查看是否有收到短信:

發送成功后將右側代碼粘貼到lib庫中AliSms.php,里面的部分參數我是寫在配置文件里的:
<?phpdeclare(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層:
<?phpdeclare(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層:
<?phpnamespace 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
<?phpuse think\facade\Route;Route::rule('smscode', 'sms/code','POST');
三、radis記錄驗證碼
1. 安裝redis服務

Tips: 這個窗口不要關閉哦,否則服務就關掉了!
2. 可視化redis管理軟件
3. PHP安裝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
<?php// +----------------------------------------------------------------------// | 緩存設置// +----------------------------------------------------------------------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前綴和失效時間
<?phpreturn ["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就沒有了。


