站長(zhǎng)分享ThinkPHP6項(xiàng)目基本操作(阿里云短信redis)
2023-01-04 加入收藏
一、安裝阿里云短信SDK
composer require alibabacloud/sdk
安裝完成后會(huì)在vendor文件夾生成阿里云的常用功能,不僅僅是短信模塊。
二、封裝到項(xiàng)目lib中
因?yàn)槎绦拍K可能在其他應(yīng)用中也有使用,所以封裝在lib
中,在common\lib
文件夾下創(chuàng)建sms\AliSms
文件夾,將阿里云短信的功能封裝在AliSms
中:
先在可視化調(diào)試中頁(yè)面測(cè)試是否可以發(fā)送短信,PhoneNumbers填寫(xiě)接收短信的手機(jī)號(hào)碼,SignName是簽名名稱(短信服務(wù)–國(guó)內(nèi)消息–簽名管理),TemplateCode填寫(xiě)短信模板名稱(短信服務(wù)–國(guó)內(nèi)消息–模板管理):
點(diǎn)擊發(fā)起調(diào)用
,查看是否有收到短信:
發(fā)送成功后將右側(cè)代碼粘貼到lib
庫(kù)中AliSms.php
,里面的部分參數(shù)我是寫(xiě)在配置文件里的:
<?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
{
/**
* 阿里云發(fā)送短信
* @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及失效時(shí)間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
];
// 已采用自定義異常方法攔截,如果沒(méi)有采用自定義攔截,需要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"),"發(fā)送驗(yàn)證碼成功");
}
return show(config("status.error"),"發(fā)送驗(yàn)證碼失敗");
}
}
定義路由文件:api.php
<?php
use think\facade\Route;
Route::rule('smscode', 'sms/code','POST');
三、radis記錄驗(yàn)證碼
1. 安裝redis服務(wù)
Tips: 這個(gè)窗口不要關(guān)閉哦,否則服務(wù)就關(guān)掉了!
2. 可視化redis管理軟件
3. PHP安裝redis擴(kuò)展
Zend Extension Build => API320190902,NTS,VC15PHP Extension Build => API20190902,NTS,VC15
然后放到php擴(kuò)展目錄:D:\phpstudy_pro\Extensions\php\php7.4.3nts\ext
一般集成環(huán)境會(huì)有這個(gè)文件,然后查看php.ini
文件里有配置redis
:
extension=php_redis.dll
打開(kāi)php擴(kuò)展的redis
:
4. 配置緩存redis
<?php
// +----------------------------------------------------------------------
// | 緩存設(shè)置
// +----------------------------------------------------------------------
return [
// 默認(rèn)緩存驅(qū)動(dòng)
'default' => env('cache.driver', 'redis'),
// 緩存連接方式配置
'stores' => [
'file' => [
// 驅(qū)動(dòng)方式
'type' => 'File',
// 緩存保存目錄
'path' => '',
// 緩存前綴
'prefix' => '',
// 緩存有效期 0表示永久緩存
'expire' => 0,
// 緩存標(biāo)簽前綴
'tag_prefix' => 'tag:',
// 序列化機(jī)制 例如 ['serialize', 'unserialize']
'serialize' => [],
],
// 更多的緩存連接
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'type' => 'redis',
]
],
];
5. redis保存短信驗(yàn)證碼,設(shè)置過(guò)期時(shí)間
a.配置redis前綴和失效時(shí)間
<?php
return [
"code_pre" => "sms_code_pre_", // key 前綴
"code_expire" => 60, // 失效時(shí)間 60 秒
];
b.修改Business
層代碼
public static function sendCode(string $phoneNumber) : bool {
$code = rand(100000, 999999);
$sms = AliSms::sendCode($phoneNumber, $code);
if($sms){
// 需要記錄redis及失效時(shí)間1分鐘
cache(config("redis.code_pre").$phoneNumber, $code, config("redis.code_expire"));
}
return $sms;
}
c.重新測(cè)試發(fā)送短信接口,查看redis
是否記錄成功
用Postman發(fā)送POST請(qǐng)求http://tp6.com/api/smscode
,顯示發(fā)送成功:
手機(jī)接收到短信驗(yàn)證碼403777
,刷新RDM里面已經(jīng)有了一條記錄,并顯示了驗(yàn)證碼和失效時(shí)間,時(shí)間從60
開(kāi)始遞減,減到0
就不能再訪問(wèn),刷新一下這個(gè)key就沒(méi)有了。