Laravel短信发送失败主因是未正确集成通知系统:需用jacobcyl/aliyunsms包而非alibabacloud/sdk,确保模型使用Notifiable trait、routeNotificationForSms()返回有效手机号,且模板设为测试状态。

别用 alibabacloud/sdk 直接塞进 Laravel 通知系统——它不认 .env、不自动绑定容器、via('sms') 会静默失败,90% 的“发不出短信”问题都卡在这一步。
为什么 toSms() 方法根本不执行
Laravel 的通知渠道调用依赖 routeNotificationForSms() 方法返回有效手机号,且模型必须使用 Notifiable trait。这个方法不抛异常,返回空、null、0 或字段名写错(比如数据库字段是 mobile,但方法里写 $this->phone),就会跳过整个短信发送流程。
- 检查模型是否声明了
use Notifiable; - 确认
routeNotificationForSms()返回的是非空字符串,例如:public function routeNotificationForSms() { return $this->mobile ?: null; } - 不要在该方法里做耗时操作或未捕获的 DB 查询,失败时直接返回
null
用哪个包才能让 SmsChannel 真正跑起来
推荐用 jacobcyl/aliyunsms,它自带 SmsChannel 实现和 AliyunSmsServiceProvider,能自然接入 Laravel 通知流。而 alibabacloud/sdk 是通用 RPC SDK,没封装通知渠道逻辑,硬套进去得自己写完整 SmsChannel 类、手动解析响应、处理重试和日志——不是不能,是没必要多绕三道弯。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 执行
composer require jacobcyl/aliyunsms - 运行
php artisan vendor:publish --provider="Jacobcyl\AliyunSms\AliyunSmsServiceProvider" - 在
config/services.php中补全:'aliyun_sms' => [ 'access_key_id' => env('ALIYUN_SMS_ACCESS_KEY_ID'), 'access_key_secret' => env('ALIYUN_SMS_ACCESS_KEY_SECRET'), 'region_id' => env('ALIYUN_SMS_REGION_ID', 'cn-hangzhou'), 'sign_name' => env('ALIYUN_SMS_SIGN_NAME'), 'template_code' => env('ALIYUN_SMS_TEMPLATE_CODE'), ], - 在通知类的
via()中返回['sms'],toSms()返回数组即可,无需手动拼 JSON
SignatureDoesNotMatch 错误八成是 region_id 写错了
这个错误和签名密钥无关,纯粹是参数格式不对。ALIYUN_SMS_REGION_ID 只接受区域 ID 字符串(如 cn-hangzhou),不是 endpoint URL。很多人复制控制台里的调用地址,填成 https://dysmsapi.aliyuncs.com 或 dysmsapi.aliyuncs.com,SDK 就会用错签名域,直接报错。
- 合法值只有:
cn-hangzhou、cn-shanghai、ap-southeast-1等(见阿里云文档) - 别从接口文档里抄 host,要去「短信控制台 → 应用管理 → 区域设置」里查真实 region ID
- 如果用了 RAM 子账号,确保已授予
AliyunDysmsFullAccess权限,否则连 region 校验都通不过
队列里发短信失败却不报错?检查驱动配置和日志开关
用 ShouldQueue 接口发短信时,失败默认只写日志,不会抛出异常中断请求。如果你没开日志或队列驱动配错,就会发现“没发出去”,但没有任何提示。
- 确保
QUEUE_CONNECTION不是sync(开发时容易忽略) - 用 database 驱动时,确认已运行
php artisan queue:table && php artisan migrate - 用 redis 驱动时,检查
REDIS_HOST是否指向容器名(Docker 下不能写localhost) -
jacobcyl/aliyunsms默认记录日志到laravel.log,关键词搜AliyunSms能看到完整请求与响应
最常被跳过的其实是模板审核状态:测试期必须把模板设为「测试模板」,否则即使所有配置全对,也会卡在 isv.BUSINESS_LIMIT_CONTROL —— 这个限制不报错,只静默拒绝,得去阿里云控制台人工点一下开关。

















