package com.ruoyi.common.utils; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.exception.ServiceException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.*; @Slf4j @Component public class WxRobotUtil { @Resource private HttpRequestUtil httpRequestUtil; /** 企业微信群上传文件url */ public static final String UPLOAD_FILE_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media"; /** 发送群消息url */ public static final String SEND_MESSAGE_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send"; /** * 上传文件并推送到企业微信群 * @param file * @param robotId 机器人Id * @throws ServiceException */ public void sendFileToWeChatGroup(File file, String robotId) { // 上传文件 String urlString = UPLOAD_FILE_URL + "?key=" + robotId + "&type=file"; ResponseEntity result = httpRequestUtil.doUploadFile(urlString, file); JSONObject dataObject = JSONObject.parseObject(JSONObject.toJSONString(result.getBody())); Integer errcode = Integer.valueOf(dataObject.get("errcode").toString()); if (errcode.equals(0)) { // 推送消息 String mediaid = (String) dataObject.get("media_id"); String sendUrl = SEND_MESSAGE_URL + "?key=" + robotId; Map mediaMap = new HashMap<>(); mediaMap.put("media_id", mediaid); Map msgMap = new HashMap<>(); msgMap.put("msgtype", "file"); msgMap.put("file", mediaMap); httpRequestUtil.doPost(sendUrl, msgMap); log.info("企业微信推送报表成功,时间:" + new Date()); } else { log.error("企业微信推送报表失败,时间:" + new Date()); } } /** * 推送信息给企业微信机器人 * @param msg 消息内容 * @param robotId 机器人ID * @param mentionAll 是否@所有人 */ public void sendMsgToWeChatGroup(String msg, String robotId, boolean mentionAll) { HashMap paramMap = new HashMap<>(); HashMap textMap = new HashMap<>(); textMap.put("content", msg); // 添加@所有人的配置 if (mentionAll) { textMap.put("mentioned_list", Collections.singletonList("@all")); } paramMap.put("msgtype", "text"); paramMap.put("text", textMap); String sendUrl = SEND_MESSAGE_URL + "?key=" + robotId; ResponseEntity result = httpRequestUtil.doPost(sendUrl, paramMap); JSONObject dataObject = JSONObject.parseObject(JSONObject.toJSONString(result.getBody())); Integer errcode = Integer.valueOf(dataObject.get("errcode").toString()); if (errcode.equals(0)) { log.info("企业微信推送消息成功,时间:" + new Date()); } else { log.error("企业微信推送消息失败,时间:" + new Date()); } } // 保留原有方法,默认不@所有人 public void sendMsgToWeChatGroup(String msg, String robotId) { sendMsgToWeChatGroup(msg, robotId, false); } /** * 推送Markdown格式信息给企业微信机器人 * @param markdownMsg Markdown格式的消息内容 * @param robotId 机器人ID */ public void sendMarkdownMsgToWeChatGroup(String markdownMsg, String robotId) { String messageContent = markdownMsg.toString(); if (messageContent.length() > 4096) { messageContent = messageContent.substring(0, 4096); // 截断到最大长度 } HashMap paramMap = new HashMap<>(); HashMap markdownMap = new HashMap<>(); markdownMap.put("content", messageContent); paramMap.put("msgtype", "markdown"); paramMap.put("markdown", markdownMap); String sendUrl = SEND_MESSAGE_URL + "?key=" + robotId; log.info("发送URL: {}", sendUrl); log.info("发送参数: {}", paramMap); ResponseEntity result = httpRequestUtil.doPost(sendUrl, paramMap); JSONObject dataObject = JSONObject.parseObject(JSONObject.toJSONString(result.getBody())); Integer errcode = Integer.valueOf(dataObject.get("errcode").toString()); if (errcode.equals(0)) { log.info("企业微信推送Markdown消息成功,时间:" + new Date()); } else { log.error("企业微信推送Markdown消息失败,时间:" + new Date() + ",错误信息:" + dataObject.toJSONString()); } } /** * 推送图文类型信息给企业微信机器人 * @param title 标题 * @param description 描述 * @param url 点击跳转链接 * @param picUrl 图片链接 * @param robotId 机器人ID */ public void sendNewsToWeChatGroup(String title, String description, String url, String picUrl, String robotId) { HashMap paramMap = new HashMap<>(); // 创建文章对象 HashMap article = new HashMap<>(); article.put("title", title); article.put("description", description); article.put("url", url); article.put("picurl", picUrl); // 创建文章列表 List> articles = new ArrayList<>(); articles.add(article); // 创建news对象 HashMap newsMap = new HashMap<>(); newsMap.put("articles", articles); // 设置消息类型和内容 paramMap.put("msgtype", "news"); paramMap.put("news", newsMap); String sendUrl = SEND_MESSAGE_URL + "?key=" + robotId; ResponseEntity result = httpRequestUtil.doPost(sendUrl, paramMap); JSONObject dataObject = JSONObject.parseObject(JSONObject.toJSONString(result.getBody())); Integer errcode = Integer.valueOf(dataObject.get("errcode").toString()); if (errcode.equals(0)) { log.info("企业微信推送图文消息成功,时间:" + new Date()); } else { log.error("企业微信推送图文消息失败,时间:" + new Date()); } } public static String getAccessToken(String corpId, String corpSecret) { try { // 构建请求 URL String urlStr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpId + "&corpsecret=" + corpSecret; URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); // 读取响应 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 解析 JSON 响应 JSONObject jsonResponse = new JSONObject(response.toString().isEmpty()); int errcode = jsonResponse.getObject("errcode",int.class); if (errcode == 0) { // 获取 access_token return jsonResponse.getString("access_token"); } else { System.out.println("获取 access_token 失败: " + jsonResponse.getString("errmsg")); return null; } } catch (Exception e) { e.printStackTrace(); return null; } } }