news 2026/9/30 12:11:43

企业微信API开发:消息收发与素材上传全链路工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
企业微信API开发:消息收发与素材上传全链路工程实践

官方文档:平台介绍 - QiWe API|企微 API 开发文档


一、业务痛点与技术背景

SCRM 日常:文本接待、发报价单 PDF、发产品图、群公告。高频误区:

  • 把图片 URL 塞进/msg/sendText→ 对端只看到字符串

  • 未区分userId/roomId→ 发错会话

  • 大文件同步上传 → 网关超时

  • 无client_msg_id→ 客服重试导致双发

正确模型:文本直发;图片/文件 = 上传素材拿 ID → 对应 send method。


二、核心架构设计与数据流转

业务发送意图 │ ▼ Message Facade │ kind=text ──────────────► method=/msg/sendText │ kind=image ──► upload ──► method=/msg/sendImage (imageId) │ kind=file ──► upload ──► method=/msg/sendFile (fileId) ▼ Delivery Store (client_msg_id, guid, toId, chatType, status)

统一入口永远是doApi,只改method与params。


三、关键代码与配置示例

3.1 文本发送(带会话类型)

from enum import Enum class ChatType(str, Enum): USER = "user" ROOM = "room" def send_text(client: QiWeClient, guid: str, to_id: str, chat_type: ChatType, content: str, client_msg_id: str): assert chat_type in (ChatType.USER, ChatType.ROOM) # 落库防重 if not delivery.begin(client_msg_id): return {"code": 0, "msg": "duplicate"} body = client.call("/msg/sendText", { "guid": guid, "toId": to_id, "content": content, # 部分环境支持 isNoNeedRead 等字段,以文档为准 }) delivery.success(client_msg_id, body) return body

3.2 图片 / 文件两段式

def send_image(client, guid, to_id, path: str, client_msg_id: str): # 1) 上传素材 —— method 名称以文档「素材模块」为准 with open(path, "rb") as f: # 若平台提供独立上传 URL,走 multipart;此处示意 up = client.call("/media/uploadImage", { "guid": guid, # 或先拿上传凭证再 PUT,按文档实现 "fileName": os.path.basename(path), }) image_id = up["data"]["imageId"] # 2) 发送 return client.call("/msg/sendImage", { "guid": guid, "toId": to_id, "imageId": image_id, }) def send_file(client, guid, to_id, path: str): up = client.call("/media/uploadFile", {"guid": guid, "fileName": os.path.basename(path)}) file_id = up["data"]["fileId"] return client.call("/msg/sendFile", { "guid": guid, "toId": to_id, "fileId": file_id, })

3.3 TypeScript Facade

export async function send(input: { guid: string; toId: string; chatType: "user" | "room"; kind: "text" | "image" | "file"; text?: string; filePath?: string; clientMsgId: string; }) { switch (input.kind) { case "text": return qiwe.call("/msg/sendText", { guid: input.guid, toId: input.toId, content: input.text, }); case "image": { const { imageId } = await uploadImage(input.guid, input.filePath!); return qiwe.call("/msg/sendImage", { guid: input.guid, toId: input.toId, imageId, }); } case "file": { const { fileId } = await uploadFile(input.guid, input.filePath!); return qiwe.call("/msg/sendFile", { guid: input.guid, toId: input.toId, fileId, }); } } }

3.4 编码与 Windows 计划任务陷阱

□ 全链路 UTF-8(请求 JSON、日志、模板文件) □ Windows 任务计划默认代码页可能导致「通道成功、手机乱码」 □ timeout 显式化;查询可重试,发送重试必须幂等键

四、生产环境避坑与安全风控

  1. 文本接口绝不传二进制;附件必须走素材 ID。

  2. imageId/fileId来自上传返回,禁止手写本地路径当 ID。

  3. 先打通 sendText,再联调附件,避免登录态问题与素材问题纠缠。

  4. 私聊与客户群都要验收,roomId 权限不足时文本通、文件不一定通。

  5. 敏感文件:合同/身份证上传前脱敏与鉴权。

  6. 接口字段以文首官方文档为准。


五、本篇交付清单

  • ChatType 显式化文本发送

  • 图片/文件两段式

  • Facade 统一出口

  • 编码与幂等注意点

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 12:11:41

基于SpringBoot与Hadoop的健康饮食推荐系统实战

1. 项目概述与核心价值拆解 1.1 这个项目到底解决什么问题 做毕设选题目,最怕的不是题目难,而是题目又老又空。如果去知网翻一翻近三年的本科毕业论文,会发现“基于XX的XX管理系统”这一类的选题占了大半壁江山,导师看了都审美疲…

作者头像 李华
网站建设 2026/9/30 12:11:17

《烟烬见中华》文化书装帧设计复盘:软封硬壳与文本内核的融合

做文化类文创书这些年,我见过太多“标题很美但内里撑不起来”的项目,拿到《烟烬见中华》这套选题的时候,第一反应是它的题眼藏得够深——烟、烬、中华三个词叠在一起,既有消逝的怅惘,又有重生的厚重。作者墨澜逸客配的…

作者头像 李华
网站建设 2026/9/30 12:11:01

2022-2026全球AI大模型进化全纪录

从2022年生成式AI爆发,到2026年多模态、智能体、超大规模模型全面落地,全球头部AI厂商完成数轮技术革新与产品迭代。 本文全网最全、时间最新、数据精准,整合OpenAI、Anthropic、Google、xAI、Meta及国内主流大厂大模型迭代历程,清…

作者头像 李华
网站建设 2026/9/30 12:08:34

IPD落地推不动?产品线模式才是组织底座与投资决策关键

最近连续被好几家正在推进IPD的企业问到同一个问题:流程文件、评审模板、项目立项标准全都搭起来了,管理层也很重视,可产品开发项目还是推不动,跨部门沟通依旧靠刷脸,该打的仗打不赢。聊到后面,基本都会落在…

作者头像 李华
网站建设 2026/9/30 12:08:33

DeepSeek私有化部署实战:从硬件选型到企业应用落地

简介:这份《程序员实战宝典:DeepSeek中小型企业私有化部署及跨行业业务应用详解》PDF文档,面向中小企业技术负责人、运维工程师及AI应用开发者。文档围绕DeepSeek模型的企业级落地路径,系统梳理了从需求评估、硬件与软件环境准备&…

作者头像 李华
网站建设 2026/9/30 12:08:29

从零搭建AI工程体系:数据、训练、服务与监控全链路实战指南

1. 从零搭建AI工程体系,为什么我劝你别急着调包 "ai-engineering-from-scratch"这个标题,第一次看到的时候我愣了一下。不是因为陌生,恰恰相反——过去两年里,我见过太多人问同一个问题:想入门AI工程&#x…

作者头像 李华