MS Teams中Adaptive Cards如何调用外部API发送POST请求实现审批
MS Teams自适应卡片实现无跳转审批按钮方案
问题背景
通过webhook向MS Teams频道连接器推送Adaptive Card发起主管审批申请时,需要实现底部的批准、拒绝按钮:
- 最初计划通过接收POST JSON请求体的API端点读取审批状态参数,该方案已被MS Teams弃用不支持
- 改用
Action.OpenUrl把审批状态拼在查询参数里触发接口,会强制打开新浏览器标签页,不符合无跳转调用的要求
当前使用的webhook请求JSON示例:
{ "type": "message", "attachments": [ { "contentType": "application/vnd.microsoft.card.adaptive", "contentUrl": null, "content": { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.5", "msTeams": { "width": "full" }, "actions": [ { "type": "Action.OpenUrl", "title": "Approve", "url": "https://<api_endpoint_url>?approved=true" }, { "type": "Action.OpenUrl", "title": "Decline", "url": "https://<api_endpoint_url>?approved=false" } ] } } ] }
可行实现方案
普通入站频道连接器webhook本身存在能力限制,原生不支持无跳转POST回调,必须搭配中间层实现需求,两个落地性最强的方案如下:
方案1:基于Action.Submit搭配中间层接口(低代码快速实现)
使用支持Teams提交协议的中间层接收按钮回调,不需要跳转页面,用户点击后Teams会直接在客户端内完成POST请求,仅在消息下方显示提交结果提示。
- 中间层优先选择Power Automate的HTTP请求触发器:创建即时流,触发器选「当收到HTTP请求时」,配置好需要接收的参数(审批状态、审批单ID等),拿到流的POST地址
- 把原卡片的
Action.OpenUrl动作替换为Action.Submit,在msTeams字段下配置submitUrl为中间层地址,提交数据里直接携带布尔类型的审批状态 - 中间层收到请求后,再向你的业务API端点转发审批状态即可
- 如果要直接对接自有业务API,必须给接口配置CORS跨域策略允许Teams域名的请求,同时加签名校验防止接口被恶意调用
动作部分代码示例:
"actions": [ { "type": "Action.Submit", "title": "批准", "data": { "approved": true, "requestId": "对应审批单唯一标识" }, "msTeams": { "submitUrl": "中间层接口/业务API地址", "type": "imBack" } }, { "type": "Action.Submit", "title": "拒绝", "data": { "approved": false, "requestId": "对应审批单唯一标识" }, "msTeams": { "submitUrl": "中间层接口/业务API地址", "type": "imBack" } } ]
方案2:基于Teams Bot Framework发送可交互卡片(适合定制化需求高的场景)
如果有开发能力,可以注册Teams自定义Bot或者出站Webhook,通过Bot发送审批卡片:
- Bot发送的自适应卡片原生支持
Action.Execute动作,用户点击按钮后,Teams会直接把携带的审批状态数据POST到你配置的Bot消息接收端点,全程无跳转 - 收到回调后除了同步状态到业务系统,还可以主动调用接口更新原卡片内容,比如把按钮置灰、显示「已由XXX批准/拒绝」的状态,交互体验更好
注意:不要尝试在普通入站连接器webhook里仅修改卡片JSON实现无跳转提交,这类webhook的动作类型支持列表里没有无跳转POST的能力,所有声称可以直接实现的方法都经过验证不可用。
内容的提问来源于stack exchange,提问作者Georgi Stoyanov
相关产品推荐
相关产品推荐

