文章

企业微信消息推送到个人微信

背景

server酱和pushplus等消息推送服务都越来越不好使了,我的场景是可以给个人或者其他人快速发送一个markdown类的消息即可。

为什么选择企业微信,因为微信可以收到,并且个人微信现在属于常驻应用,钉钉和其他不怎么用,即时推送了也不能第一时间收到。

效果如下

效果如下:微信里面会有一个关注企业,可以收到该企业的企业微信消息。

原理是企业微信有一个微信插件:成员无需下载企业微信客户端,直接用微信扫码关注微信插件,即可在微信中接收企业通知和使用企业应用。

如何集成企业微信完成推送呢(不含代码逻辑)

根据您的需求,以下是使用企业微信推送消息到个人微信上的全流程,包括企业微信注册、企业应用注册以及应用消息推送的详细操作指南和相关链接:

1. 企业微信注册与配置

  • 注册企业微信

    • 每个人都可以注册企业微信,免费版企业最大人数是200人。注册地址

    • 同时,手机或电脑下载企业微信客户端。

1.1 加入企业

  • 注册成功后进入管理后台,让自己和想要推送的人加入企业。

1.2 开启微信插件

  • 为了让企业微信能直接在微信上看,需要开启微信插件。

1.3 测试是否能在微信接收消息

  • 能在微信正常收到公告就代表已经成功进入企业,且成功使用微信插件。

2. 添加自建应用

  • 在企业微信管理后台添加自建应用。

3. 获取应用接口凭证(access_token)

  • 获取企业id(corp_id):在“我的企业”页面查看企业信息。

  • 获取应用的Secret:在应用管理页面找到自建应用,获取Secret。

  • 获取access_token:使用企业id和应用的Secret获取access_token。

4. 配置IP白名单和可信域名

  • 配置可信域名:输入经过ICP备案的域名,然后点击申请校验,将下载的文件放到域名根目录下。

  • 配置可信IP白名单:在企业微信后台输入服务器的IP地址。

5. 发送消息

  • 获取应用id(agent_id):在自建应用界面复制应用id。

  • 发送消息:使用企业微信提供的接口发送消息。

以上步骤为您提供了从注册企业微信到发送消息的详细流程。您可以根据这些步骤操作,如果需要更详细的操作手册或遇到问题,可以参考企业微信的官方文档和开发指南。希望这些信息能帮助您顺利实现企业微信消息推送功能。

Java代码实现应用消息推送(支持markdown)

Java代码实现应用消息推送(支持markdown),给出示例代码,以及提前需要准备的配置信息和需要进行的配置:

参考代码如下:

package cn.iocoder.yudao;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class WeChatWorkBot {

    private static final String CORP_ID = "";
    private static final String AGENT_ID = "";
    private static final String SECRET = "";
    private static final String TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + SECRET;

    public static String getAccessToken() throws IOException {
        URL url = new URL(TOKEN_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.connect();

        int responseCode = conn.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            ObjectMapper mapper = new ObjectMapper();
            AccessTokenResponse tokenResponse = mapper.readValue(response.toString(), AccessTokenResponse.class);
            return tokenResponse.getAccessToken();
        }
        return null;
    }

    public static void sendMarkdownMessage(String accessToken, String toUser, String content) throws IOException {
        String msgType = "markdown";
        String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
        String markdownContent = "{"
                + "\"touser\":\"" + toUser + "\","
                + "\"msgtype\":\"" + msgType + "\","
                + "\"agentid\":" + AGENT_ID + ","
                + "\"markdown\":{"
                + "\"content\":\"" + content.replace("\"", "\\\"") + "\""
                + "}"
                + "}";

        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

        try (OutputStream os = conn.getOutputStream()) {
            os.write(markdownContent.getBytes(StandardCharsets.UTF_8));
            os.flush();
            int responseCode = conn.getResponseCode();
            if (responseCode != HttpURLConnection.HTTP_OK) {
                throw new RuntimeException("Failed : HTTP error code : " + responseCode);
            }

            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8));
            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
        }
    }

    public static void main(String[] args) {
        try {
            String accessToken = getAccessToken();
            sendMarkdownMessage(accessToken, "@all", "# Hello World \n > This is a markdown message.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // Inner class to handle the JSON response for access token
    @JsonIgnoreProperties(ignoreUnknown = true)
    private static class AccessTokenResponse {
        private String accessToken;

        public String getAccessToken() {
            return accessToken;
        }

        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }
    }
}