Skip to content

短信管理开发文档

1. 概述

短信管理模块是系统中负责短信发送、配置和管理的核心功能,支持多种短信服务商(牛云短信、阿里云短信、腾讯云短信),提供短信配置管理、模板管理、发送记录查询等功能。

2. 功能模块

2.1 短信配置管理

2.1.1 支持的短信服务商

  • 牛云短信:系统内置的短信服务
  • 阿里云短信:阿里云提供的短信服务
  • 腾讯云短信:腾讯云提供的短信服务

2.1.2 配置参数

短信服务商配置参数说明
阿里云短信sign短信签名
阿里云短信app_keyAPP_KEY
阿里云短信secret_keySECRET_KEY
腾讯云短信sign短信签名
腾讯云短信app_idAPP_ID
腾讯云短信secret_idSECRET_ID
腾讯云短信secret_keySECRET_KEY
牛云短信-无需配置参数

2.1.3 配置流程

  1. 进入短信配置页面
  2. 选择要配置的短信服务商
  3. 填写相应的配置参数
  4. 保存配置并启用

2.2 短信模板管理

2.2.1 模板列表

  • 显示所有短信通知模板
  • 支持查看模板详情
  • 支持启用/禁用模板

2.2.2 模板类型

  • 登录验证
  • 注册验证
  • 绑定手机
  • 找回密码

2.2.3 模板编辑

  • 设置模板状态(启用/禁用)
  • 配置短信模板ID
  • 编辑短信内容

2.3 短信发送记录

2.3.1 发送记录列表

  • 显示所有短信发送记录
  • 支持按手机号、状态、时间等条件筛选
  • 支持查看记录详情

2.3.2 记录详情

  • 短信内容
  • 发送状态
  • 发送时间
  • 接收手机号

2.4 牛云短信特殊功能

2.4.1 账户管理

  • 注册牛云短信账户
  • 登录牛云短信账户
  • 修改账户信息
  • 重置密码

2.4.2 订单管理

  • 查看订单列表
  • 计算短信费用
  • 创建订单
  • 查看订单详情
  • 订单状态查询
  • 获取支付信息

2.4.3 签名管理

  • 查看签名列表
  • 查看签名详情
  • 创建签名
  • 删除签名

3. 代码实现

3.1 路由配置

php
// 短信模块路由配置
Route::group('sms', function () {
    // 短信配置列表
    Route::get('config', 'sms.Sms/config');
    // 短信配置详情
    Route::get('config/:sms_type', 'sms.Sms/configDetail');
    // 短信配置修改
    Route::put('config/:sms_type', 'sms.Sms/editConfig');
    // 短信通知消息模版管理
    Route::get('notice', 'sms.SmsNotice/lists');
    Route::get('notice/:key', 'sms.SmsNotice/info');
    Route::post('notice/edit', 'sms.SmsNotice/edit');
    Route::post('notice/editstatus', 'sms.SmsNotice/editStatus');
    
    // 短信发送记录
    Route::get('log', 'sms.SmsLog/lists');
    Route::get('log/:id', 'sms.SmsLog/info');
    
    // 牛云特殊业务
    Route::group('niusms', function () {
        Route::get('packages', 'sms.NiuSms/getSmsPackageList');
        // 发送验证短信
        Route::post('send', 'sms.NiuSms/sendMobileCode');
        Route::get('captcha', 'sms.NiuSms/captcha');

        Route::get('config', 'sms.NiuSms/getConfig');
        Route::put('enable', 'sms.NiuSms/enable');
        Route::group('account', function () {
            Route::post('register', 'sms.NiuSms/registerAccount');
            Route::post('login', 'sms.NiuSms/loginAccount');
            Route::post('edit/:username', 'sms.NiuSms/editAccount');
            Route::post('reset/password/:username', 'sms.NiuSms/resetPassword');
            Route::post('forget/password/:username', 'sms.NiuSms/forgetPassword');
            Route::get('info/:username', 'sms.NiuSms/accountInfo');
        });

        Route::group('order', function () {
            Route::get('list/:username', 'sms.NiuSms/orderList');
            Route::post('calculate/:username', 'sms.NiuSms/calculate');
            Route::post('create/:username', 'sms.NiuSms/createOrder');
            Route::get('info/:username', 'sms.NiuSms/orderInfo');
            Route::get('status/:username', 'sms.NiuSms/orderStatus');
            Route::get('pay/:username', 'sms.NiuSms/getPayInfo');
        });
        Route::group('sign', function () {
            Route::get('list/:username', 'sms.NiuSms/signList');
            Route::get('info/:username', 'sms.NiuSms/signInfo');
            Route::get('report/config', 'sms.NiuSms/signCreateConfig');
            Route::post('report/:username', 'sms.NiuSms/signCreate');
            Route::post('delete/:username', 'sms.NiuSms/signDelete');
        });
    });
});

3.2 短信配置控制器

php
<?php

namespace app\adminapi\controller\sms;

use app\service\admin\sms\SmsService;
use core\base\BaseAdminController;
use think\Response;

/**
 * 短信配置控制器
 */
class Sms extends BaseAdminController
{

    /**
     * 获取短信配置列表
     * @return Response
     */
    public function config()
    {
        $data = (new SmsService())->getList();
        return success($data);
    }

    /**
     * 获取短信配置详情
     * @param string $sms_type
     * @return Response
     */
    public function configDetail(string $sms_type)
    {
        $data = (new SmsService())->getConfig($sms_type);
        return success($data);
    }

    /**
     * 短信配置修改
     * @param string $sms_type
     * @return Response
     */
    public function editConfig(string $sms_type)
    {
        $data = $this->request->only(['is_use', 'params'], 'post');
        (new SmsService())->setConfig($sms_type, $data);
        return success('SUCCESS');
    }

}

3.3 短信配置服务

php
<?php

namespace app\service\admin\sms;

use app\dict\common\CommonDict;
use app\dict\sys\ConfigKeyDict;
use app\dict\sys\SmsDict;
use app\service\core\sys\CoreConfigService;
use core\base\BaseAdminService;
use core\exception\AdminException;

/**
 * 短信配置服务层
 */
class SmsService extends BaseAdminService
{
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 获取短信配置列表(平台设置)
     */
    public function getList()
    {
        $sms_type_list = SmsDict::getType();
        $info = (new CoreConfigService())->getConfig(ConfigKeyDict::SMS);
        if(empty($info) || !isset($info['value']['default']))
        {
            $config_type = ['default' => ''];//初始化
        }else
            $config_type = $info['value'];

        $list = [];
        foreach($sms_type_list as $k => $v)
        {
            $data = [];
            $data['sms_type'] = $k;
            $data['is_use'] = $k == $config_type['default'] ? 1 : 0;
            $data['name'] = $v['name'];
            foreach ($v['params'] as $k_param => $v_param)
            {
                $value = $config_type[$k][$k_param] ?? '';
                $encrypt_params = $sms_type_list[$k]['encrypt_params'] ?? [];
                if ($value !== '' && in_array($k_param, $encrypt_params)) $value = CommonDict::ENCRYPT_STR;

                $data['params'][$k_param] = [
                    'name' => $v_param,
                    'value' => $value
                ];
            }
            $data['component'] = $v['component'] ?? '';
            $list[] = $data;
        }
        return $list;
    }

    /**
     * 获取短信配置
     * @param string $sms_type
     * @return array
     */
    public function getConfig(string $sms_type)
    {
        $sms_type_list = SmsDict::getType();
        if(!array_key_exists($sms_type, $sms_type_list)) throw new AdminException('SMS_TYPE_NOT_EXIST');
        $info = (new CoreConfigService())->getConfig(ConfigKeyDict::SMS);
        if(empty($info) || !isset($info['value']['default']))
        {
            $config_type = ['default' => ''];//初始化
        }else
            $config_type = $info['value'];

        $data = [
            'sms_type' => $sms_type,
            'is_use' => $sms_type == $config_type['default'] ? 1 : 0,
            'name'   => $sms_type_list[$sms_type]['name'],
        ];
        foreach ($sms_type_list[$sms_type]['params'] as $k_param => $v_param)
        {
            $value = $config_type[$sms_type][$k_param] ?? '';
            $encrypt_params = $sms_type_list[$sms_type]['encrypt_params'] ?? [];
            if ($value !== '' && in_array($k_param, $encrypt_params)) $value = CommonDict::ENCRYPT_STR;

            $data['params'][$k_param] = [
                'name' => $v_param,
                'value' => $value
            ];
        }
        return $data;

    }

    /**
     * 短信配置
     * @param string $sms_type
     * @param array $data
     * @return bool
     */
    public function setConfig(string $sms_type, array $data)
    {
        $sms_type_list = SmsDict::getType();
        if(!array_key_exists($sms_type, $sms_type_list)) throw new AdminException('SMS_TYPE_NOT_EXIST');
        $info = (new CoreConfigService())->getConfig(ConfigKeyDict::SMS);
        if(empty($info) || !isset($info['value']['default']))
        {
            $config['default'] = '';

        }else{
            $config = $info['value'];
        }
        //初始化数据
        if($data['is_use'])
        {
            $config['default'] = $sms_type;
        }else{
            $config['default'] = $config['default'] == $sms_type ? '' : $config['default'];
        }
        foreach ($sms_type_list[$sms_type]['params'] as $k_param => $v_param)
        {
            $value = $data['params'][$k_param] ?? '';
            if ($value == CommonDict::ENCRYPT_STR) $value = isset($config[$sms_type]) ? ($config[$sms_type][$k_param] ?? '') : '';
            $config[$sms_type][$k_param] = $value;
        }

        return (new CoreConfigService())->setConfig(ConfigKeyDict::SMS, $config);
    }

}

3.4 短信通知控制器

php
<?php

namespace app\adminapi\controller\sms;

use app\service\admin\sms\SmsNoticeService;
use core\base\BaseAdminController;
use think\Response;

/**
 * 短信通知管理
 */
class SmsNotice extends BaseAdminController
{

    /**
     * 短信通知列表
     * @description 短信通知列表
     * @return Response
     */
    public function lists()
    {

        $res = (new SmsNoticeService())->getList();
        return success($res);
    }

    /**
     * 短信通知详情
     * @description 短信通知详情
     * @param $key
     * @return Response
     */
    public function info($key)
    {
        $res = (new SmsNoticeService())->getInfo($key);
        return success($res);
    }

    /**
     * 短信通知编辑
     * @description 短信通知编辑
     * @return Response
     */
    public function edit()
    {
        $data = $this->request->params([
            ['key', ''],
            ['status', 0],
            ['sms_id', ''],
            ['sms_content', ''],
        ]);
        (new SmsNoticeService())->edit($data['key'], $data);
        return success();
    }

    /**
     * 短信通知状态修改
     * @description 短信通知状态修改
     * @return Response
     */
    public function editStatus()
    {
        $data = $this->request->params([
            ['key', ''],
            ['status', 0],
        ]);
        (new SmsNoticeService())->editStatus($data['key'], $data['status']);
        return success();
    }

}

3.5 短信通知服务

php
<?php

namespace app\service\admin\sms;

use app\model\sys\SysSmsNotice;
use app\service\core\sms\CoreSmsNoticeService;
use app\service\core\sms\CoreSmsTemplateData;
use core\base\BaseAdminService;
use core\exception\AdminException;

/**
 * 短信通知管理服务层
 */
class SmsNoticeService extends BaseAdminService
{
    public function __construct()
    {
        parent::__construct();
        $this->model = new SysSmsNotice();
    }

    /**
     * 获取短信通知列表
     * @return array
     */
    public function getList()
    {
        return (new CoreSmsNoticeService())->getList();
    }

    /**
     * 获取短信通知详情
     * @param string $key
     * @return array
     */
    public function getInfo(string $key)
    {
        return (new CoreSmsNoticeService())->getInfo($key);
    }

    /**
     * 修改短信通知状态
     * @param string $key
     * @param int $status
     */
    public function editStatus(string $key, int $status)
    {
        return (new CoreSmsNoticeService())->edit($key, ['is_sms' => $status]);
    }

    /**
     * 短信通知编辑
     * @param string $key
     * @param array $data
     */
    public function edit(string $key, array $data)
    {
        $save_data = ['is_sms' => $data['status']];
        $save_data['sms_id'] = $data['sms_id'] ?? '';
        $save_data['sms_content'] = $data['sms_content'] ?? '';
        // 从 CoreSmsTemplateData 获取 param_json 的值
        $templates = CoreSmsTemplateData::getSmsTemplates();
        if (isset($templates[$key]['param_json'])) {
            $save_data['param_json'] = $templates[$key]['param_json'];
            // 如果 param_json 是数组,转换为 JSON 字符串
            if (is_array($save_data['param_json'])) {
                $save_data['param_json'] = json_encode($save_data['param_json'], JSON_UNESCAPED_UNICODE);
            }
        }
        return (new CoreSmsNoticeService())->edit($key, $save_data);
    }

}

3.6 核心短信通知服务

php
<?php

namespace app\service\core\sms;

use app\model\sys\SysSmsNotice;
use core\base\BaseCoreService;
use app\service\core\sms\CoreSmsTemplateData;

/**
 * 核心短信通知服务层
 */
class CoreSmsNoticeService extends BaseCoreService
{
    public function __construct()
    {
        parent::__construct();
        $this->model = new SysSmsNotice();
    }

    /**
     * 获取短信通知配置
     * @param string $key
     * @return array
     */
    private function getNotice(string $key = '')
    {
        $notice = CoreSmsTemplateData::getSmsTemplates();
        if (!empty($key)) {
            return $notice[$key] ?? [];
        }
        return $notice;
    }

    /**
     * 获取短信通知列表
     * @return array
     */
    public function getList()
    {
        $list = $this->model->select()->toArray();
        if (!empty($list)) {
            $list_key = array_column($list, 'key');
            $list = array_combine($list_key, $list);
        }
        $notice = $this->getNotice();
        $result = [];
        foreach ($notice as $k => $v) {
            if (array_key_exists($k, $list)) {
                $result[] = array_merge($v, $list[$k]);
            } else {
                $data = [
                    'is_sms' => 0,
                    'sms_content' => '',
                    'sms_id' => '',
                    'param_json' => ''
                ];
                $result[] = array_merge($v, $data);
            }
        }
        return $result;
    }

    /**
     * 获取短信通知详情
     * @param string $key
     * @return array
     */
    public function getInfo(string $key)
    {
        $info = $this->model->where([['key', '=', $key]])->find();
        if (empty($info)) {
            $data = [
                'is_sms' => 0,
                'sms_content' => '',
                'sms_id' => '',
                'param_json' => ''
            ];
            return array_merge($this->getNotice($key), $data);
        }
        return array_merge($this->getNotice($key), $info->toArray());
    }

    /**
     * 编辑短信通知
     * @param string $key
     * @param array $data
     * @return bool
     */
    public function edit(string $key, array $data)
    {
        // 如果 param_json 是数组,转换为 JSON 字符串
        if (isset($data['param_json']) && is_array($data['param_json'])) {
            $data['param_json'] = json_encode($data['param_json'], JSON_UNESCAPED_UNICODE);
        }
        $info = $this->model->where([['key', '=', $key]])->find();
        if (empty($info)) {
            $data['key'] = $key;
            $data['create_time'] = time();
            $this->model->create($data);
        } else {
            $this->model->where([['key', '=', $key]])->update($data);
        }
        return true;
    }

    /**
     * 根据key获取短信通知配置
     * @param string $key
     * @return array
     */
    public function find(string $key)
    {
        return $this->getInfo($key);
    }

}

3.7 短信字典

php
<?php

namespace app\dict\sys;

/**
 * 短信枚举类
 */
class SmsDict
{
    // 阿里云短信
    public const ALISMS = 'aliyun';
    public const NIUSMS = 'niuyun';
    // 腾讯云短信
    public const TENCENTSMS = 'tencent';
    public const SENDING = 'sending';
    public const SUCCESS = 'success';
    public const FAIL = 'fail';
    public const LOGIN = 'login';
    public const REGISTER = 'register';
    public const BIND_MOBILE = 'bind_mobile';
    public const FIND_PASS = 'find_pass';
    public const SCENE_TYPE = [
        self::LOGIN,
        self::REGISTER,
        self::BIND_MOBILE,
        self::FIND_PASS
    ];

    public static function getType()
    {
        $system = [
            self::NIUSMS => [
                'name' => '牛云短信',
                // 配置参数
                'params' => [],
                'encrypt_params' => [],
                'show_type'=>'view',
                'view' => '/src/views/setting/sms_niu.vue',
                'component' => '',
            ],
            self::ALISMS => [
                'name' => '阿里云短信',
                // 配置参数
                'params' => [
                    'sign' => '短信签名',
                    'app_key' => 'APP_KEY',
                    'secret_key' => 'SECRET_KEY'
                ],
                'encrypt_params' => ['secret_key'],
                'show_type'=>'component',
                'component' => '/src/views/setting/components/sms-ali.vue',
            ],
            self::TENCENTSMS => [
                'name' => '腾讯云短信',
                // 配置参数
                'params' => [
                    'sign' => '短信签名',
                    'app_id' => 'APP_ID',
                    'secret_id' => 'SECRET_ID',
                    'secret_key' => 'SECRET_KEY'
                ],
                'encrypt_params' => ['secret_key'],
                'show_type'=>'component',
                'component' => '/src/views/setting/components/sms-tencent.vue',
            ],
        ];
        $extend = event('SmsType');
        return array_merge($system, ...$extend);
    }

    // 支持的短信场景

    public static function getStatusType()
    {
        return [
            self::SENDING => 'dict_sms.status_sending',
            self::SUCCESS => 'dict_sms.status_success',
            self::FAIL => 'dict_sms.status_fail',
        ];
    }

    // 牛云短信特有的字典方法

    // 签名审核状态
    public const API_AUDIT_RESULT_WAIT = 1;
    public const API_AUDIT_RESULT_PASS = 2;
    public const API_AUDIT_RESULT_REFUSE = 3;

    // 余额分配类型
    public const BALANCE_RECHARGE_ADD = 1;
    public const BALANCE_RECHARGE_REDUCE = 2;

    // 参数类型
    public const PARAMS_TYPE_VALID_CODE = 'valid_code';
    public const PARAMS_TYPE_MOBILE_NUMBER = 'mobile_number';
    public const PARAMS_TYPE_OTHER_NUMBER = 'other_number';
    public const PARAMS_TYPE_AMOUNT = 'amount';
    public const PARAMS_TYPE_DATE = 'date';
    public const PARAMS_TYPE_CHINESE = 'chinese';
    public const PARAMS_TYPE_OTHERS = 'others';

    /**
     * 获取签名审核状态
     * @param string $type
     * @return array|string
     */
    public static function getSignAuditType(string $type = '')
    {
        $data = [
            self::API_AUDIT_RESULT_WAIT => get_lang('dict_sms_api.sign_audit_status_wait'),
            self::API_AUDIT_RESULT_PASS => get_lang('dict_sms_api.sign_audit_status_pass'),
            self::API_AUDIT_RESULT_REFUSE => get_lang('dict_sms_api.sign_audit_status_refuse'),
        ];
        return $type ? $data[$type] : $data;
    }

    /**
     * 获取余额分配类型
     * @param string $type
     * @return array|string
     */
    public static function getBalanceAllocateType(string $type = '')
    {
        $data = [
            self::BALANCE_RECHARGE_ADD => get_lang('dict_sms_api.balance_add'),
            self::BALANCE_RECHARGE_REDUCE => get_lang('dict_sms_api.balance_reduce'),
        ];
        return $type ? $data[$type] : $data;
    }

    /**
     * 获取签名来源
     * @param string $source
     * @return array
     */
    public static function getSignSource(string $source = '')
    {
        $data = [
            ['type' => 1, 'name' => '企业名称'],
            ['type' => 2, 'name' => '事业单位'],
            ['type' => 3, 'name' => '商标'],
            ['type' => 4, 'name' => 'APP'],
            ['type' => 5, 'name' => '小程序'],
        ];
        return $source ? [] : $data;
    }

    /**
     * 获取签名类型
     * @param string $type
     * @return array
     */
    public static function getSignType(string $type = '')
    {
        $data = [
            ['type' => 0, 'name' => '全称'],
            ['type' => 1, 'name' => '简称'],
        ];
        return $type ? [] : $data;
    }

    /**
     * 获取签名默认设置
     * @param string $type
     * @return array
     */
    public static function getSignDefault(string $type = '')
    {
        $data = [
            ['type' => 0, 'name' => '否'],
            ['type' => 1, 'name' => '是'],
        ];
        return $type ? [] : $data;
    }

    /**
     * 获取API参数类型
     * @return array
     */
    public static function getApiParamsType()
    {
        return [
            [
                'name' => '验证码',
                'type' => self::PARAMS_TYPE_VALID_CODE,
                'desc' => '4-6位纯数字',
                'rule' => '/^\d$/',
                'min'=>4,
                'max'=>6
            ],
            [
                'name' => '手机号',
                'type' => self::PARAMS_TYPE_MOBILE_NUMBER,
                'desc' => '1-15位纯数字',
                'rule' => '/^\d$/',
                'min'=>1,
                'max'=>15
            ],
            [
                'name' => '其他号码',
                'type' => self::PARAMS_TYPE_OTHER_NUMBER,
                'desc' => '1-32位字母+数字组合',
                'rule'=>'/^[a-zA-Z0-9]$/',
                'min'=>1,
                'max'=>32
            ],
            [
                'name' => '金额',
                'type' => self::PARAMS_TYPE_AMOUNT,
                'desc' => '支持数字或数字的中文 (壹贰叁肆伍陆柒捌玖拾佰仟万亿 圆元整角分厘毫)',
                'rule' => "/^(?:\d+|(?:[零壹贰叁肆伍陆柒捌玖拾佰仟万亿圆角分厘毫]+|圆|元|整)+)$/u"
            ],
            [
                'name' => '日期',
                'type' => self::PARAMS_TYPE_DATE,
                'desc' => '符合时间的表达方式 也支持中文:2019年9月3日16时24分35秒',
                'rule' => ''
            ],
            [
                'name' => '中文',
                'type' => self::PARAMS_TYPE_CHINESE,
                'desc' => '1-32中文,支持中文园括号()',
                'rule' => '/^[\p{Han}()()]$/u',
                'min'=>1,
                'max'=>32
            ],
            [
                'name' => '其他',
                'type' => self::PARAMS_TYPE_OTHERS,
                'desc' => ' 1-35个中文数字字母组合,支持中文符号和空格',
                'rule' => '/^[\p{Han}\p{N}\p{L}\p{P}\p{S}\s]$/u',
                'min'=>1,
                'max'=>35
            ],
        ];
    }

}

4. 短信发送流程

4.1 配置流程

  1. 登录后台管理系统
  2. 进入系统设置 -> 短信设置
  3. 选择短信服务商并填写配置参数
  4. 保存配置并启用

4.2 模板配置流程

  1. 进入短信通知模板管理
  2. 选择要配置的模板类型
  3. 填写短信模板ID和内容
  4. 启用模板

4.3 短信发送流程

  1. 系统触发短信发送事件(如用户注册、登录验证等)
  2. 根据事件类型获取对应的短信模板
  3. 替换模板中的变量(如验证码、用户名等)
  4. 调用短信服务商的API发送短信
  5. 记录短信发送状态和结果

5. 数据模型

5.1 短信通知模型

  • 表名:sys_sms_notice
  • 主要字段:
    • key:模板键名
    • is_sms:是否启用短信通知
    • sms_id:短信模板ID
    • sms_content:短信内容
    • param_json:参数JSON
    • create_time:创建时间
    • update_time:更新时间

5.2 短信发送记录模型

  • 表名:sys_sms_log
  • 主要字段:
    • id:记录ID
    • mobile:手机号
    • content:短信内容
    • status:发送状态
    • error_msg:错误信息
    • create_time:发送时间

6. 开发注意事项

6.1 安全考虑

  • 短信配置中的密钥信息应加密存储
  • 短信验证码应设置有效期
  • 防止短信轰炸攻击,限制同一手机号的发送频率

6.2 性能优化

  • 短信发送应采用异步处理,避免阻塞主流程
  • 对短信发送结果进行缓存,减少重复查询

6.3 错误处理

  • 短信发送失败时应进行重试机制
  • 记录详细的错误信息,便于排查问题

6.4 最佳实践

  • 根据业务场景选择合适的短信服务商
  • 合理设置短信模板,确保内容清晰明了
  • 定期清理短信发送记录,避免数据量过大

7. 常见问题

7.1 短信发送失败

  • 检查短信配置是否正确
  • 确认短信模板是否已审核通过
  • 检查账户余额是否充足
  • 查看发送记录中的错误信息

7.2 短信接收延迟

  • 可能是短信服务商的网络延迟
  • 检查手机信号是否良好
  • 确认短信是否被手机安全软件拦截

7.3 短信验证码不生效

  • 检查验证码是否正确
  • 确认验证码是否在有效期内
  • 检查短信模板中的变量替换是否正确

8. 总结

短信管理模块是系统中重要的通信工具,通过本文档的指导,开发人员可以了解短信管理的核心功能和实现逻辑,从而更好地集成和扩展短信功能。系统支持多种短信服务商,提供了完整的配置管理、模板管理和发送记录功能,满足不同业务场景的需求。