吴树波 1 hari lalu
induk
melakukan
93b9273b9d

+ 23 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgRequest.java

@@ -0,0 +1,23 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 撤回消息请求参数(RevokeMsgNew 接口)
+ */
+@Data
+public class RevokeMsgRequest {
+
+    /**
+     * 要撤回的消息 ID(发送消息时返回的 msgId 或 newMsgId)
+     */
+    @JSONField(name = "msgId")
+    private Long msgId;
+
+    /**
+     * 接收方 wxid(单聊)或群 id(群聊)
+     */
+    @JSONField(name = "toUserName")
+    private String toUserName;
+}

+ 25 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgResult.java

@@ -0,0 +1,25 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.wxcid.dto.common.BaseResponse;
+import lombok.Data;
+
+/**
+ * 撤回消息接口(RevokeMsgNew)返回的 Data 结构
+ */
+@Data
+public class RevokeMsgResult {
+
+    @JSONField(name = "baseResponse")
+    private BaseResponse baseResponse;
+
+    @JSONField(name = "sysWording")
+    private String sysWording;
+
+    /**
+     * 是否撤回成功(根据 baseResponse.ret == 0 判断)
+     */
+    public boolean isSuccess() {
+        return baseResponse != null && baseResponse.getRet() == 0;
+    }
+}

+ 40 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageMessageResult.java

@@ -0,0 +1,40 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 发送图片消息的单条结果(SendImageNewMessage 接口 Data 数组中的每个元素)
+ */
+@Data
+public class SendImageMessageResult {
+
+    /**
+     * 图片 ID
+     */
+    @JSONField(name = "imageId")
+    private String imageId;
+
+    /**
+     * 微信底层返回的详细响应信息
+     */
+    @JSONField(name = "resp")
+    private SendImageResponse resp;
+
+    /**
+     * 接收方的微信 ID(如 wxid_xxx)
+     * 注意:接口返回字段名为 toUSerName(拼写错误)
+     */
+    @JSONField(name = "toUSerName")
+    private String toUserName;
+
+    /**
+     * 是否发送成功(根据 resp.baseResponse.ret == 0 判断)
+     */
+    public boolean isSendSuccess() {
+        if (resp == null || resp.getBaseResponse() == null) {
+            return false;
+        }
+        return resp.getBaseResponse().getRet() == 0;
+    }
+}

+ 46 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageResponse.java

@@ -0,0 +1,46 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.wxcid.dto.common.BaseResponse;
+import com.fs.wxcid.dto.common.StringWrapper;
+import lombok.Data;
+
+/**
+ * 发送图片消息时 resp 字段的响应结构(SendImageNewMessage 接口返回)
+ */
+@Data
+public class SendImageResponse {
+
+    @JSONField(name = "baseResponse")
+    private BaseResponse baseResponse;
+
+    @JSONField(name = "msgId")
+    private Long msgId;
+
+    @JSONField(name = "clientImgId")
+    private StringWrapper clientImgId;
+
+    @JSONField(name = "fromUserName")
+    private StringWrapper fromUserName;
+
+    @JSONField(name = "toUserName")
+    private StringWrapper toUserName;
+
+    @JSONField(name = "totalLen")
+    private Long totalLen;
+
+    @JSONField(name = "startPos")
+    private Long startPos;
+
+    @JSONField(name = "dataLen")
+    private Long dataLen;
+
+    @JSONField(name = "createTime")
+    private Long createTime;
+
+    @JSONField(name = "newMsgId")
+    private Long newMsgId;
+
+    @JSONField(name = "msgSource")
+    private String msgSource;
+}

+ 3 - 3
fs-service/src/main/java/com/fs/wxcid/service/MessageService.java

@@ -1,13 +1,13 @@
 package com.fs.wxcid.service;
 
 
-import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.message.*;
 
 import java.util.List;
 
 public interface MessageService {
-    ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId, String txt);
-    ApiResponseCommon<List<SendMessageResult>> sendImageMessage(Long accountId, String imgUrl);
+    List<SendMessageResult> sendTextMessage(Long accountId, String txt);
+    List<SendImageMessageResult> sendImageMessage(Long accountId, String imgUrl, String toUser);
+    RevokeMsgResult revokeMessage(Long accountId, Long msgId, String toUserName);
 
 }

+ 30 - 10
fs-service/src/main/java/com/fs/wxcid/service/impl/MessageServiceImpl.java

@@ -7,6 +7,9 @@ import com.fs.wxcid.ServiceUtils;
 import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.login.RequestBaseVo;
 import com.fs.wxcid.dto.message.MsgItem;
+import com.fs.wxcid.dto.message.RevokeMsgRequest;
+import com.fs.wxcid.dto.message.RevokeMsgResult;
+import com.fs.wxcid.dto.message.SendImageMessageResult;
 import com.fs.wxcid.dto.message.SendMessageResult;
 import com.fs.wxcid.dto.message.SendTextMessageRequest;
 import com.fs.wxcid.service.MessageService;
@@ -24,7 +27,7 @@ public class MessageServiceImpl implements MessageService {
     private ServiceUtils serviceUtils;
 
     @Override
-    public ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId, String txt) {
+    public List<SendMessageResult> sendTextMessage(Long accountId, String txt) {
         SendTextMessageRequest request = new SendTextMessageRequest();
         List<MsgItem> list = new ArrayList<>();
         MsgItem msgItem = new MsgItem();
@@ -43,34 +46,51 @@ public class MessageServiceImpl implements MessageService {
             String errorMsg = "部分消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
             throw new CustomException("发送文本消息部分失败: " + errorMsg);
         }
-        return response;
+        return response.getData();
     }
 
     @Override
-    public ApiResponseCommon<List<SendMessageResult>> sendImageMessage(Long accountId, String imgUrl) {
+    public List<SendImageMessageResult> sendImageMessage(Long accountId, String imgUrl, String toUser) {
         SendTextMessageRequest request = new SendTextMessageRequest();
         List<MsgItem> list = new ArrayList<>();
         MsgItem msgItem = new MsgItem();
         try {
+            msgItem.setMsgType(0);
             msgItem.setImageContent(ImageToBase64Util.convertImageUrlToBase64(imgUrl));
+            msgItem.setToUserName(toUser);
         }catch (Exception e){
             log.error("发送消息时,图片转换base64错误", e);
             throw new CustomException("图片消息发送失败");
         }
+        list.add(msgItem);
         request.setMsgItem(list);
-        ApiResponseCommon<List<SendMessageResult>> response = serviceUtils.sendPost(BASE_URL + "SendImageNewMessage", RequestBaseVo.builder().accountId(accountId).data(request).build(), new TypeReference<ApiResponseCommon<List<SendMessageResult>>>() {});
-        // 第二层:检查每条消息是否真正发送成功
-        List<SendMessageResult> results = response.getData();
+        ApiResponseCommon<List<SendImageMessageResult>> response = serviceUtils.sendPost(BASE_URL + "SendImageNewMessage", RequestBaseVo.builder().accountId(accountId).data(request).build(), new TypeReference<ApiResponseCommon<List<SendImageMessageResult>>>() {});
+        // 第二层:检查每条消息是否真正发送成功(根据 resp.baseResponse.ret == 0 判断)
+        List<SendImageMessageResult> results = response.getData();
         List<String> failedRecipients = new ArrayList<>();
-        for (SendMessageResult result : results) {
+        for (SendImageMessageResult result : results) {
             if (!result.isSendSuccess()) {
                 failedRecipients.add(result.getToUserName());
             }
         }
         if (!failedRecipients.isEmpty()) {
-            String errorMsg = "部分消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
-            throw new CustomException("发送文本消息部分失败: " + errorMsg);
+            String errorMsg = "部分图片消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
+            throw new CustomException("发送图片消息部分失败: " + errorMsg);
+        }
+        return response.getData();
+    }
+
+    @Override
+    public RevokeMsgResult revokeMessage(Long accountId, Long msgId, String toUserName) {
+        RevokeMsgRequest request = new RevokeMsgRequest();
+        request.setMsgId(msgId);
+        request.setToUserName(toUserName);
+        ApiResponseCommon<RevokeMsgResult> response = serviceUtils.sendPost(BASE_URL + "RevokeMsgNew", RequestBaseVo.builder().accountId(accountId).data(request).build(), new TypeReference<ApiResponseCommon<RevokeMsgResult>>() {});
+        RevokeMsgResult result = response.getData();
+        if (result != null && !result.isSuccess()) {
+            String errorMsg = result.getSysWording() != null ? result.getSysWording() : "消息撤回失败";
+            throw new CustomException(errorMsg);
         }
-        return response;
+        return response.getData();
     }
 }

+ 8 - 0
fs-wx-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -5,6 +5,7 @@ import com.fs.app.service.WxTaskService;
 import com.fs.common.core.domain.R;
 import com.fs.company.service.ICompanyWxAccountService;
 import com.fs.company.service.impl.CompanyWxServiceImpl;
+import com.fs.wxcid.service.MessageService;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -70,11 +71,18 @@ public class CommonController {
 
     @Autowired
     CompanyWxServiceImpl ccompanyWxService;
+    @Autowired
+    MessageService messageService;
 
     @GetMapping("mockAddWxSuccess/{clientId}")
     public void mockAddWxSuccess(@PathVariable("clientId") Long clientId) {
         ccompanyWxService.mockInterface(clientId);
     }
 
+    @GetMapping("sendImg")
+    public void mockAddWxSuccess(Long accountId, String imgUrl, String toUser) {
+        messageService.sendImageMessage(accountId, imgUrl, toUser);
+    }
+
 
 }