Redis de SMS en la nube de Alibaba
1. Instale el SDK de SMS en la nube de Alibaba
Depuración de SMS de
Alibaba Cloud SMS SDK de Alibaba Cloud Documento PHP
Consulte la documentación oficial de Alibaba Cloud para instalar Alibaba Cloud SMS SDK:
composer require alibabacloud/sdk
Una vez completada la instalación, las funciones comunes de Alibaba Cloud se generarán en la carpeta del proveedor, no solo en el módulo SMS.
Dos, empaquetar en la biblioteca del proyecto
Debido a que el módulo SMS también se puede usar en otras aplicaciones, encapsúlelo en el lib
medio, common\lib
cree una carpeta debajo de la sms\AliSms
carpeta y encapsule las funciones de Alibaba Cloud SMS en AliSms
él:
primero pruebe si el SMS se puede enviar en la página de depuración visual y complete PhoneNumbers para recibir el SMS Número de teléfono móvil, SignName es el nombre de la firma (servicio SMS-gestión de firmas de mensajes nacionales), TemplateCode completa el nombre de la plantilla de SMS (servicio de SMS-gestión de plantillas de mensajes nacionales):
Haga clic 发起调用
para verificar si ha recibido un mensaje de texto:
después de enviarlo correctamente, estará a la derecha Pegue el código en la lib
biblioteca AliSms.php
y escribí algunos de los parámetros en el archivo de configuración:
<?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
Suelo:
<?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
Suelo:
<?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"),"发送验证码失败");
}
}
Defina el archivo de enrutamiento:
api.php
<?php
use think\facade\Route;
Route::rule('smscode', 'sms/code','POST');
Definir la referencia de interceptación del método de excepción: operación básica del proyecto ThinkPHP6 (13. Resumen de manejo de excepciones personalizado en proyectos de combate reales, página de error y error de API)
Tres, código de verificación de registro radis
1. Instale el servicio redis
Descargue desde el sitio web oficial: https://redis.io/download
Instale el redis
servicio de acuerdo con su propio sistema y luego encienda el servicio.
Haga doble clic en las ventanas y redis-server.exe
aparecerá la siguiente interfaz para iniciar el servicio:
Tips: 这个窗口不要关闭哦,否则服务就关掉了!
2. Software de gestión Visual Redis
Los principiantes pueden ver los datos administrados por redis a través de herramientas de visualización, al igual que navcat
ver la base de datos.
Sitio web oficial de RDM: https://rdm.dev/
(El sitio web oficial está cobrado, pero los estudiantes chinos debemos saber qué hacer, así que no diré más ...)
3. PHP instala la extensión redis
Ingrese en la consola para php -m
ver las php
extensiones instaladas. Si encuentra la extensión redis, no necesita instalarla.
Ingrese la información de la php -i
vista en la consola PHP Extension Build
y luego descargue la redis
versión extendida correspondiente .
Redis descargar sitio web oficial
Zend Extension Build => API320190902,NTS,VC15
PHP Extension Build => API20190902,NTS,VC15
Luego colóquelo en el directorio de extensión php: el D:\phpstudy_pro\Extensions\php\php7.4.3nts\ext
entorno integrado general tendrá este archivo, y luego verifique la php.ini
configuración en el archivo redis
:
extension=php_redis.dll
Abra la extensión php redis
:
4. Configurar caché redis
ThinkPHP
El valor predeterminado es usar la caché de archivos. La interfaz para enviar el código de verificación está escrita en la api
aplicación, así que copié un cache
archivo de configuración en el directorio de la api
aplicación config
y modifiqué la configuración:
<?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 guarda el código de verificación por SMS y establece el tiempo de vencimiento.
- Configurar el prefijo de redis y el tiempo de vencimiento
<?php return [ "code_pre" => "sms_code_pre_", // key 前缀 "code_expire" => 60, // 失效时间 60 秒 ];
- Modificar el
Business
código de la capapublic 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; }
- Vuelva a probar la interfaz de envío de SMS para ver
redis
si el registro es exitoso.
Envíe una solicitud POST con Postmanhttp://tp6.com/api/smscode
, y muestra que el envío fue exitoso: el
teléfono móvil recibe el código de verificación de SMS403777
, actualiza el RDM, ya hay un registro, y se muestran el código de verificación y el tiempo de vencimiento, el tiempo60
disminuye desde el principio, Si se reduce,0
ya no será accesible. Actualiza esta clave y desaparecerá.
6. Verifique el código de verificación por SMS
Aquí solo necesita usarlo cache("key")
para obtener radis
el valor del registro. Si no se encuentra, está vencido. Si no está vencido, juzgue si es igual.