企业微信消息推送到个人微信
背景
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;
}
}
}