thinkphp 8.0 不内置短信功能,须集成第三方 sdk;禁用已废弃的 think-sms 和静态调用,需满足 php≥8.0、openssl/curl 扩展启用等环境要求,推荐阿里云或腾讯云官方 sdk,并通过接口抽象与依赖注入实现解耦调用。

ThinkPHP 8.0 本身不提供短信发送能力,必须通过第三方 SDK 封装实现。直接套用 TP6 的 think-sms 包或老式静态调用(如 Sms::send())会报错,因为 TP8 已移除静态单例、废弃辅助类(如 think\helper\Str)、不兼容 PHP 8+ 类型声明,且自动加载规则已变更。
确认环境与依赖基础
确保以下条件全部满足,否则后续步骤无法执行:
- PHP 版本 ≥ 8.0(TP8 强制要求)
- 已启用
openssl扩展(用于 HTTPS 请求和签名) - 已启用
curl扩展(绝大多数短信 SDK 依赖) - Composer 可用,推荐配置阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
选择并安装短信 SDK
不要安装已失效的 topthink/think-sms,改用厂商官方 SDK 或轻量适配包:
- 阿里云 SMS:安装
alibabacloud/client(官方 SDK)composer require alibabacloud/client - 腾讯云 SMS:安装
tencentcloud/tencentcloud-sdk-phpcomposer require tencentcloud/tencentcloud-sdk-php - 若需快速验证逻辑,可先用本地模拟服务(如
mock-sms-driver)避免频繁调用真实网关
定义接口并绑定实现类
在 app/interfaces/ 下新建 SmsServiceInterface.php:
php
interface SmsServiceInterface {
public function send(string $phone, string $template, array $data = []): bool;
public function sendBatch(array $phones, string $template, array $data = []): int;
}
再创建实现类(如 app/service/AliyunSmsService.php),注入厂商客户端,并在 app/provider/AppServiceProvider.php 的 register() 方法中绑定:
$this->app->bind(SmsServiceInterface::class, AliyunSmsService::class);
控制器中调用发送验证码
在用户请求验证码时(如 UserController@sendCode),通过容器获取服务:
public function sendCode(Request $request)
{
$phone = $request->param('phone');
$service = $this->app->get(SmsServiceInterface::class);
if ($service->send($phone, 'SMS_123456789', ['code' => rand(100000, 999999)])) {
return json(['code' => 0, 'msg' => '发送成功']);
} else {
return json(['code' => 1, 'msg' => '发送失败']);
}
}
注意:
– 模板 ID(如 SMS_123456789)需提前在厂商控制台申请并审核通过
– 验证码应存入缓存(如 Redis)并设置 5 分钟过期,供后续登录校验使用
– 建议加频次限制(如每手机号 60 秒内仅限 1 次)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











