钉钉机器人发送 Markdown 消息时表格渲染异常,通常是因为使用了标准 Markdown 表格语法而非 HTML 标签,或者消息体 JSON 结构缺失 text 字段。最推荐的修复方向是将表格代码改为<table>、<tr>、<td>组合,并严格校验 webhook 请求参数。
先说结论:钉钉机器人对标准 Markdown 表格语法支持不完整,需改用 HTML 标签构建表格,同时确保 JSON 参数结构正确。
- 先确认:检查请求体中 markdown 对象是否包含 title 和 text 字段
- 先处理:将表格语法从 |列 | 替换为<table><tr><td>结构
- 再验证:分别在 PC 端和移动端钉钉查看消息渲染效果
快速处理思路
如果收到参数 markdown --》text 缺失错误,直接检查 JSON payload 结构。Markdown 类型消息必须包含 msgtype 字段和 markdown 对象,且 markdown 对象内必须有 text 字段。以下是正确的请求体结构示例:
{
"msgtype": "markdown",
"markdown": {
"title": "数据报表",
"text": "## 数据详情\n\n\n姓名 部门 \n张三 技术部 \n
"
}
}注意 text 字段内容中,标签后建议添加\n 换行符,段落间使用\n\n以确保移动端正常换行。
为什么会这样
钉钉机器人的 Markdown 渲染器基于特定版本的规范实现,并对 HTML 标签做了有限支持。官方文档未公开承诺支持标准 Markdown 表格语法,导致使用 | 和 - 构建的表格常被忽略或报错。实际上,钉钉会将部分 Markdown 内容转换为 HTML 进行渲染,PC 端基于浏览器内核支持较完整,而移动端 APP 采用精简引擎,对复杂 HTML 支持有限,这造成了双端显示差异。
分步处理
第一步:校验消息结构。确保 HTTP POST 请求的 Content-Type 为 application/json,且 body 中包含 msgtype: markdown。若使用加签安全设置,需正确生成 timestamp 和 sign 参数,否则请求会被拦截。
第二步:替换表格语法。放弃使用 | 列 1 | 列 2 | 格式,改用原生 HTML 表格标签。构建<table>包裹<tr>行,每行内使用<td>单元格。不需要添加 style 样式属性,因为移动端往往会剥离背景色和字体大小设置。
第三步:处理换行符。在每个 HTML 标签后添加\n,在段落之间添加\n\n。仅使用单个\n 在部分钉钉客户端中可能无法触发换行,导致内容粘连。
怎么验证是否生效
发送测试消息后,首先在 PC 端钉钉查看表格边框是否清晰、数据是否对齐。随后在移动端钉钉 APP 查看同一消息,确认数据是否堆叠、边框是否消失。若移动端显示异常但数据可见,属于正常渲染限制;若消息发送失败并返回错误码,需检查日志中是否有参数缺失提示。
常见坑
移动端样式失效:不要在<td>中设置 font-size 或 background-color,移动端 APP 通常会忽略这些样式,仅保留文本内容。
换行符无效:如果消息所有内容挤在一行,检查代码中是否将\n 转义成了 literal 字符,确保发送的是实际的换行符。
安全签名错误:时间戳需为毫秒级,且签名字符串格式为 timestamp\nsecret,URL 编码不规范会导致签名验证失败。
常见问题
报错参数 markdown --》text 缺失怎么办?
检查 JSON 请求体中 markdown 对象内是否包含 text 字段,且该字段不为空。
为什么 PC 端正常但手机端表格边框消失?
移动端钉钉采用精简渲染引擎,会剥离部分 HTML 样式,仅保留文本结构,属于已知限制。
Markdown 消息中换行符\n 不生效如何解决?
尝试将单个\n 改为双个\n\n,钉钉开放平台部分场景下需要双换行符才能触发正确换行。
参考来源
钉钉机器人 Markdown 表格发送全攻略:解决 APP 端显示不全问题
钉钉机器人 Markdown 表格发送实战:绕过限制的巧妙方案
钉钉开放平台调取发送 markdown 消息无法换行问题解决
消息发送与接收类型 - 钉钉开放平台文档