diff --git a/backend/mci-channel-wecom/pom.xml b/backend/mci-channel-wecom/pom.xml
index ccbcffe..0fcd6c0 100644
--- a/backend/mci-channel-wecom/pom.xml
+++ b/backend/mci-channel-wecom/pom.xml
@@ -23,6 +23,10 @@
org.springframework
spring-context
+
+ org.springframework
+ spring-web
+
org.springframework.boot
spring-boot-autoconfigure
diff --git a/backend/mci-channel-wecom/src/main/java/com/sino/mci/channel/wecom/WeComBotSender.java b/backend/mci-channel-wecom/src/main/java/com/sino/mci/channel/wecom/WeComBotSender.java
new file mode 100644
index 0000000..2005011
--- /dev/null
+++ b/backend/mci-channel-wecom/src/main/java/com/sino/mci/channel/wecom/WeComBotSender.java
@@ -0,0 +1,85 @@
+package com.sino.mci.channel.wecom;
+
+import com.sino.mci.channel.common.dto.SendMessageRequest;
+import com.sino.mci.channel.common.dto.SendMessageResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class WeComBotSender {
+
+ private static final String DEFAULT_WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s";
+
+ private final RestTemplate restTemplate = new RestTemplate();
+
+ public SendMessageResult send(SendMessageRequest request) {
+ SendMessageResult result = new SendMessageResult();
+ String key = getString(request.getExtra(), "account_id");
+ if (key == null || key.isBlank()) {
+ result.setSuccess(false);
+ result.setMessage("企微群机器人缺少 webhook key");
+ return result;
+ }
+
+ String contentType = request.getContentType() == null ? "text" : request.getContentType().toLowerCase();
+ Map body = buildBody(contentType, request.getContent());
+ if (body == null) {
+ result.setSuccess(false);
+ result.setMessage("不支持的消息类型: " + contentType);
+ return result;
+ }
+
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ HttpEntity