美洽API发送消息怎么操作?
要通过美洽 API 发送消息,先在美洽控制台创建应用并获取 app_key/app_secret(或 Access Token);在后端用密钥换取短时 token 或生成请求签名,建立或获取会话(visitor/ conversation),必要时先上传附件获取 file_id,然后向消息发送接口 POST 消息体,包含会话 ID、消息类型与内容,设置必要请求头(Authorization / MQ-App-Key / Content-Type)。实时交互可以用 WebSocket/长连接,异步回调通过 webhook 接收消息状态和访客回复。下面把每一步拆开讲清楚,给出示例、常见错误与调试技巧,手把手带你能立刻跑通。

先弄清楚:整个流程是什么样的?
简单来说,发送消息的流程可以拆成四步:
- 准备凭证(在控制台拿到 API key/secret 或生成 Access Token);
- 建立会话(visitor 或会话 ID,要把消息发到哪个会话里);
- 上传附件(可选),先把图片/文件上传得到 file_id;
- 发送消息请求,向消息接口 POST 内容并带上必要头部;
实时场景你可能会用 WebSocket 保持双向连接,或者用长轮询。无论哪种方式,后台要能验证签名并处理回调。
准备工作:注册、应用与凭证
1)注册并创建应用
在美洽控制台注册企业账号,进入开发者或应用管理板块,新建「应用/接入」以获取身份凭证。不同接入方式(SDK、开放 API)可能给出不同的密钥或 token。
2)获取 API Key / Secret 或 Access Token
- 常见会有 app_key(或 client_id)和 app_secret(或 client_secret)。
- 有的场景直接给一个长期 Access Token;有的场景需要用 app_key+secret 换短期 token(例如通过 OAuth 或签名接口)。
- 务必把 Secret 保存在服务端,不要放到前端或移动端曝光。
3)环境与权限
确认该应用对发送消息、上传文件和读取会话等接口有权限;如果要主动发起(企业主动推送),还需开通相应权限或使用白名单模板。
如何建立会话(Conversation / Visitor)
美洽的消息是发到会话里的,所以先要创建或获取会话 ID。常见思路:
- 访客发起:客户端 SDK(Web/小程序/APP)自动在美洽侧创建访客与会话;
- 在服务端创建:通过 API 创建一个 visitor 记录并得到 visitor_id / conversation_id;
- 使用已有会话:如果用户已存在会话,直接使用该会话的 ID 来发送消息。
示例(伪代码思路):先调用创建会话接口,返回 { conversation_id: “xxx” },后续消息都带上这个 ID。
发送消息:REST 调用的标准步骤
发送消息的核心是一个 POST 请求,带上会话 ID、消息类型和内容。注意 header、content-type 和鉴权字段。
常见请求头(示例)
- Authorization: Bearer {access_token} (或自家平台的 MQ-App-Key / MQ-Sign)
- Content-Type: application/json 或 multipart/form-data(如果上传文件)
- 其他:X-Request-Id 用于幂等、时间戳或签名字段视具体实现而定。
消息体常见字段(示例格式)
| 字段 | 含义 |
| conversation_id | 会话 ID,消息将被发送到该会话 |
| sender | 发送者类型(visitor / agent / system) |
| type | 消息类型(text, image, file, card, quick_reply 等) |
| content | 消息内容(文本或结构化 JSON,取决于 type) |
| file_id | 若为文件类消息,通过上传接口返回的 file_id |
| client_msg_id | 可选:客户端消息 ID,用于幂等和排重 |
示例:发送文本消息(伪 curl)
(注意:下面的 URL、header 名称和字段名以你控制台文档为准;示例用占位符)
curl -X POST "https://api.meiqia.com/v{版本}/messages" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"conversation_id": "CONV_123456",
"type": "text",
"content": "您好,我是客服,有什么可以帮忙?",
"client_msg_id": "msg_10001"
}'
上传附件(图片/文件)
如果要发送图片或文件,通常需要先上传文件到美洽文件存储,接口会返回一个 file_id,然后在发送消息时引用该 file_id。
上传方式
- 通过单独的文件上传接口(multipart/form-data),或
- 有的平台支持在发送消息时直接以 multipart 附带文件(注意字段名)。
上传示例(伪 curl)
curl -X POST "https://api.meiqia.com/v{版本}/files" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-F "file=@/path/to/pic.jpg" \
-F "purpose=message"
返回示例包含 file_id,拿到后在消息体里写 file_id 即可。
实时交互:WebSocket / 长连接
如果你需要双向、低延迟的实时消息,使用 WebSocket(或长连接)会更合适。流程通常是:
- 服务端或客户端先向认证接口申请临时 token 或签名;
- 使用 token 建立 WebSocket 连接;
- 连接建立后,按协议发送登录/绑定会话的事件;
- 随后就可以收发消息,平台会推送访客的消息、状态变更等事件。
注意心跳、重连策略和消息确认(ack)机制。
回调(Webhook):如何接收访客回复和状态更新
美洽会把访客的新消息、消息状态变更(已读、失败)等通过 webhook 推送给你。配置回调地址时需要:
- 保证回调地址可被公网访问;
- 验证签名或时间戳以防伪造(文档一般说明如何校验)
- 返回正确的 HTTP 状态码(通常 200 表示收到并处理成功)
常见错误码与排查思路
| 错误码/HTTP | 可能原因 |
| 400 | 参数缺失或格式错误(检查 JSON、必填字段) |
| 401 | 鉴权失败(Token 过期、Secret 不正确) |
| 403 | 无权访问(权限未开通或资源受限) |
| 404 | 接口路径或会话 ID 不存在 |
| 429 | 调用频率超限(需要限流与退避重试) |
| 5xx | 服务端错误(重试并上报) |
排查步骤
- 先看返回的 body,通常含错误码和错误信息;
- 确认使用的 token 是否仍然有效;
- 用 Postman 或 curl 复现请求,逐步缩小问题;
- 检查会话 ID、file_id 是否准确;
- 查看 webhook 是否配置并能收到事件(如果期待异步回调)。
示例代码(简洁版)
Node.js(使用 fetch / node-fetch)
const fetch = require('node-fetch');
async function sendText(conversationId, text, accessToken) {
const url = 'https://api.meiqia.com/v{版本}/messages'; // 替换为控制台文档提供的 URL
const body = {
conversation_id: conversationId,
type: 'text',
content: text,
client_msg_id: 'c_' + Date.now()
};
const res = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
});
return res.json();
}
Python(requests)
import requests
import time
def send_text(conversation_id, text, access_token):
url = 'https://api.meiqia.com/v{版本}/messages'
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
payload = {
"conversation_id": conversation_id,
"type": "text",
"content": text,
"client_msg_id": f"c_{int(time.time()*1000)}"
}
r = requests.post(url, json=payload, headers=headers, timeout=10)
return r.json()
实用技巧与最佳实践
- 短期 token:优先在服务端用 app_secret 换短期 token,避免 long-lived secret 泄露。
- 幂等设计:发消息时带 client_msg_id,遇到网络超时可以安全重试。
- 重连策略:WebSocket 建议指数退避 + 上限重试次数。
- 日志与审计:记录请求 ID、返回值、时间戳,便于排查问题。
- 限流:对外部发送频率做衰减控制,遇到 429 做退避重试。
- 异步处理:上传大文件或复杂消息建议先异步化,不阻塞主线程。
一些容易踩的坑(别慌,都是常见)
- 把 app_secret 写在前端(会被盗用)——密钥一定放后端;
- 上传文件后直接用本地路径而不是 file_id;
- 不处理 webhook 的重试机制,重复事件导致重复消息;
- 错把访客 ID 当作会话 ID 发请求;
- 时间戳签名未考虑时区或服务器时间不同步,导致鉴权失败。
调试小贴士
想快点排通路子,可以按这个顺序来:
- 用 Postman 或 curl 先拿到一个可用的 Access Token;
- 调用「创建会话」接口,确认能拿到 conversation_id;
- 尝试发送一条简单文本消息,看返回是否成功;
- 如果要发图片,先单独上传文件确认能拿到 file_id,再发消息;
- 检查 webhook 是否能收到推送,验证签名逻辑是否正确;
常见场景举例(帮助你快速上手)
场景 A:网站客服主动推送订单通知
- 后端检测到订单状态变化 → 生成模板消息 → 使用服务端 token 调用发送接口。
- 如果用户未在会话中,可以先创建会话或通过模板推送(需平台支持)。
场景 B:机器人回复并转人工
- 机器人通过 API 发送结构化消息(富文本/卡片)并在按钮中带上「转人工」事件;
- 用户点击后,触发会话分配给人工座席(通过 API 调用分配接口)。
最后,关于安全与合规
发送消息时要注意隐私与合规,敏感信息要脱敏或加密存储,确认消息模版的内容符合平台规范。并发量大时要做好限流与容错,避免因为大批量推送影响用户体验或触发风控。
好,就写到这里 —— 如果你现在想要一个最小可运行的 demo,我建议先拿到控制台的示例 URL 与 token,照着上面的 Node/Python 示例把请求替换成控制台给出的具体路径和值,几分钟内就可以跑通。顺手把日志、重试和错误上报加上,遇到具体错误再详细调试(通常都是 token、会话 ID 或 file_id 的问题)。