Operaciones básicas del proyecto ThinkPHP6 (15. Parte de combate real de Alibaba Cloud SMS redis)

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.
Inserte la descripción de la imagen aquí

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 libmedio, common\libcree una carpeta debajo de la sms\AliSmscarpeta y encapsule las funciones de Alibaba Cloud SMS en AliSmsél:
Inserte la descripción de la imagen aquí
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):
Inserte la descripción de la imagen aquí
Haga clic 发起调用para verificar si ha recibido un mensaje de texto:
Inserte la descripción de la imagen aquí
después de enviarlo correctamente, estará a la derecha Pegue el código en la libbiblioteca AliSms.phpy 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;
    }
}

BusinessSuelo:

<?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;
    }
}

ControllerSuelo:

<?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 redisservicio de acuerdo con su propio sistema y luego encienda el servicio.
Haga doble clic en las ventanas y redis-server.exeaparecerá la siguiente interfaz para iniciar el servicio:
Inserte la descripción de la imagen aquí

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 navcatver 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 ...)
Inserte la descripción de la imagen aquí

3. PHP instala la extensión redis

Ingrese en la consola para php -mver las phpextensiones instaladas. Si encuentra la extensión redis, no necesita instalarla.
Ingrese la información de la php -ivista en la consola PHP Extension Buildy luego descargue la redisversió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\extentorno integrado general tendrá este archivo, y luego verifique la php.iniconfiguración en el archivo redis:

extension=php_redis.dll

Abra la extensión php redis:
Inserte la descripción de la imagen aquí

4. Configurar caché redis

ThinkPHPEl valor predeterminado es usar la caché de archivos. La interfaz para enviar el código de verificación está escrita en la apiaplicación, así que copié un cachearchivo de configuración en el directorio de la apiaplicación configy 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.

  1. Configurar el prefijo de redis y el tiempo de vencimiento
    <?php
    
    return [
        "code_pre" => "sms_code_pre_", // key 前缀
        "code_expire" => 60, // 失效时间 60 秒
    ];
    
  2. Modificar el Businesscódigo de la capa
    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;
    }
    
  3. Vuelva a probar la interfaz de envío de SMS para ver redissi el registro es exitoso.
    Envíe una solicitud POST con Postman http://tp6.com/api/smscode, y muestra que el envío fue exitoso: el
    Inserte la descripción de la imagen aquí
    teléfono móvil recibe el código de verificación de SMS 403777, actualiza el RDM, ya hay un registro, y se muestran el código de verificación y el tiempo de vencimiento, el tiempo 60disminuye desde el principio, Si se reduce, 0ya no será accesible. Actualiza esta clave y desaparecerá.
    Inserte la descripción de la imagen aquí

6. Verifique el código de verificación por SMS

Aquí solo necesita usarlo cache("key")para obtener radisel valor del registro. Si no se encuentra, está vencido. Si no está vencido, juzgue si es igual.

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/zy1281539626/article/details/110913448
Recomendado
Clasificación