This commit is contained in:
zwt13703 2026-04-27 19:55:31 +08:00
parent 150bd1d825
commit 4ea3dabaf5
3 changed files with 36 additions and 3 deletions

View File

@ -7,6 +7,7 @@ from app.services.message_service import (
get_messages, get_messages,
send_and_save, send_and_save,
save_messages, save_messages,
WECHAT_ERROR_MAP,
) )
from app.services.wechat_client import sync_msg, list_accounts from app.services.wechat_client import sync_msg, list_accounts
from app.config import settings from app.config import settings
@ -57,7 +58,11 @@ async def send_message(
): ):
"""发送消息""" """发送消息"""
result = await send_and_save(db, req.external_userid, req.content, req.open_kfid) result = await send_and_save(db, req.external_userid, req.content, req.open_kfid)
return result errcode = result.get("errcode", -1)
return {
**result,
"errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")),
}
@router.post("/sync") @router.post("/sync")
@ -72,10 +77,12 @@ async def sync_messages(
saved = 0 saved = 0
if msg_list: if msg_list:
saved = await save_messages(db, msg_list) saved = await save_messages(db, msg_list)
errcode = result.get("errcode", -1)
return { return {
**result, **result,
"saved": saved, "saved": saved,
"total": len(msg_list), "total": len(msg_list),
"errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")),
} }

View File

@ -134,6 +134,32 @@ async def send_and_save(db: AsyncSession, external_userid: str, content: str,
return result return result
# 微信客服 API 常见错误码 → 中文说明
WECHAT_ERROR_MAP = {
95000: "客服账号 ID (open_kfid) 无效",
95001: "发送消息数量超限客户未回复时12 小时内最多主动发送 5 条消息",
95002: "客户会话已结束,无法发送消息",
95003: "客户不在当前客服账号的接待范围内",
95004: "接待人员未实名,无法发送消息",
95005: "接待人员未在企业微信客户端在线,无法发送消息",
48001: "API 接口无权限,请检查 Secret 对应的应用权限",
40001: "access_token 无效或已过期",
41001: "缺少 access_token 参数",
42001: "access_token 过期",
40003: "不合法的 OpenID",
40014: "不合法的 access_token",
45009: "API 调用频率超限",
}
def _wechat_errmsg(result: dict) -> str:
"""将微信 API 错误码转为中文说明"""
code = result.get("errcode", 0)
if code == 0:
return "ok"
return WECHAT_ERROR_MAP.get(code, result.get("errmsg", f"未知错误(errcode={code})"))
def _normalize_origin(origin) -> str: def _normalize_origin(origin) -> str:
"""将微信 API 返回的 origin 整数转为字符串""" """将微信 API 返回的 origin 整数转为字符串"""
if isinstance(origin, int): if isinstance(origin, int):

View File

@ -150,7 +150,7 @@ async function sendMessage() {
showToast("发送成功"); showToast("发送成功");
await loadMessages(currentUser); await loadMessages(currentUser);
} else { } else {
showToast("发送失败: " + (result.errmsg || JSON.stringify(result)), "error"); showToast("发送失败: " + (result.errmsg_cn || result.errmsg || JSON.stringify(result)), "error");
} }
} catch (e) { } catch (e) {
showToast("发送失败: " + e.message, "error"); showToast("发送失败: " + e.message, "error");
@ -176,7 +176,7 @@ async function syncMessages() {
await loadConversations(); await loadConversations();
if (currentUser) await loadMessages(currentUser); if (currentUser) await loadMessages(currentUser);
} else { } else {
showToast("同步失败: " + (data.errmsg || JSON.stringify(data)), "error"); showToast("同步失败: " + (data.errmsg_cn || data.errmsg || JSON.stringify(data)), "error");
} }
} catch (e) { } catch (e) {
showToast("同步失败: " + e.message, "error"); showToast("同步失败: " + e.message, "error");