惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
The Register - Security
The Register - Security
Stack Overflow Blog
Stack Overflow Blog
博客园 - 三生石上(FineUI控件)
T
Threat Research - Cisco Blogs
S
SegmentFault 最新的问题
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Proofpoint News Feed
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
M
MIT News - Artificial intelligence
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
B
Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
C
Cybersecurity and Infrastructure Security Agency CISA
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
U
Unit 42
腾讯CDC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
H
Help Net Security
Recent Announcements
Recent Announcements
P
Privacy & Cybersecurity Law Blog
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
H
Heimdal Security Blog
博客园 - 聂微东
S
Securelist
大猫的无限游戏
大猫的无限游戏
Cloudbric
Cloudbric
Cisco Talos Blog
Cisco Talos Blog

博客园 - 猫猫客服

Goframe 学习笔记 cursor编辑器 ai客服 laravel12 微服务 Claude Code 海量数据查询,es替代方案 数据库设计 php消费者 转载,电商系统多规格 php响应 docker,2024年8月9日 使用wsl,windows自带的linux虚拟机 go 微服务 vue3 前端工具 java基础 架构 es学习 简单分表 go 指针
接口类,需要指定入参类型,出参类型
猫猫客服 · 2025-11-06 · via 博客园 - 猫猫客服

根据你的需求,我设计了一套符合 接口规范 + 工厂模式 的短信发送方案,统一方法名和返回格式,支持动态切换腾讯云 / 阿里云接口,结构清晰且易于扩展。

app/
├── common/
│   └── lib/
│       ├── sms/
│       │   ├── contract/      # 接口契约
│       │   │   └── SmsInterface.php  # 短信接口规范
│       │   ├── dto/           # 数据传输对象(统一返回格式)
│       │   │   └── SmsResult.php     # 短信返回结构体
│       │   ├── impl/          # 第三方实现
│       │   │   ├── AliyunSms.php     # 阿里云短信实现
│       │   │   └── TencentSms.php    # 腾讯云短信实现
│       │   └── SmsFactory.php        # 短信工厂类
├── config/
│   └── sms.php                       # 短信配置文件
└── controller/
    └── TestController.php            # 测试控制器
 

image

app/common/lib/sms/contract/SmsInterface.php

<?php
namespace app\common\lib\sms\contract;

use app\common\lib\sms\dto\SmsResult;

app/common/lib/sms/dto/SmsResult.php

<?php
namespace app\common\lib\sms\dto;

app/common/lib/sms/impl/AliyunSms.php

<?php
namespace app\common\lib\sms\impl;

use app\common\lib\sms\contract\SmsInterface;
use app\common\lib\sms\dto\SmsResult;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Dyplsapi\Dyplsapi;
use think\facade\Config;

class AliyunSms implements SmsInterface
{
    

app/common/lib/sms/impl/TencentSms.php

<?php
namespace app\common\lib\sms\impl;

use app\common\lib\sms\contract\SmsInterface;
use app\common\lib\sms\dto\SmsResult;
use Qcloud\Sms\SmsSingleSender;
use think\facade\Config;

class TencentSms implements SmsInterface
{
    

app/common/lib/sms/SmsFactory.php

<?php
namespace app\common\lib\sms;

use app\common\lib\sms\contract\SmsInterface;
use think\facade\Config;
use InvalidArgumentException;

class SmsFactory
{
    

config/sms.php

<?php
return [
    // 默认短信驱动(aliyun/tencent)
    'default' => env('SMS_DEFAULT', 'aliyun'),

    
# 短信配置
SMS_DEFAULT=aliyun # 默认驱动

# 阿里云短信
ALIYUN_SMS_ACCESS_KEY_ID=your_access_key_id
ALIYUN_SMS_ACCESS_KEY_SECRET=your_access_key_secret
ALIYUN_SMS_SIGN_NAME=你的短信签名

# 腾讯云短信
TENCENT_SMS_APP_ID=your_app_id
TENCENT_SMS_APP_KEY=your_app_key
TENCENT_SMS_SIGN_NAME=你的短信签名

app/controller/TestController.php

<?php
namespace app\controller;

use app\common\lib\sms\SmsFactory;
use app\common\lib\sms\dto\SmsResult;
use think\facade\Log;
use think\response\Json;

class TestController
{
    

需要安装对应第三方 SDK:

# 阿里云SDK
composer require alibabacloud/dyplsapi-20170525

# 腾讯云SDK
composer require qcloudsms/qcloudsms_php
  1. 接口规范约束:所有第三方实现必须遵循 SmsInterface,确保方法名(send)和参数格式统一
  2. 统一返回格式:通过 SmsResult DTO 类,规范返回结构(类似 Go 的 struct),上层无需关心第三方差异
  3. 工厂模式动态切换:通过 SmsFactory::make() 可快速切换驱动,无需修改业务代码
  4. 配置分离:敏感配置放在环境变量,支持多环境部署
  5. 调试友好:调试模式下返回第三方原始响应,便于问题排查
  6. 扩展性强:新增短信服务商(如华为云、极光短信)时,只需:
    • 新建实现类并实现 SmsInterface
    • 在工厂类的 driverMap 中添加映射
    • 在配置文件中添加对应配置
  1. 需先在对应云服务商控制台完成短信签名和模板的审核
  2. 确保环境变量中配置了正确的 AccessKey、AppID 等敏感信息
  3. 生产环境建议关闭调试模式(app_debug=false),避免泄露原始响应数据
  4. 可根据实际需求扩展 SmsInterface(如添加批量发送、短信回执查询等方法)