MS Teams聊天卡片按钮能否启动带撰写能力TaskModule并回传卡片
Teams会话卡片循环交互实现方案
预期实现流程
- 用户点击聊天会话内卡片上的按钮,启动支持内容撰写的TaskModule
- 用户提交TaskModule内容后,生成的新卡片插入聊天会话
- 其他用户可通过新插入的卡片重新触发流程,实现循环交互
现有流程断点
现有示例代码可覆盖前3步流程,第4步出现中断:
- 用户A触发Messaging Extension操作
composeExtension/fetchTask,应用正常启动TaskModule - 用户A提交TaskModule,触发
composeExtension/submitAction事件,应用正常将生成卡片添加到聊天撰写框 - 用户B点击聊天内已发送卡片的按钮,触发
task/fetch事件,应用正常启动TaskModule - 用户B提交TaskModule,触发
task/submit事件,该处理逻辑不属于Messaging Extension处理器范畴,应用无法完成卡片添加到会话/撰写框的操作
注:上述步骤1、2也可通过link unfurl(链接展开)能力替代实现。
最低摩擦成本落地方案
核心逻辑:直接在task/submit处理逻辑中通过当前会话上下文发送卡片,无需额外授权,无需跳转,用户点击按钮的操作即代表使用许可。
不需要强制走Messaging Extension的撰写框返回逻辑,具体改动点如下:
- 原有
task/fetch触发TaskModule、消息扩展提交、链接展开的逻辑全部保留,不需要修改 - 重写
handleTeamsTaskModuleSubmit处理方法:收到TaskModule提交请求时,直接调用TurnContext的sendActivity方法,将生成的新卡片作为附件发送到当前聊天会话,之后返回空的TaskModule响应关闭弹窗即可 - 新发送的卡片自带相同的触发按钮,其他用户点击即可重新启动流程,形成完整循环
修正后的核心代码片段
仅需替换原有handleTeamsTaskModuleSubmit方法实现,其余代码无需调整:
// 处理task/submit事件 handleTeamsTaskModuleSubmit = async ( context: TurnContext, taskModuleRequest: TaskModuleRequest ): Promise<TaskModuleResponse> => { // 直接向当前会话发送新生成的卡片 await context.sendActivity({ attachments: [getChatCard()] }); // 关闭TaskModule弹窗 return { task: { type: "continue", value: null } }; };
方案说明
- 权限层面:卡片按钮触发的invoke请求自带当前会话的合法权限,
context.sendActivity可以直接在当前会话发消息,不需要用户单独给应用授权,符合无额外授权的要求 - 交互成本:卡片直接发送到会话,省去用户手动点击发送按钮的步骤,比消息扩展返回撰写框的流程摩擦成本更低
- 兼容性:完全复用原有
getChatCard卡片生成逻辑,和消息扩展、链接展开生成的卡片体验完全一致
补充:如果业务要求必须把卡片插入用户个人撰写框而非直接发送到会话,目前Teams没有提供从普通
task/submit事件触发撰写框插入的公开能力,直接发送到会话是唯一无额外授权、无额外页面跳转的可行方案。
内容的提问来源于stack exchange,提问作者bjnsn
相关产品推荐
相关产品推荐

