队列任务失败后需监听JobFailed事件并触发企业微信通知,通过异步任务发送带签名的HTTPS请求,配置敏感信息于.env和config/services.php中,并在最后一次重试失败时去重告警且记录日志。

队列任务失败后怎么自动触发企业微信通知
Laravel 默认只把失败任务写进 failed_jobs 表,不发通知。要告警,得自己钩住失败时机——最稳的方式是监听 Illuminate\Queue\Events\JobFailed 事件。
- 在
App\Providers\EventServiceProvider的$listen数组里加:Illuminate\Queue\Events\JobFailed::class => [App\Listeners\NotifyJobFailure::class] - 用
php artisan make:listener NotifyJobFailure --event=JobFailed生成监听器 - 别在监听器里直接调企业微信 API;先封装成可重试的异步通知任务(比如叫
SendWeComAlert),避免阻塞队列主流程
企业微信机器人 token 和 secret 怎么安全存取
硬编码或写死在配置里等于裸奔。Laravel 的 .env + config/services.php 是标准解法,但要注意加载顺序和缓存影响。
- 在
.env中加:WECOM_WEBHOOK_TOKEN=xxxWECOM_WEBHOOK_SECRET=yyy - 在
config/services.php里声明:'wecom' => ['webhook_token' => env('WECOM_WEBHOOK_TOKEN'), 'webhook_secret' => env('WECOM_WEBHOOK_SECRET')] - 运行
php artisan config:clear后再测试,否则config('services.wecom')可能读不到新值
为什么发不出消息?常见 HTTP 错误和签名问题
企业微信机器人要求 POST 请求带时间戳+签名,漏掉任意一项都会返回 40068 invalid signature 或 40013 invalid appid 类错误。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 签名生成必须用
HMAC-SHA256,且原文是timestamp\nsecret(注意换行符是\n,不是\r\n) - URL 拼接格式为:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={token}×tamp={ts}&sign={encoded_sign} - 用
GuzzleHttp\Client发请求时,确保json参数传的是数组,不是 JSON 字符串;否则会报invalid json
失败任务重试多次才告警,怎么控制通知频率
一个任务重试 3 次失败才真正“死亡”,但你不想每次失败都发一条消息——容易刷屏,也掩盖真正的问题点。
- 在监听器里通过
$event->job->attempts()判断当前是第几次失败 - 只在最后一次失败(即
$event->job->attempts() >= $event->job->maxTries())时触发通知 - 如果用了
redis队列,还可加个简单去重:用Cache::lock("alert:{$event->job->uuid()}", 300)->get(...)防止并发重复发
企业微信通知本身不保证送达,签名、网络、token 过期、群聊被删……每个环节都可能静默失败。建议在通知逻辑里补一层日志记录(含响应 body),否则故障时连“到底发没发出去”都难确认。


















