简单封装企业微信消息推送

394 阅读2分钟

使用jar:hutool,json,google的event 消息实体类:

package com.winsea.iboot.eventbus.model;  
  
/**  
* @description:  
* @author: nice  
* @created: 2023/06/07 10:13  
*/  
import lombok.*;  
  
import java.util.List;  
  
@Getter  
@Setter  
@Builder  
@AllArgsConstructor  
@NoArgsConstructor  
public class EnterpriseWxRobotMessageRequest {  
    private String msgtype;  
    private Markdown markdown;  
    private Text text;  
    private File file;  
    private News news;  


    @Getter  
    @Setter  
    @AllArgsConstructor  
    @NoArgsConstructor  
    public static class Markdown {  
        private String content;  
    }  

    @Getter  
    @Setter  
    @AllArgsConstructor  
    @NoArgsConstructor  
    public static class Text {  
        private String content;  
        private List<String> mentioned_list;  
        private List<String> mentioned_mobile_list;  
    }  


    @Getter  
    @Setter  
    @AllArgsConstructor  
    @NoArgsConstructor  
    public static class File {  
        private String media_id;  

    }  

    @Getter  
    @Setter  
    @AllArgsConstructor  
    @NoArgsConstructor  
    @Builder  
    public static class News{  
        private List<Articles> articlesList;  
    }  

    @Getter  
    @Setter  
    @AllArgsConstructor  
    @NoArgsConstructor  
    @Builder  
    public static class Articles{  
        private String title;  
        private String description;  
        private String url;  
        private String picurl;  
    }  

    public static class Image{  
        private String base64;  
        private String md5;  
    }  
}

实体类

package com.ruoyi.common.core.eventbus.event;



import com.ruoyi.common.core.eventbus.core.Event;
import com.ruoyi.common.core.eventbus.vo.EnterpriseWxRobotMessageRequest;
import lombok.*;
import java.util.List;

/**
 * @description: 企业微信机器人消息
 * @author: nice
 * @created: 2022/11/23 13:50
 */

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EnterpriseWxSendEvent implements Event {
    //消息类型
    private String msgType;
    //消息
    private String message;
    //图文消息
    private List<EnterpriseWxRobotMessageRequest.Articles> articlesList;
    //接收者类型
    private String type;
    //接收者
    private List<String> idList;
    //文件id,通过下文的文件上传接口获取
    private String mediaId;
    // 机器人id
    private String robotKey;

}

推送方法

package com.ruoyi.common.core.eventbus.listener;


import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.google.common.eventbus.Subscribe;
import com.ruoyi.common.core.eventbus.annotation.EventBusListener;
import com.ruoyi.common.core.eventbus.event.EnterpriseWxSendEvent;
import com.ruoyi.common.core.eventbus.vo.EnterpriseWxRobotMessageRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 推送消息类型:文本、markdown、图文、文件
 */

@Component
@EventBusListener
@Log4j2
public class EnterpriseWxSendListener {
    private static final String url = "http://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=";   // 机器人id 笑脸
    private static final String finalRobotKey = "10086";   // 机器人id 笑脸

    public static final String TYPE_ALL = "ALL"; //接收者 所有人
    public static final String TYPE_MOBILE = "MOBILE";//根据手机号选择接收人
    public static final String TYPE_USER = "USER";//根据企业微信的用户Id选择接收人

    public static final String MSG_TYPE_TEXT = "text";
    public static final String MSG_TYPE_MARKDOWN = "markdown";
    public static final String MSG_TYPE_NEWS = "news";
    public static final String MSG_TYPE_FILE = "file";

    @Subscribe
    private void send(EnterpriseWxSendEvent enterpriseWxSendEvent) {
        EnterpriseWxRobotMessageRequest feignCropRobotMessageBody = new EnterpriseWxRobotMessageRequest();

        String msgType = enterpriseWxSendEvent.getMsgType();
        String message = enterpriseWxSendEvent.getMessage();

        if (StrUtil.isBlank(msgType)) {
            return;
        }
        // 传入消息类型
        feignCropRobotMessageBody.setMsgtype(msgType);
        // 获取接收者类型
        String type = enterpriseWxSendEvent.getType();

        if (EnterpriseWxSendListener.MSG_TYPE_MARKDOWN.equals(msgType)) {
            EnterpriseWxRobotMessageRequest.Markdown markdown = new EnterpriseWxRobotMessageRequest.Markdown();
            markdown.setContent(message);
            feignCropRobotMessageBody.setMarkdown(markdown);
            if (StrUtil.isBlank(message)) {
                return;
            }
        } else if (EnterpriseWxSendListener.MSG_TYPE_TEXT.equals(msgType)) {
            if (StrUtil.isBlank(message)) {
                return;
            }
            EnterpriseWxRobotMessageRequest.Text feignText = new EnterpriseWxRobotMessageRequest.Text();
            feignText.setContent(message);
            if (EnterpriseWxSendListener.TYPE_USER.equals(type)) {
                feignText.setMentioned_list(enterpriseWxSendEvent.getIdList());
            } else if (EnterpriseWxSendListener.TYPE_MOBILE.equals(type)) {
                feignText.setMentioned_mobile_list(enterpriseWxSendEvent.getIdList());
            } else if (EnterpriseWxSendListener.TYPE_ALL.equals(type)) {
                feignText.setMentioned_list(Arrays.asList("@all"));
                //feignText.setMentioned_mobile_list(Arrays.asList("@all"));
            }
            feignCropRobotMessageBody.setText(feignText);
        } else if (EnterpriseWxSendListener.MSG_TYPE_NEWS.equals(msgType)) {

            List<EnterpriseWxRobotMessageRequest.Articles> articlesList = enterpriseWxSendEvent.getArticlesList();
            if (CollUtil.isNotEmpty(articlesList)) {
                List<EnterpriseWxRobotMessageRequest.Articles> articlesNewList = articlesList.stream()
                        .filter(articles -> StrUtil.isNotBlank(articles.getTitle()) && StrUtil.isNotBlank(articles.getUrl()))
                        .limit(8)
                        .collect(Collectors.toList());

                if (CollUtil.isNotEmpty(articlesNewList)) {
                    EnterpriseWxRobotMessageRequest.News feignNews = new EnterpriseWxRobotMessageRequest.News();
                    feignNews.setArticlesList(articlesNewList);
                    feignCropRobotMessageBody.setNews(feignNews);
                } else {
                    return;
                }
            } else {
                return;
            }
        } else if (EnterpriseWxSendListener.MSG_TYPE_FILE.equals(msgType)) {

            String mediaId = enterpriseWxSendEvent.getMediaId();

            if (StrUtil.isBlank(mediaId)) {
                return;
            } else {
                EnterpriseWxRobotMessageRequest.File feignFile = new EnterpriseWxRobotMessageRequest.File();
                feignFile.setMedia_id(mediaId);
                feignCropRobotMessageBody.setFile(feignFile);
            }
        }
        String robotKey = enterpriseWxSendEvent.getRobotKey();
        if(StrUtil.isBlank(robotKey)){
            robotKey = finalRobotKey;
        }
        sendRobotMessage(feignCropRobotMessageBody, robotKey);
    }

    /**
     * 请求企业微信
     * */
    private void sendRobotMessage(EnterpriseWxRobotMessageRequest feignEnterpriseWxRobotMessage,String robotKey){
        String requestUrl = url + robotKey;
        String body = JSON.toJSONString(feignEnterpriseWxRobotMessage);
        String response = HttpRequest.post(requestUrl)
                .body(body)
                .setFollowRedirects(true)
                .timeout(30 * 1000)
                .execute()
                .body();
        log.error("企业微信消息推送 = " + response);
    }
}

注入:

package com.ruoyi.framework.config;  
  
import com.google.common.eventbus.AsyncEventBus;  
import com.google.common.eventbus.EventBus;  
import com.google.common.util.concurrent.ThreadFactoryBuilder;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
import java.util.concurrent.*;  
  
/**  
* @description: 事件总线  
* @author: nice  
* @created: 2022/06/06 10:03  
*/  
@Configuration  
public class EventBusConfig {  

    /**  
    * 单进程同步事件总线  
    * 同步方式 : 此事件总线承担业务通信及解耦 替换java的  
    */  
    @Bean("syncEventBus")  
    public EventBus syncEventBus() {  
        EventBus eventBus = new EventBus();  
        return eventBus;  
    }  

    /**  
    * 单进程事件总线  
    * 异步方式  
    */  
    @Bean("asyncEventBus")  
    public AsyncEventBus asyncEventBus() {  
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("asyncEventBus").build();  
        ExecutorService executorService = new ThreadPoolExecutor(3, 10,  
        10000L, TimeUnit.MILLISECONDS,  
        new LinkedBlockingQueue<Runnable>(64), namedThreadFactory, new ThreadPoolExecutor.CallerRunsPolicy());  
        return new AsyncEventBus(executorService);  
    }  
}