阿里云短信redis
- 一、安裝阿里云短信SDK
- 二、封裝到專案lib中
- 三、radis記錄驗證碼
- 1. 安裝redis服務
- 2. 可視化redis管理軟體
- 3. PHP安裝redis擴展
- 4. 配置快取redis
- 5. redis保存短信驗證碼,設定過期時間
- 6. 驗證短信驗證碼
一、安裝阿里云短信SDK
阿里云短信除錯
阿里云短信SDK PHP檔案
參考阿里云官方檔案安裝阿里云短信SDK:
composer require alibabacloud/sdk
安裝完成后會在vendor檔案夾生成阿里云的常用功能,不僅僅是短信模塊,

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

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

點擊發起呼叫,查看是否有收到短信:

發送成功后將右側代碼粘貼到lib庫中AliSms.php,里面的部分引數我是寫在組態檔里的:
<?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層:
<?php
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層:
<?php
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...catch
validate(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
<?php
use think\facade\Route;
Route::rule('smscode', 'sms/code','POST');
定義例外方法攔截參考:ThinkPHP6專案基操(13.實戰部分 專案中的自定義例外處理總結 錯誤頁面&API錯誤)
三、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,VC15
PHP 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目錄下,并修改了配置:
<?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保存短信驗證碼,設定過期時間
- 配置redis前綴和失效時間
<?php return [ "code_pre" => "sms_code_pre_", // key 前綴 "code_expire" => 60, // 失效時間 60 秒 ]; - 修改
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; } - 重新測驗發送短信介面,查看
redis是否記錄成功
用Postman發送POST請求http://tp6.com/api/smscode,顯示發送成功:

手機接收到短信驗證碼403777,重繪RDM里面已經有了一條記錄,并顯示了驗證碼和失效時間,時間從60開始遞減,減到0就不能再訪問,重繪一下這個key就沒有了,

6. 驗證短信驗證碼
這里只需要使用cache("key")就可以獲取radis記錄的值,如果沒有查詢到就是過期了,沒有過期再判斷是否相等就行了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234369.html
標籤:其他
上一篇:SpringSecurity
