Webhook
这篇解决什么
系统里没有单独的「Webhook 配置」菜单,也没有飞书 / 企微群机器人客户端。现成能力是短信渠道里的「调试(钉钉)」:把本该发到手机的内容,推到钉钉群。
读完能改 DebugDingTalkSmsClient、在后台配 access_token / 加签密钥,并按同一套适配器给飞书、企微补出站推送。默认端口 48080,管理端前缀 /admin-api。PC 开发页 http://127.0.0.1:5800。
示意图:后台只维护渠道行;业务仍调短信发送 API。渠道编码是 DEBUG_DING_TALK 时,出站打钉钉 Webhook,不打短信网关。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 调试客户端 | 钉钉自定义机器人,msgtype=text | ruoyi-office/yudao-module-system/.../sms/core/client/impl/DebugDingTalkSmsClient.java |
| 渠道枚举 | DEBUG_DING_TALK 显示名「调试(钉钉)」 | .../sms/core/enums/SmsChannelEnum.java |
| 客户端工厂 | switch 里创建上述客户端 | .../sms/core/client/impl/SmsClientFactoryImpl.java |
| 渠道表 | @TableName("system_sms_channel") | .../dal/dataobject/sms/SmsChannelDO.java |
| 渠道接口 | @RequestMapping("system/sms-channel") | .../controller/admin/sms/SmsChannelController.java |
| 渠道页 | 菜单「短信渠道」,路由 /system/messages/sms/sms-channel | ruoyi-office-vben/apps/web-antd/src/views/system/sms/channel/ |
| 前端 API | /system/sms-channel | .../src/api/system/sms/channel/ |
| 字典 | system_sms_channel_code,值 DEBUG_DING_TALK | 字典类型 DICT_TYPE.SYSTEM_SMS_CHANNEL_CODE |
官方菜单 id:1093 短信管理,1094 短信渠道。按钮权限:system:sms-channel:query / create / update / delete。完整短信链路见 短信配置。
管理端入口
没有 /infra/webhook 页面。出站机器人目前只挂在短信渠道上。打开系统管理 → 消息中心 → 短信管理 → 短信渠道,能看到「调试(钉钉)」这一行。

本系统截图:短信渠道列表。编号 4「测试渠道」的渠道编码是「调试(钉钉)」。

本系统截图:点「新增短信渠道」。渠道编码下拉来自字典 system_sms_channel_code,选「调试(钉钉)」后按下一节填账号和密钥。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 列表 / 表单 | 签名、编码、账号、密钥、回调 URL | views/system/sms/channel/data.ts |
| 保存 VO | signature / code / apiKey / apiSecret / callbackUrl | .../vo/channel/SmsChannelSaveReqVO.java |
| 发送入口 | 校验模板和渠道,落日志后再异步 doSendSms | .../service/sms/SmsSendServiceImpl.java |
列表会露出密钥
渠道页直接展示 apiKey / apiSecret。库备份、导出、越权打开这一页都能看到。权限只给运维;机器人 access_token 和加签密钥不要写进文档,也不要提交进仓库。
钉钉调试渠道
system_sms_channel 带 @TenantIgnore,全实例共用。调试渠道把字段挪作机器人凭证,不再表示云短信账号。
按 SmsChannelDO 画出的关系:模板必须挂一个渠道;日志冗余渠道编码。调试渠道的 callback_url 用不上。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
code | 必须是 DEBUG_DING_TALK | SmsChannelEnum |
apiKey | 机器人 Webhook 的 access_token | SmsChannelDO.apiKey |
apiSecret | 机器人「加签」密钥,构造函数里非空校验 | SmsChannelDO.apiSecret |
callbackUrl | 钉钉客户端不解析回执,可空 | DebugDingTalkSmsClient#parseSmsReceiveStatus |
signature | 渠道必填,调试路径不发给钉钉 | SmsChannelSaveReqVO |
发送时 SmsSendServiceImpl#doSendSms 按渠道 id 取客户端。DebugDingTalkSmsClient#sendSms 组一条文本:
- 地址:
https://oapi.dingtalk.com/robot/send?access_token={apiKey}×tamp={毫秒}&sign={签名} - 签名:
timestamp + "\n" + secret,HMAC-SHA256 后再 Base64,算法见 钉钉自定义机器人 - 正文:
msgtype=text,内容带「模拟短信」、手机号、短信日志编号、模板参数
getSmsTemplate 直接返回审核通过,方便本地保存模板。parseSmsReceiveStatus 抛 UnsupportedOperationException,平台回执接口不要指向这条渠道。
只用来省短信费
模板页「测试」、登录发码、工作流通知,只要绑了这条渠道,群里只会收到模拟文本,手机收不到真短信。生产验证码必须换阿里云 / 腾讯云 / 华为云 / 七牛,见 短信配置。
飞书与企微
SmsChannelEnum 只有五种:DEBUG_DING_TALK、ALIYUN、TENCENT、HUAWEI、QINIU。没有飞书、没有企微。统一消息中心同样没有群机器人渠道。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 消息渠道枚举 | 站内信 / 短信 / 邮件 / App 推送 / 微信订阅 | yudao-module-system/.../enums/msg/MsgChannelEnum.java |
| 已实现适配器 | 只有前三个 | .../service/msg/channel/*ChannelAdapter.java |
| 派发器 | 按 channel 找适配器,没有就记 NO_ADAPTER | .../service/msg/channel/MessageChannelDispatcher.java |
| IoT 告警 | 注释里预留 webhook 4,枚举未落地 | yudao-module-iot-api/.../alert/IotAlertReceiveTypeEnum.java |
三家官方出站地址不同,不要互相套字段。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 钉钉自定义机器人 | access_token + 加签,已有客户端 | DebugDingTalkSmsClient;开放平台 |
| 飞书自定义机器人 | 群里加机器人拿 Webhook,可加签 | 无客户端;飞书开放平台 |
| 企微消息推送 | 原「群机器人」。POST .../cgi-bin/webhook/send?key= | 无客户端;企微开发者中心 |
企微这条文档以 developer.work.weixin.qq.com 为准。key 等于写入权限,泄漏后任何人都能往群里灌消息。
要做成正式通知渠道,不要再往 SmsChannelEnum 里塞平台。按统一消息中心加枚举值和 MessageChannelAdapter:getChannel() 返回新值,send 里 POST 官方 Webhook,成功返回 MsgChannelSendResult,失败抛异常由派发器落库。
这三处不是群机器人
社交登录的钉钉 / 企微是 OAuth,枚举在 SocialTypeEnum(DINGTALK、WECHAT_ENTERPRISE),页面是系统管理 → 社交客户端。JustAuth 里虽有 AuthFeishuRequest,SocialTypeEnum 没有飞书值。yudao-module-weiwork 是企微智能客服(托管账号、会话、关键词),入口在 /admin-api/weiwork/**,不能当群机器人用。
配置与操作
没有 Webhook 菜单。管理员在 短信渠道 选「调试(钉钉)」,填机器人 access_token 和加签密钥。保存后该渠道的 SmsSendApi 推到群,不发手机。
入站回执仍是 /system/sms/callback/{channel}。不要和三方登录客户端搞混。开启见 基建功能设计。截图见上文渠道。
