Browse Source

个微SOP

吴树波 1 day ago
parent
commit
fffeaf49bb

+ 85 - 0
fs-service/src/main/java/com/fs/wxcid/ImageToBase64Util.java

@@ -0,0 +1,85 @@
+package com.fs.wxcid;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Base64;
+
+/**
+ * 网络图片转Base64工具类
+ */
+public class ImageToBase64Util {
+
+    /**
+     * 网络图片转Base64编码字符串
+     * @param imageUrl 图片的网络URL(如https://xxx.com/xxx.png)
+     * @return Base64编码字符串(不带data:image/xxx;base64,前缀)
+     * @throws Exception 异常(网络错误、图片读取失败等)
+     */
+    public static String convertImageUrlToBase64(String imageUrl) throws Exception {
+        // 1. 校验URL参数
+        if (imageUrl == null || imageUrl.trim().isEmpty()) {
+            throw new IllegalArgumentException("图片URL不能为空");
+        }
+
+        HttpURLConnection connection = null;
+        InputStream inputStream = null;
+        ByteArrayOutputStream outputStream = null;
+
+        try {
+            // 2. 打开URL连接
+            URL url = new URL(imageUrl);
+            connection = (HttpURLConnection) url.openConnection();
+            // 设置连接参数(防超时、防重定向问题)
+            connection.setRequestMethod("GET");
+            connection.setConnectTimeout(5000); // 连接超时5秒
+            connection.setReadTimeout(5000);    // 读取超时5秒
+            connection.setInstanceFollowRedirects(true); // 允许重定向
+
+            // 3. 校验响应码(200表示成功)
+            int responseCode = connection.getResponseCode();
+            if (responseCode != HttpURLConnection.HTTP_OK) {
+                throw new Exception("图片URL访问失败,响应码:" + responseCode);
+            }
+
+            // 4. 读取图片流到字节数组
+            inputStream = connection.getInputStream();
+            outputStream = new ByteArrayOutputStream();
+            byte[] buffer = new byte[1024]; // 缓冲区,每次读1KB
+            int len;
+            while ((len = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, len);
+            }
+
+            // 5. 将字节数组编码为Base64
+            byte[] imageBytes = outputStream.toByteArray();
+            return Base64.getEncoder().encodeToString(imageBytes);
+
+        } finally {
+            // 6. 关闭所有资源(避免内存泄漏)
+            if (outputStream != null) {
+                outputStream.close();
+            }
+            if (inputStream != null) {
+                inputStream.close();
+            }
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    // 测试示例
+    public static void main(String[] args) {
+        try {
+            // 替换为你的网络图片URL
+            String imageUrl = "https://czwh.obs.cn-southwest-2.myhuaweicloud.com/fs/20260225/1771999986358.png";
+            String base64Str = convertImageUrlToBase64(imageUrl);
+            System.out.println(base64Str);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println("转换失败:" + e.getMessage());
+        }
+    }
+}

+ 1 - 1
fs-service/src/main/java/com/fs/wxcid/dto/message/MsgItem.java

@@ -25,7 +25,7 @@ public class MsgItem {
      *  2 = 图片
      *  其他值请参考协议文档 */
     @JsonProperty("MsgType")
-    private Integer MsgType;
+    private Integer MsgType = 0;
 
     /** 文本消息内容 */
     @JsonProperty("TextContent")

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

@@ -7,6 +7,7 @@ import com.fs.wxcid.dto.message.*;
 import java.util.List;
 
 public interface MessageService {
-    ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId);
+    ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId, String txt);
+    ApiResponseCommon<List<SendMessageResult>> sendImageMessage(Long accountId, String imgUrl);
 
 }

+ 35 - 1
fs-service/src/main/java/com/fs/wxcid/service/impl/MessageServiceImpl.java

@@ -2,9 +2,11 @@ package com.fs.wxcid.service.impl;
 
 import com.alibaba.fastjson.TypeReference;
 import com.fs.common.exception.CustomException;
+import com.fs.wxcid.ImageToBase64Util;
 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.SendMessageResult;
 import com.fs.wxcid.dto.message.SendTextMessageRequest;
 import com.fs.wxcid.service.MessageService;
@@ -22,8 +24,12 @@ public class MessageServiceImpl implements MessageService {
     private ServiceUtils serviceUtils;
 
     @Override
-    public ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId) {
+    public ApiResponseCommon<List<SendMessageResult>> sendTextMessage(Long accountId, String txt) {
         SendTextMessageRequest request = new SendTextMessageRequest();
+        List<MsgItem> list = new ArrayList<>();
+        MsgItem msgItem = new MsgItem();
+        msgItem.setTextContent(txt);
+        request.setMsgItem(list);
         ApiResponseCommon<List<SendMessageResult>> response = serviceUtils.sendPost(BASE_URL + "SendTextMessage", RequestBaseVo.builder().accountId(accountId).data(request).build(), new TypeReference<ApiResponseCommon<List<SendMessageResult>>>() {});
         // 第二层:检查每条消息是否真正发送成功
         List<SendMessageResult> results = response.getData();
@@ -39,4 +45,32 @@ public class MessageServiceImpl implements MessageService {
         }
         return response;
     }
+
+    @Override
+    public ApiResponseCommon<List<SendMessageResult>> sendImageMessage(Long accountId, String imgUrl) {
+        SendTextMessageRequest request = new SendTextMessageRequest();
+        List<MsgItem> list = new ArrayList<>();
+        MsgItem msgItem = new MsgItem();
+        try {
+            msgItem.setImageContent(ImageToBase64Util.convertImageUrlToBase64(imgUrl));
+        }catch (Exception e){
+            log.error("发送消息时,图片转换base64错误", e);
+            throw new CustomException("图片消息发送失败");
+        }
+        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();
+        List<String> failedRecipients = new ArrayList<>();
+        for (SendMessageResult result : results) {
+            if (!result.isSendSuccess()) {
+                failedRecipients.add(result.getToUserName());
+            }
+        }
+        if (!failedRecipients.isEmpty()) {
+            String errorMsg = "部分消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
+            throw new CustomException("发送文本消息部分失败: " + errorMsg);
+        }
+        return response;
+    }
 }