configs = new ConcurrentHashMap<>();
+
+ /**
+ * 创建各个厂商的实现类
+ *
+ * @param config 通知webhook配置
+ */
+ public static void createAndRegisterOaSender(OaSupplierConfig config) {
+ OaSender oaSender = createAndGetOa(config);
+ register(oaSender);
+ }
+
+ /**
+ * 注册通知webhook服务对象
+ *
+ * @param smsBlend 通知webhook服务对象
+ */
+ public static void register(OaSender smsBlend) {
+ if (smsBlend == null) {
+ throw new OaException("通知webhook服务对象不能为空");
+ }
+ configs.put(smsBlend.getConfigId(), smsBlend);
+ }
+
+ public static OaSender createAndGetOa(OaSupplierConfig config) {
+ BaseProviderFactory factory = ProviderFactoryHolder.requireForSupplier(config.getSupplier());
+ if (factory == null) {
+ throw new OaException("不支持当前供应商配置");
+ }
+ return factory.createSmsOa(config);
+ }
+
+ /**
+ * 通过configId获取通知webhook服务对象
+ *
+ * @param configId 唯一标识
+ * @return 返回通知webhook服务对象。如果未找到则返回null
+ */
+ public static OaSender getSmsOaBlend(String configId) {
+ return configs.get(configId);
+ }
+
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java
new file mode 100644
index 00000000..02270949
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java
@@ -0,0 +1,43 @@
+package org.dromara.oa.core.provider.factory;
+
+import cn.hutool.core.collection.CollUtil;
+import org.dromara.oa.api.OaSender;
+import org.dromara.oa.comm.config.OaSupplierConfig;
+import org.dromara.oa.comm.errors.OaException;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author dongfeng
+ * @date 2023-10-22 21:12
+ */
+public class ProviderFactoryHolder {
+
+
+ private static final Map> factories = new ConcurrentHashMap<>();
+
+ public static void registerFactory(BaseProviderFactory extends OaSender, ? extends OaSupplierConfig> factory) {
+ if (factory == null) {
+ throw new OaException("注册供应商工厂失败,工厂实例不能为空");
+ }
+ factories.put(factory.getSupplier(), factory);
+ }
+
+ public static void registerFactory(List> factoryList) {
+ if (CollUtil.isEmpty(factoryList)) {
+ return;
+ }
+ for (BaseProviderFactory extends OaSender, ? extends OaSupplierConfig> factory : factoryList) {
+ if (factory == null) {
+ continue;
+ }
+ registerFactory(factory);
+ }
+ }
+
+ public static BaseProviderFactory extends OaSender, ? extends OaSupplierConfig> requireForSupplier(String supplier) {
+ return factories.getOrDefault(supplier, null);
+ }
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java
new file mode 100644
index 00000000..f8dbe026
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java
@@ -0,0 +1,27 @@
+package org.dromara.oa.core.provider.service;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Getter;
+import org.dromara.oa.api.OaSender;
+import org.dromara.oa.comm.config.OaSupplierConfig;
+
+/**
+ * @author dongfeng
+ * @date 2023-10-22 21:03
+ */
+public abstract class AbstractOaBlend implements OaSender {
+
+ @Getter
+ private final String configId;
+
+ private final C config;
+
+ protected AbstractOaBlend(C config) {
+ this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId();
+ this.config = config;
+ }
+
+ protected C getConfig() {
+ return config;
+ }
+}
\ No newline at end of file
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java
new file mode 100644
index 00000000..49d2f234
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java
@@ -0,0 +1,26 @@
+package org.dromara.oa.core.support;
+
+import java.util.Map;
+
+public abstract class AbstractHttpClient implements MsgHttpClient {
+
+ @Override
+ public String get(String url) {
+ return null;
+ }
+
+ @Override
+ public String get(String url, Map headers) {
+ return null;
+ }
+
+ @Override
+ public String post(String url) {
+ return null;
+ }
+
+ @Override
+ public String post(String url, Map headers) {
+ return null;
+ }
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java
new file mode 100644
index 00000000..7b6f72a7
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java
@@ -0,0 +1,19 @@
+package org.dromara.oa.core.support;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+
+import java.util.Map;
+
+public class HttpClientImpl extends AbstractHttpClient {
+ @Override
+ public String post(StringBuilder url, Map headers, T message) throws Exception {
+ // 构建请求体
+ // 发送POST请求
+ HttpResponse response = HttpRequest.post(url.toString())
+ .headerMap(headers, true)
+ .body(message.toString())
+ .execute();
+ return response.body();
+ }
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java
new file mode 100644
index 00000000..cb84e146
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java
@@ -0,0 +1,17 @@
+package org.dromara.oa.core.support;
+
+import java.util.Map;
+
+public interface MsgHttpClient {
+
+ String get(String url);
+
+ String get(String url, Map headers);
+
+ String post(String url);
+
+ String post(String url, Map headers);
+
+ String post(StringBuilder url, Map headers, T message) throws Exception;
+
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java
new file mode 100644
index 00000000..88b045b8
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java
@@ -0,0 +1,18 @@
+package org.dromara.oa.core.weTalk.config;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.oa.comm.enums.OaType;
+import org.dromara.oa.core.provider.config.OaBaseConfig;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WeTalkConfig extends OaBaseConfig {
+
+ private final String requestUrl = OaType.WETALK.getUrl();
+
+ @Override
+ public String getSupplier() {
+ return OaType.WETALK.getType();
+ }
+}
\ No newline at end of file
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java
new file mode 100644
index 00000000..3a1969ef
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java
@@ -0,0 +1,40 @@
+package org.dromara.oa.core.weTalk.config;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.dromara.oa.comm.content.OaContent;
+import org.dromara.oa.core.provider.factory.AbstractProviderFactory;
+import org.dromara.oa.core.weTalk.service.WeTalkOaImpl;
+
+/**
+ * @author dongfeng
+ * @description 微信通知对象建造
+ * @date 2023-10-22 21:00
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class WeTalkFactory extends AbstractProviderFactory {
+ private static final WeTalkFactory INSTANCE = new WeTalkFactory();
+
+ /**
+ * 建造一个微信通知服务
+ */
+ @Override
+ public WeTalkOaImpl createSmsOa(WeTalkConfig weTalkConfig) {
+ return new WeTalkOaImpl(weTalkConfig);
+ }
+
+ @Override
+ public String getSupplier() {
+ return OaContent.WETALK;
+ }
+
+ /**
+ * 获取建造者实例
+ *
+ * @return 建造者实例
+ */
+ public static WeTalkFactory instance() {
+ return INSTANCE;
+ }
+
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java
new file mode 100644
index 00000000..bc800521
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java
@@ -0,0 +1,68 @@
+package org.dromara.oa.core.weTalk.service;
+
+import cn.hutool.json.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.oa.comm.entity.Request;
+import org.dromara.oa.comm.entity.Response;
+import org.dromara.oa.comm.enums.MessageType;
+import org.dromara.oa.comm.enums.OaType;
+import org.dromara.oa.comm.errors.OaException;
+import org.dromara.oa.core.provider.service.AbstractOaBlend;
+import org.dromara.oa.core.support.HttpClientImpl;
+import org.dromara.oa.core.weTalk.config.WeTalkConfig;
+import org.dromara.oa.core.weTalk.utils.WeTalkBuilder;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import static org.dromara.oa.comm.enums.OaType.WETALK;
+
+/**
+ * @author dongfeng
+ * @date 2023-10-22 21:01
+ */
+@Slf4j
+public class WeTalkOaImpl extends AbstractOaBlend {
+
+ private HttpClientImpl httpClient = new HttpClientImpl();
+
+ public WeTalkOaImpl(WeTalkConfig config) {
+ super(config);
+ }
+
+ @Override
+ public String getSupplier() {
+ return OaType.WETALK.getType();
+ }
+
+ @Override
+ public Response sender(Request request, MessageType messageType) {
+
+ if (Objects.isNull(request.getContent())) {
+ throw new OaException("消息体content不能为空");
+ }
+ StringBuilder webhook = new StringBuilder();
+ JSONObject message = null;
+ WeTalkConfig config = getConfig();
+ webhook.append(WETALK.getUrl());
+ webhook.append(config.getTokenId());
+ message = WeTalkBuilder.createWeTalkMessage(request, messageType);
+ String post;
+ try {
+ post = httpClient.post(webhook, getHeaders(), message);
+ log.info("请求返回结果:" + post);
+ } catch (Exception e) {
+ log.warn("请求失败问题:" + e.getMessage());
+ throw new OaException(e.getMessage());
+ }
+ // 后续解析响应体提取errorCode判断是否成功
+ return new Response(true, post, config.getConfigId());
+ }
+
+ public static Map getHeaders() {
+ Map headers = new HashMap<>();
+ headers.put("Content-Type", "application/json");
+ return headers;
+ }
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java
new file mode 100644
index 00000000..11046292
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java
@@ -0,0 +1,56 @@
+package org.dromara.oa.core.weTalk.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import org.dromara.oa.comm.entity.Request;
+import org.dromara.oa.comm.enums.MessageType;
+
+import java.util.List;
+
+import static org.dromara.oa.comm.enums.MessageType.MARKDOWN;
+import static org.dromara.oa.comm.enums.MessageType.TEXT;
+
+/**
+ * @author dongfeng
+ * @description 微信通知签名和信息构建
+ * @date 2023-10-19 13:07
+ */
+public class WeTalkBuilder {
+
+
+ public static JSONObject createWeTalkMessage(Request request, MessageType messageType) {
+
+ JSONObject message = new JSONObject();
+ if (messageType == TEXT) {
+ message.set("msgtype", "text");
+ JSONObject text = new JSONObject();
+ text.set("content", request.getContent());
+ boolean isContain = false;
+ List userIdList = request.getUserIdList();
+ List phoneList = request.getPhoneList();
+ Boolean isNoticeAll = request.getIsNoticeAll();
+ if (!ObjectUtil.isNull(userIdList)) {
+ if (isNoticeAll) {
+ userIdList.add("@all");
+ isContain = true;
+ }
+ text.set("mentioned_list", userIdList.toArray());
+ }
+ if (!ObjectUtil.isNull(phoneList)) {
+ if (isNoticeAll && !isContain) {
+ phoneList.add("@all");
+ }
+ text.set("mentioned_mobile_list", phoneList.toArray());
+ }
+ message.set("text", text);
+ } else if (messageType == MARKDOWN) {
+ message.set("msgtype", "markdown");
+ JSONObject markdown = new JSONObject();
+ markdown.set("content", request.getContent());
+ markdown.set("title", request.getTitle());
+ message.set("markdown", markdown);
+ }
+ return message;
+ }
+
+}
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..9157acc8
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ org.dromara.oa.core.config.OaSupplierConfig
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..9dc50ba4
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+org.dromara.oa.core.config.OaSupplierConfig
diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/sms4j-spring-boot-example/pom.xml b/sms4j-spring-boot-example/pom.xml
index a54f8118..fdf7cbea 100644
--- a/sms4j-spring-boot-example/pom.xml
+++ b/sms4j-spring-boot-example/pom.xml
@@ -29,6 +29,11 @@
spring-boot-starter-test
test
+
+ org.dromara.sms4j
+ sms4j-oa-core
+ ${revision}
+
org.dromara.sms4j
sms4j-spring-boot-starter
diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml
index e212bec1..61b6e526 100644
--- a/sms4j-spring-boot-example/src/main/resources/application.yml
+++ b/sms4j-spring-boot-example/src/main/resources/application.yml
@@ -59,4 +59,18 @@ sms:
#模板ID
template-id: pub_verif_short
# 模版名称
- templateName: code
\ No newline at end of file
+ templateName: code
+
+ oas:
+ oaDingTalkByYaml: # configId
+ isEnable: true # 表示该配置是否生效(默认生效,false表示不生效)
+ supplier: dingding # 厂商标识
+ tokenId: 您的accessKey
+ sign: 您的sign
+ oaByteTalkByYaml: # configId
+ supplier: feishu # 厂商标识
+ tokenId: 您的accessKey
+ sign: 您的sign
+ oaWeTalkByYaml:
+ supplier: wetalk # 厂商标识
+ tokenId: 您的sign
\ No newline at end of file
diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java
new file mode 100644
index 00000000..d7b4bcdb
--- /dev/null
+++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java
@@ -0,0 +1,165 @@
+package org.dromara.sms4j.example;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.oa.api.OaSender;
+import org.dromara.oa.comm.entity.Request;
+import org.dromara.oa.comm.enums.MessageType;
+import org.dromara.oa.comm.enums.OaType;
+import org.dromara.oa.core.byteTalk.config.ByteTalkConfig;
+import org.dromara.oa.core.dingTalk.config.DingTalkConfig;
+import org.dromara.oa.core.provider.factory.OaFactory;
+import org.dromara.oa.core.weTalk.config.WeTalkConfig;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.ArrayList;
+
+
+@Slf4j
+@SpringBootTest
+public class SmsOaTest {
+ /**
+ * 填测试手机号
+ */
+ private static final String PHONE = "";
+ /**
+ * 填access_token
+ */
+ private static final String TOKENID = "";
+ /**
+ * 填secret
+ */
+ private static final String SIGN = "";
+
+ @Test
+ public void oaDingTalkTest() {
+ String key = "oaDingTalk";
+ DingTalkConfig dingTalkConfig = new DingTalkConfig();
+ dingTalkConfig.setConfigId(key);
+ dingTalkConfig.setSign(SIGN);
+ dingTalkConfig.setTokenId(TOKENID);
+// OaFactory.createAndRegisterOaSender(dingTalkConfig);
+ OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig);
+ Request request = new Request();
+ ArrayList phones = new ArrayList<>();
+ phones.add(PHONE);
+ request.setPhoneList(phones);
+ request.setIsNoticeAll(true);
+ request.setContent("测试消息");
+ request.setTitle("测试消息标题");
+ alarm.sender(request, MessageType.TEXT);
+
+ // 测试markdown,无法@
+// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > \n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n");
+// request.setTitle("杭州天气");
+// alarm.sender(request, MessageType.MARKDOWN);
+
+ }
+
+ @Test
+ public void oaDingTalkByYamlTest() {
+ String configId = "oaDingTalkByYaml";
+ OaSender alarm = OaFactory.getSmsOaBlend(configId);
+ Request request = new Request();
+ ArrayList phones = new ArrayList<>();
+ phones.add(PHONE);
+ request.setPhoneList(phones);
+ request.setIsNoticeAll(false);
+ request.setContent("HertzBeat");
+ request.setTitle("HertzBeat");
+ alarm.sender(request, MessageType.TEXT);
+
+ }
+
+ @Test
+ public void oaByteTalkTest() {
+ String configId = "oaByteTalk";
+ ByteTalkConfig dingTalkConfig = new ByteTalkConfig();
+ dingTalkConfig.setConfigId(configId);
+ dingTalkConfig.setSign(SIGN);
+ dingTalkConfig.setTokenId(TOKENID);
+ OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig);
+ Request request = new Request();
+ ArrayList userNameList = new ArrayList<>();
+ userNameList.add("user1");
+ userNameList.add("user2");
+ request.setUserNamesList(userNameList);
+ request.setContent("测试消息");
+ request.setIsNoticeAll(true);
+// request.setTitle("测试消息标题");
+ alarm.sender(request, MessageType.TEXT);
+ }
+
+
+ @Test
+ public void oaByteTalkByYamlTest() {
+ String configId = "oaByteTalkByYaml";
+ OaSender alarm = OaFactory.getSmsOaBlend(configId);
+ Request request = new Request();
+ request.setOaType(OaType.BYTETALK.getType());
+ ArrayList userNameList = new ArrayList<>();
+ userNameList.add("user1");
+ userNameList.add("user2");
+ request.setUserNamesList(userNameList);
+ request.setContent("测试消息");
+ request.setIsNoticeAll(true);
+// request.setTitle("测试消息标题");
+ alarm.sender(request, MessageType.TEXT);
+ }
+
+ @Test
+ public void oaWeTalkTest() {
+ String configId = "oaWeTalk";
+ WeTalkConfig weTalkConfig = new WeTalkConfig();
+ weTalkConfig.setConfigId(configId);
+ weTalkConfig.setTokenId(TOKENID);
+ OaSender alarm = OaFactory.createAndGetOa(weTalkConfig);
+ Request request = new Request();
+ ArrayList phones = new ArrayList<>();
+ phones.add(PHONE);
+ phones.add("131");
+ request.setPhoneList(phones);
+ ArrayList userIds = new ArrayList<>();
+ userIds.add("123");
+ request.setUserIdList(userIds);
+// request.setIsNoticeAll(true);
+ request.setContent("测试消息");
+ request.setTitle("测试消息标题");
+ alarm.sender(request, MessageType.TEXT);
+
+ // 测试markdown,无法@
+ // 企业微信的markdown直接是content,没有title
+// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > \n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n");
+// request.setTitle("杭州天气");
+// alarm.sender(request, MessageType.MARKDOWN);
+ }
+
+
+ @Test
+ public void oaWeTalkByYamlTest() {
+ String configId = "oaWeTalkByYaml";
+ OaSender alarm = OaFactory.getSmsOaBlend(configId);
+ Request request = new Request();
+ request.setOaType(OaType.WETALK.getType());
+ ArrayList phones = new ArrayList<>();
+ phones.add(PHONE);
+ phones.add("131");
+ request.setPhoneList(phones);
+ ArrayList userIds = new ArrayList<>();
+ userIds.add("123");
+ request.setUserIdList(userIds);
+// request.setIsNoticeAll(true);
+ request.setContent("测试消息");
+ request.setTitle("测试消息标题");
+ alarm.sender(request, MessageType.TEXT);
+
+ // 测试markdown,无法@
+ // 企业微信的markdown直接是content,没有title
+// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > \n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n");
+// request.setTitle("杭州天气");
+// alarm.sender(request, MessageType.MARKDOWN);
+ }
+}
+
+
+