如何用Microsoft Bot Framework获取MS Teams中Adaptive Card Action.Submit的用户响应
基于Microsoft Bot Framework v4捕获Teams渠道Adaptive Card提交响应方案
你当前的Adaptive Card配置逻辑符合Teams兼容标准,仅需在后端Bot逻辑中添加对应提交事件的处理逻辑即可捕获用户点击响应,具体实现步骤如下:
第一步:定位Bot主处理类
你的Bot逻辑入口一般为继承自ActivityHandler/TeamsActivityHandler的自定义类,所有Teams端推送的事件都会流经该类的对应处理方法。第二步:添加提交事件处理逻辑
Teams端Adaptive Card的Action.Submit/Action.Execute动作都会以特定格式推送到后端,你可以任选以下两种方式处理:
方式1:通用Message活动处理(兼容所有版本场景)
Action.Submit和降级后的Action.Execute都会以Message类型活动推送,你只需要重写OnMessageActivityAsync方法解析Activity.Value字段即可:
// 可选:先定义和卡片data字段匹配的强类型模型,方便后续业务调用 public class SurveySubmitPayload { public bool Key1 { get; set; } public string Key2 { get; set; } public string Verb { get; set; } public string Id { get; set; } } // 重写消息处理方法 protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // Activity.Value不为空即为Adaptive Card提交请求 if (turnContext.Activity.Value != null) { var submitData = turnContext.Activity.Value as JObject; // 强类型转换写法:var payload = submitData.ToObject<SurveySubmitPayload>(); // 读取自定义字段判断用户点击选项 bool userSelectedYes = submitData.Value<bool>("key1"); string replyContent = userSelectedYes ? "感谢您的认可!" : "很抱歉没能满足您的需求,我们会持续优化内容。"; // 此处添加你的业务处理逻辑,比如存储反馈、更新卡片等 await turnContext.SendActivityAsync(MessageFactory.Text(replyContent), cancellationToken); return; } // 其他普通消息的处理逻辑 await base.OnMessageActivityAsync(turnContext, cancellationToken); }
方式2:Adaptive Card专属Invoke处理(适配高版本Teams通用动作)
如果你的Bot启用了Teams自适应卡片通用动作能力,Action.Execute会以Invoke类型活动推送,你可以重写OnAdaptiveCardInvokeAsync方法处理,支持直接返回新的卡片内容:
protected override async Task<AdaptiveCardInvokeResponse> OnAdaptiveCardInvokeAsync(ITurnContext<IInvokeActivity> turnContext, AdaptiveCardInvokeValue invokeValue, CancellationToken cancellationToken) { var submitData = invokeValue.Action.Data as JObject; bool userSelectedYes = submitData.Value<bool>("key1"); // 业务逻辑处理 // 如需返回新卡片直接填充Value字段即可,不需要返回卡片也可以返回200状态码表示处理成功 return new AdaptiveCardInvokeResponse { StatusCode = 200, Type = "application/vnd.microsoft.activity.message", Value = userSelectedYes ? "感谢您的认可!" : "很抱歉没能满足您的需求,我们会持续优化内容。" }; }
- 优化建议
你当前卡片的fallback节点未携带自定义data字段,建议补充对应配置,避免低版本Teams用户点击按钮后后端拿不到自定义参数:
"fallback": { "type": "Action.Submit", "title": "Yes", "data":{ "key1": true, "key2":"okay" } }
内容的提问来源于stack exchange,提问作者MarsRoverII
相关产品推荐
相关产品推荐

