Skip to content
POST{BASE_URL}/wx-api/api/message/sendImage
写操作实测 2026-09-06消息JSON · Bearer App Token · body appid

发送图片消息

发送图片。

先调 上传图片到 CDN 拿到媒体凭证,再填入 content

说明与注意

  • 响应为完整消息对象(contentType:14 = 图片),与 sendText 结构相同;content 即 uploadImage data 原样回显。

请求参数

参数必填类型说明
appidstring实例 appid,标识操作哪个已登录账号。示例:we_xxxxxxxxxxxxxxx
conversationIdint64会话 id:单聊传对方 userId,群聊传 roomId,给自己发传当前账号 uin;必须是 JSON number。示例:7881301709020163
contentobject媒体凭证,字段来自 CDN 上传返回,子字段见下。示例:{"id":"<uploadImage 返回 id>","size":10528,"width":284,"hei…
content 字段
字段类型说明
content.idstring记录/文件业务标识
content.sizeint64文件字节数
content.widthint64宽(像素)
content.heightint64高(像素)
content.aesKeystringAES 下载解密密钥;CDN 存的是加密字节,下载后用它解密
content.md5string文件内容 MD5,收发方一致性校验
content.midImageFileSizeint64中图字节数
content.thumbFileSizeint64缩略图字节数
content.thumbWidthint64缩略图宽
content.thumbHeightint64缩略图高
content.thumbMd5string缩略图 MD5

请求示例

http
POST {BASE_URL}/wx-api/api/message/sendImage
Authorization: Bearer <你的 App Token>
Content-Type: application/json

{
  "appid": "we_xxxxxxxxxxxxxxx",
  "conversationId": 7881301709020163,
  "content": {
    "id": "<uploadImage 返回 id>",
    "size": 10528,
    "width": 284,
    "height": 177,
    "aesKey": "ef9c3132a4790b0b6c711198e355823e",
    "md5": "065954fddfa288194a56407d279b4aac",
    "midImageFileSize": 11338,
    "thumbFileSize": 11338,
    "thumbWidth": 240,
    "thumbHeight": 149,
    "thumbMd5": "16a7677492f36683af5c3eef54d939bd"
  }
}
bash
curl -X POST '{BASE_URL}/wx-api/api/message/sendImage' \
  -H 'Authorization: Bearer <你的 App Token>' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "appid": "we_xxxxxxxxxxxxxxx",
  "conversationId": 7881301709020163,
  "content": {
    "id": "<uploadImage 返回 id>",
    "size": 10528,
    "width": 284,
    "height": 177,
    "aesKey": "ef9c3132a4790b0b6c711198e355823e",
    "md5": "065954fddfa288194a56407d279b4aac",
    "midImageFileSize": 11338,
    "thumbFileSize": 11338,
    "thumbWidth": 240,
    "thumbHeight": 149,
    "thumbMd5": "16a7677492f36683af5c3eef54d939bd"
  }
}'
python
import requests

url = "{BASE_URL}/wx-api/api/message/sendImage"
headers = {"Authorization": "Bearer <你的 App Token>", "Content-Type": "application/json"}
body = """{
  "appid": "we_xxxxxxxxxxxxxxx",
  "conversationId": 7881301709020163,
  "content": {
    "id": "<uploadImage 返回 id>",
    "size": 10528,
    "width": 284,
    "height": 177,
    "aesKey": "ef9c3132a4790b0b6c711198e355823e",
    "md5": "065954fddfa288194a56407d279b4aac",
    "midImageFileSize": 11338,
    "thumbFileSize": 11338,
    "thumbWidth": 240,
    "thumbHeight": 149,
    "thumbMd5": "16a7677492f36683af5c3eef54d939bd"
  }
}"""

resp = requests.post(url, headers=headers, data=body.encode("utf-8"))
print(resp.text)
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

String url = "{BASE_URL}/wx-api/api/message/sendImage";
String body = "{\n" +
    "  \"appid\": \"we_xxxxxxxxxxxxxxx\",\n" +
    "  \"conversationId\": 7881301709020163,\n" +
    "  \"content\": {\n" +
    "    \"id\": \"<uploadImage 返回 id>\",\n" +
    "    \"size\": 10528,\n" +
    "    \"width\": 284,\n" +
    "    \"height\": 177,\n" +
    "    \"aesKey\": \"ef9c3132a4790b0b6c711198e355823e\",\n" +
    "    \"md5\": \"065954fddfa288194a56407d279b4aac\",\n" +
    "    \"midImageFileSize\": 11338,\n" +
    "    \"thumbFileSize\": 11338,\n" +
    "    \"thumbWidth\": 240,\n" +
    "    \"thumbHeight\": 149,\n" +
    "    \"thumbMd5\": \"16a7677492f36683af5c3eef54d939bd\"\n" +
    "  }\n" +
    "}";

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
    .header("Authorization", "Bearer <你的 App Token>")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
php
<?php

$url = '{BASE_URL}/wx-api/api/message/sendImage';
$body = <<<'JSON'
{
  "appid": "we_xxxxxxxxxxxxxxx",
  "conversationId": 7881301709020163,
  "content": {
    "id": "<uploadImage 返回 id>",
    "size": 10528,
    "width": 284,
    "height": 177,
    "aesKey": "ef9c3132a4790b0b6c711198e355823e",
    "md5": "065954fddfa288194a56407d279b4aac",
    "midImageFileSize": 11338,
    "thumbFileSize": 11338,
    "thumbWidth": 240,
    "thumbHeight": 149,
    "thumbMd5": "16a7677492f36683af5c3eef54d939bd"
  }
}
JSON;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer <你的 App Token>',
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

响应示例

json
{
  "code": 0,
  "data": {
    "id": 1145149,
    "syncKey": 12470069,
    "messageType": 0,
    "fromUserId": 1688855440457534,
    "toUserId": 1688855655434798,
    "roomId": 0,
    "contentType": 14,
    "sendTime": 1788666063,
    "appInfo": "CAQQz8Hz…",
    "senderName": "陈**",
    "content": {
      "id": "3068…0400",
      "size": 3788,
      "width": 200,
      "height": 120,
      "aesKey": "a80e52a7191df0a1c2aac34076898df4",
      "md5": "2228e4e55326a9e5c5478b40a22499d0",
      "midImageFileSize": 3562,
      "thumbFileSize": 3562,
      "thumbWidth": 200,
      "thumbHeight": 120,
      "thumbMd5": "9736a9f86ba94311a28e1b4ed7115a5a"
    },
    "extraData": "…",
    "flag": 16777216,
    "devInfo": 0,
    "summary": ""
  },
  "detail": "",
  "message": "ok",
  "time": "2026-09-06 11:41:03"
}

响应字段

响应字段(31 项)
字段类型说明
codeint64统一封套状态码:0=成功,负数=失败
dataobject成功时是一条完整消息,结构与发送文本消息相同;data.content 回显上传图片返回的字段
data.idint64消息服务端 id,撤回时作为 serverMsgId
data.syncKeyint64同步游标;增量拉取的断点
data.messageTypeint64会话类型:0 好友(单聊)、1 群聊、3 系统通知,与 Webhook 报文外层的 messageType 同一取值,见会话类型
data.fromUserIdint64发送方 id(uin);群消息里是真实发送成员
data.toUserIdint64接收方 id(uin),通常是本账号
data.roomIdint64群会话 id;非群消息为 0
data.contentTypeint64消息类型码(0 文本/14 图片/23 视频…)
data.sendTimeint64发送时间(Unix 秒)
data.appInfostring企微内部透传串(base64);群发/待发送场景需回填,业务方不必解析
data.senderNamestring发送者昵称(可能为空)
data.contentobject原样回显上传图片返回的媒体凭证
data.content.idstring记录/文件业务标识
data.content.sizeint64文件字节数
data.content.widthint64宽(像素)
data.content.heightint64高(像素)
data.content.aesKeystringAES 下载解密密钥;CDN 存的是加密字节,下载后用它解密
data.content.md5string文件内容 MD5,收发方一致性校验
data.content.midImageFileSizeint64中图字节数
data.content.thumbFileSizeint64缩略图字节数
data.content.thumbWidthint64缩略图宽
data.content.thumbHeightint64缩略图高
data.content.thumbMd5string缩略图 MD5
data.extraDatastring企微内部透传(新协议为 base64 字符串;老协议曾为字符串数组);业务方不解析
data.flag / data.devInfo / data.summaryint64 / string消息标志位 / 设备信息 / 摘要;观测到 flag 取 0 或 16777216,summary 常为空。精确含义待确认
detailstring附加明细,通常为空
messagestring文案:成功为 ok;失败形如 -码|描述
timestring服务端处理时间 YYYY-MM-DD HH:MM:SS

常见错误

下表为企微错误码。业务失败时顶层 code=-1,具体错误码在 message| 前,例如 -3004|参数错误;鉴权与网关错误见错误码

错误码含义怎么办
-4014过期或错误的 uinconversationIdpersonal/getInfo 取当前 uin
-3020用自聊伪房间 roomId 作发送目标给自己发用当前账号 uin
-3004参数错误检查字段名与类型,数字 id 不能传字符串

下一步