Go 进阶:发送文件/图片消息的流程与实现

发送非文本类消息,如图片 (msgtype: image) 或文件 (msgtype: file),不能直接将文件数据包含在 POST 请求体中。企业微信要求开发者首先将素材上传到服务器,获取一个临时的唯一标识符:media_id ,然后再将此 media_id 用于构建最终的消息体。

1. 两步走的核心流程

  1. 上传素材: 调用 /cgi-bin/media/upload 接口,将本地文件以 multipart/form-data 的形式上传到企业微信服务器。服务器返回一个临时的 media_id。

  2. 发送消息: 调用 /cgi-bin/appchat/send 接口,在请求体中用获取到的 media_id 替换掉原有的文本内容。

2. 第一步:Go 实现素材上传

素材上传需要使用 multipart/form-data 格式,这是 Go 语言中一个相对复杂的网络操作,需要用到 mime/multipart 包。

2.1 上传 API 接口
  • 请求方式: POST

  • 请求 URL: https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

    • TYPE:素材类型,如 image、file、voice 等。
2.2 Go 上传实现思路
  1. 创建 Pipeline: 使用 bytes.Buffer 配合 mime/multipart.Writer 来构造 multipart/form-data 的请求体。

  2. 写入文件字段:

    • 使用 writer.CreateFormFile(fieldname, filename) 创建一个文件字段,并返回一个 io.Writer。

    • 将本地文件的内容通过 io.Copy() 写入到这个 io.Writer 中。

  3. 设置 Content-Type: 关键在于,HTTP 请求头中的 Content-Type 必须设置为 multipart/form-data,并且其边界(Boundary)值必须与 multipart.Writer 自动生成的边界值保持一致。

  4. 执行 POST 请求: 发送包含文件内容的 HTTP POST 请求。

  5. 解析响应: 接收响应 JSON,解析到对应的 Struct 中,获取 media_id。

2.3 核心返回 Struct
Go 复制代码
type UploadResponse struct {
    ErrCode int    `json:"errcode"`
    ErrMsg  string `json:"errmsg"`
    Type    string `json:"type"`
    MediaID string `json:"media_id"` // 核心字段
}

3. 第二步:Go 实现消息发送

获取 media_id 后,发送消息就回归到 帖子 17 中的 JSON 构造和 POST 流程。

3.1 消息 Struct 定义

只需要将 msgtype 设置为 image 或 file,并替换内容字段。

Go 复制代码
// 以图片消息为例
type ImageContent struct {
    MediaID string `json:"media_id"` // 使用上传获取到的 ID
}

type SendImageMessageRequest struct {
    ChatID  string       `json:"chatid"`
    MsgType string       `json:"msgtype"` // "image"
    Image   ImageContent `json:"image"`
}
3.2 发送流程
  1. 实例化 SendImageMessageRequest,将上一步获得的 media_id 填入。

  2. 使用 json.Marshal 序列化为 JSON 字节流。

  3. 构造 POST 请求,发送到 /cgi-bin/appchat/send 接口。

4. 关键注意事项

  • 素材有效期: 上传的临时素材 media_id 仅在三天内有效,且只能被用于一次消息发送。因此,每次发送非文本消息前,几乎都需要执行一次上传操作。

  • 文件大小限制: 不同类型的素材有严格的大小限制(例如,图片最大 2\\text{MB},文件最大 20\\text{MB})。超限会导致上传失败。

  • 权限: 确保应用具有发送文件/图片消息的权限。


QiWe开放平台提供了后台直登功能,登录成功后获取相关参数,快速Apifox在线测试,所有登录功能都是基于QiWe平台API自定义开发。

相关推荐
andyweike3 小时前
php笔记
开发语言·笔记·php
EatFan4 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Circ.4 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
波力海苔夹心脆6755 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
现任明教教主~6 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
JavaGuide6 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel6 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
Zhou1411366 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅7 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http