mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 17:08:40 +08:00
1.oa规范类型命名. 2.企业微信新增news消息类型
This commit is contained in:
parent
b1a18b6972
commit
a120bc9370
@ -13,14 +13,14 @@ public class OaContent {
|
|||||||
/**
|
/**
|
||||||
* 钉钉
|
* 钉钉
|
||||||
*/
|
*/
|
||||||
public static final String DINGTALK = "dingding";
|
public static final String DING_TALK = "ding_ding";
|
||||||
/**
|
/**
|
||||||
* 飞书
|
* 飞书
|
||||||
*/
|
*/
|
||||||
public static final String BYTETALK = "feishu";
|
public static final String BYTE_TALK = "byte_talk";
|
||||||
/**
|
/**
|
||||||
* 微信
|
* 微信
|
||||||
*/
|
*/
|
||||||
public static final String WETALK = "wetalk";
|
public static final String WE_TALK = "we_talk";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,9 @@ public class Request implements Comparable<Request> {
|
|||||||
// link类型的参数
|
// link类型的参数
|
||||||
private String messageUrl;
|
private String messageUrl;
|
||||||
|
|
||||||
|
// news类型的参数
|
||||||
|
private List<WeTalkRequestArticle> articleList;
|
||||||
|
|
||||||
private List<String> phoneList;
|
private List<String> phoneList;
|
||||||
|
|
||||||
// 用于@,唯一标识:userId/openId
|
// 用于@,唯一标识:userId/openId
|
||||||
|
|||||||
@ -0,0 +1,27 @@
|
|||||||
|
package org.dromara.oa.comm.entity;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图文消息,一个图文消息支持1到8条图文
|
||||||
|
* @author dongfeng
|
||||||
|
* 2024-03-23 19:25
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class WeTalkRequestArticle {
|
||||||
|
// 标题,不超过128个字节,超过会自动截断
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
// 描述,不超过512个字节,超过会自动截断
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
// 点击后跳转的链接。
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
// 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图 1068*455,小图150*150。
|
||||||
|
private String picUrl;
|
||||||
|
}
|
||||||
@ -5,27 +5,27 @@ import lombok.Getter;
|
|||||||
@Getter
|
@Getter
|
||||||
public enum MessageType {
|
public enum MessageType {
|
||||||
// 钉钉支持类型
|
// 钉钉支持类型
|
||||||
DINGTALK_TEXT("text"),
|
DING_TALK_TEXT("text"),
|
||||||
|
|
||||||
DINGTALK_MARKDOWN("markdown"),
|
DING_TALK_MARKDOWN("markdown"),
|
||||||
|
|
||||||
|
DING_TALK_LINK("link"),
|
||||||
|
|
||||||
DINGTALK_LINK("link"),
|
|
||||||
// 飞书支持类型
|
// 飞书支持类型
|
||||||
|
BYTE_TALK_TEXT("text"),
|
||||||
BYTETALK_TEXT("text"),
|
// BYTE_TALK_MARKDOWN("markdown"),
|
||||||
// BYTETALK_MARKDOWN("markdown"),
|
// BYTE_TALK_LINK("link"),
|
||||||
// BYTETALK_LINK("link"),
|
|
||||||
|
|
||||||
// 企业微信支持类型
|
// 企业微信支持类型
|
||||||
WETETALK_TEXT("text"),
|
WE_TALK_TEXT("text"),
|
||||||
|
|
||||||
WETETALK_MARKDOWN("markdown");
|
WE_TALK_MARKDOWN("markdown"),
|
||||||
|
WE_TALK_NEWS("news");
|
||||||
//暂未支持
|
//暂未支持
|
||||||
// WETETALK_IMAGE("image"),
|
// WE_TALK_IMAGE("image"),
|
||||||
// WETETALK_NEWS("news"),
|
// WE_TALK_FILE("file"),
|
||||||
// WETETALK_FILE("file"),
|
// WE_TALK_VOICE("voice"),
|
||||||
// WETETALK_VOICE("voice"),
|
// WE_TALK_TEMPLATE_CARD("template_card");
|
||||||
// WETETALK_TEMPLATE_CARD("template_card");
|
|
||||||
|
|
||||||
MessageType(String name) {
|
MessageType(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|||||||
@ -6,15 +6,15 @@ public enum OaType {
|
|||||||
/**
|
/**
|
||||||
* 钉钉
|
* 钉钉
|
||||||
*/
|
*/
|
||||||
DINGTALK("dingding", "https://oapi.dingtalk.com/robot/send?access_token=", true),
|
DING_TALK("ding_ding", "https://oapi.dingtalk.com/robot/send?access_token=", true),
|
||||||
/**
|
/**
|
||||||
* 微信
|
* 微信
|
||||||
*/
|
*/
|
||||||
WETALK("wetalk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true),
|
WE_TALK("we_talk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true),
|
||||||
/**
|
/**
|
||||||
* 飞书
|
* 飞书
|
||||||
*/
|
*/
|
||||||
BYTETALK("feishu", "https://open.feishu.cn/open-apis/bot/v2/hook/", true),
|
BYTE_TALK("byte_talk", "https://open.feishu.cn/open-apis/bot/v2/hook/", true),
|
||||||
;
|
;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@ -9,10 +9,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
|
|||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class ByteTalkConfig extends OaBaseConfig {
|
public class ByteTalkConfig extends OaBaseConfig {
|
||||||
|
|
||||||
private final String requestUrl = OaType.BYTETALK.getUrl();
|
private final String requestUrl = OaType.BYTE_TALK.getUrl();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaType.BYTETALK.getType();
|
return OaType.BYTE_TALK.getType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,7 +25,7 @@ public class ByteTalkFactory extends OaAbstractProviderFactory<ByteTalkOaImpl, B
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaContent.BYTETALK;
|
return OaContent.BYTE_TALK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.OaType.BYTETALK;
|
import static org.dromara.oa.comm.enums.OaType.BYTE_TALK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dongfeng
|
* @author dongfeng
|
||||||
@ -33,7 +33,7 @@ public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaType.BYTETALK.getType();
|
return OaType.BYTE_TALK.getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -45,7 +45,7 @@ public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
|
|||||||
StringBuilder webhook = new StringBuilder();
|
StringBuilder webhook = new StringBuilder();
|
||||||
JSONObject message = null;
|
JSONObject message = null;
|
||||||
ByteTalkConfig config = getConfig();
|
ByteTalkConfig config = getConfig();
|
||||||
webhook.append(BYTETALK.getUrl());
|
webhook.append(BYTE_TALK.getUrl());
|
||||||
webhook.append(config.getTokenId());
|
webhook.append(config.getTokenId());
|
||||||
long now = System.currentTimeMillis() / 1000;
|
long now = System.currentTimeMillis() / 1000;
|
||||||
String sign = ByteTalkBuilder.byteTalkSign(config.getSign(), now);
|
String sign = ByteTalkBuilder.byteTalkSign(config.getSign(), now);
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.MessageType.BYTETALK_TEXT;
|
import static org.dromara.oa.comm.enums.MessageType.BYTE_TALK_TEXT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 飞书通知签名和信息构建
|
* 飞书通知签名和信息构建
|
||||||
@ -35,7 +35,7 @@ public class ByteTalkBuilder {
|
|||||||
public static JSONObject createByteTalkMessage(Request request, MessageType messageType, String sign, Long timestamp) {
|
public static JSONObject createByteTalkMessage(Request request, MessageType messageType, String sign, Long timestamp) {
|
||||||
JSONObject message = new JSONObject();
|
JSONObject message = new JSONObject();
|
||||||
List<String> userIdList = request.getUserIdList();
|
List<String> userIdList = request.getUserIdList();
|
||||||
if (messageType == BYTETALK_TEXT) {
|
if (messageType == BYTE_TALK_TEXT) {
|
||||||
message.set("msg_type", "text");
|
message.set("msg_type", "text");
|
||||||
message.set("timestamp", timestamp);
|
message.set("timestamp", timestamp);
|
||||||
message.set("sign", sign);
|
message.set("sign", sign);
|
||||||
|
|||||||
@ -13,10 +13,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class DingTalkConfig extends OaBaseConfig {
|
public class DingTalkConfig extends OaBaseConfig {
|
||||||
private final String requestUrl = OaType.DINGTALK.getUrl();
|
private final String requestUrl = OaType.DING_TALK.getUrl();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaType.DINGTALK.getType();
|
return OaType.DING_TALK.getType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,7 +27,7 @@ public class DingTalkFactory extends OaAbstractProviderFactory<DingTalkOaImpl, D
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaContent.DINGTALK;
|
return OaContent.DING_TALK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import java.util.Map;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.OaType.DINGTALK;
|
import static org.dromara.oa.comm.enums.OaType.DING_TALK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dongfeng
|
* @author dongfeng
|
||||||
@ -54,7 +54,7 @@ public class DingTalkOaImpl extends AbstractOaBlend<DingTalkConfig> {
|
|||||||
StringBuilder webhook = new StringBuilder();
|
StringBuilder webhook = new StringBuilder();
|
||||||
JSONObject message = null;
|
JSONObject message = null;
|
||||||
DingTalkConfig config = getConfig();
|
DingTalkConfig config = getConfig();
|
||||||
webhook.append(DINGTALK.getUrl());
|
webhook.append(DING_TALK.getUrl());
|
||||||
webhook.append(config.getTokenId());
|
webhook.append(config.getTokenId());
|
||||||
String sign = config.getSign();
|
String sign = config.getSign();
|
||||||
if (!Objects.isNull(sign)) {
|
if (!Objects.isNull(sign)) {
|
||||||
|
|||||||
@ -15,9 +15,9 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK;
|
import static org.dromara.oa.comm.enums.MessageType.DING_TALK_LINK;
|
||||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_MARKDOWN;
|
import static org.dromara.oa.comm.enums.MessageType.DING_TALK_MARKDOWN;
|
||||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_TEXT;
|
import static org.dromara.oa.comm.enums.MessageType.DING_TALK_TEXT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 钉钉通知签名和信息构建
|
* 钉钉通知签名和信息构建
|
||||||
@ -46,18 +46,18 @@ public class DingTalkBuilder {
|
|||||||
|
|
||||||
|
|
||||||
JSONObject message = new JSONObject();
|
JSONObject message = new JSONObject();
|
||||||
if (messageType == DINGTALK_TEXT) {
|
if (messageType == DING_TALK_TEXT) {
|
||||||
message.set("msgtype", "text");
|
message.set("msgtype", "text");
|
||||||
JSONObject text = new JSONObject();
|
JSONObject text = new JSONObject();
|
||||||
text.set("content", request.getContent());
|
text.set("content", request.getContent());
|
||||||
message.set("text", text);
|
message.set("text", text);
|
||||||
} else if (messageType == DINGTALK_MARKDOWN) {
|
} else if (messageType == DING_TALK_MARKDOWN) {
|
||||||
message.set("msgtype", "markdown");
|
message.set("msgtype", "markdown");
|
||||||
JSONObject markdown = new JSONObject();
|
JSONObject markdown = new JSONObject();
|
||||||
markdown.set("text", request.getContent());
|
markdown.set("text", request.getContent());
|
||||||
markdown.set("title", request.getTitle());
|
markdown.set("title", request.getTitle());
|
||||||
message.set("markdown", markdown);
|
message.set("markdown", markdown);
|
||||||
} else if (messageType == DINGTALK_LINK) {
|
} else if (messageType == DING_TALK_LINK) {
|
||||||
message.set("msgtype", "link");
|
message.set("msgtype", "link");
|
||||||
JSONObject link = new JSONObject();
|
JSONObject link = new JSONObject();
|
||||||
link.set("text", request.getContent());
|
link.set("text", request.getContent());
|
||||||
|
|||||||
@ -9,10 +9,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
|
|||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class WeTalkConfig extends OaBaseConfig {
|
public class WeTalkConfig extends OaBaseConfig {
|
||||||
|
|
||||||
private final String requestUrl = OaType.WETALK.getUrl();
|
private final String requestUrl = OaType.WE_TALK.getUrl();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaType.WETALK.getType();
|
return OaType.WE_TALK.getType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,7 +25,7 @@ public class WeTalkFactory extends OaAbstractProviderFactory<WeTalkOaImpl, WeTal
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaContent.WETALK;
|
return OaContent.WE_TALK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -14,9 +14,8 @@ import org.dromara.oa.core.weTalk.utils.WeTalkBuilder;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.OaType.WETALK;
|
import static org.dromara.oa.comm.enums.OaType.WE_TALK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dongfeng
|
* @author dongfeng
|
||||||
@ -33,19 +32,17 @@ public class WeTalkOaImpl extends AbstractOaBlend<WeTalkConfig> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSupplier() {
|
public String getSupplier() {
|
||||||
return OaType.WETALK.getType();
|
return OaType.WE_TALK.getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Response sender(Request request, MessageType messageType) {
|
public Response sender(Request request, MessageType messageType) {
|
||||||
|
|
||||||
if (Objects.isNull(request.getContent())) {
|
|
||||||
throw new OaException("消息体content不能为空");
|
|
||||||
}
|
|
||||||
StringBuilder webhook = new StringBuilder();
|
StringBuilder webhook = new StringBuilder();
|
||||||
JSONObject message = null;
|
JSONObject message = null;
|
||||||
WeTalkConfig config = getConfig();
|
WeTalkConfig config = getConfig();
|
||||||
webhook.append(WETALK.getUrl());
|
webhook.append(WE_TALK.getUrl());
|
||||||
webhook.append(config.getTokenId());
|
webhook.append(config.getTokenId());
|
||||||
message = WeTalkBuilder.createWeTalkMessage(request, messageType);
|
message = WeTalkBuilder.createWeTalkMessage(request, messageType);
|
||||||
String post;
|
String post;
|
||||||
|
|||||||
@ -5,13 +5,16 @@ import cn.hutool.json.JSONArray;
|
|||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.oa.comm.entity.Request;
|
import org.dromara.oa.comm.entity.Request;
|
||||||
|
import org.dromara.oa.comm.entity.WeTalkRequestArticle;
|
||||||
import org.dromara.oa.comm.enums.MessageType;
|
import org.dromara.oa.comm.enums.MessageType;
|
||||||
|
import org.dromara.oa.comm.errors.OaException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.dromara.oa.comm.enums.MessageType.WETETALK_MARKDOWN;
|
import static org.dromara.oa.comm.enums.MessageType.WE_TALK_MARKDOWN;
|
||||||
import static org.dromara.oa.comm.enums.MessageType.WETETALK_TEXT;
|
import static org.dromara.oa.comm.enums.MessageType.WE_TALK_NEWS;
|
||||||
|
import static org.dromara.oa.comm.enums.MessageType.WE_TALK_TEXT;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +33,10 @@ public class WeTalkBuilder {
|
|||||||
List<String> phoneList = request.getPhoneList();
|
List<String> phoneList = request.getPhoneList();
|
||||||
StringBuilder content = new StringBuilder();
|
StringBuilder content = new StringBuilder();
|
||||||
Boolean isNoticeAll = request.getIsNoticeAll();
|
Boolean isNoticeAll = request.getIsNoticeAll();
|
||||||
if (messageType == WETETALK_TEXT) {
|
if (messageType == WE_TALK_TEXT) {
|
||||||
|
if (Objects.isNull(request.getContent())) {
|
||||||
|
throw new OaException("消息体content不能为空");
|
||||||
|
}
|
||||||
message.set("msgtype", "text");
|
message.set("msgtype", "text");
|
||||||
JSONObject text = new JSONObject();
|
JSONObject text = new JSONObject();
|
||||||
text.set("content", request.getContent());
|
text.set("content", request.getContent());
|
||||||
@ -58,7 +64,10 @@ public class WeTalkBuilder {
|
|||||||
text.set("mentioned_mobile_list",phoneArray);
|
text.set("mentioned_mobile_list",phoneArray);
|
||||||
}
|
}
|
||||||
message.set("text", text);
|
message.set("text", text);
|
||||||
} else if (messageType == WETETALK_MARKDOWN) {
|
} else if (messageType == WE_TALK_MARKDOWN) {
|
||||||
|
if (Objects.isNull(request.getContent())) {
|
||||||
|
throw new OaException("消息体content不能为空");
|
||||||
|
}
|
||||||
message.set("msgtype", "markdown");
|
message.set("msgtype", "markdown");
|
||||||
if(!Objects.isNull(userIdList)){
|
if(!Objects.isNull(userIdList)){
|
||||||
userIdList.forEach(l -> content.append("<@").append(l).append(">"));
|
userIdList.forEach(l -> content.append("<@").append(l).append(">"));
|
||||||
@ -69,8 +78,25 @@ public class WeTalkBuilder {
|
|||||||
markdown.set("content", content );
|
markdown.set("content", content );
|
||||||
markdown.set("title", request.getTitle());
|
markdown.set("title", request.getTitle());
|
||||||
message.set("markdown", markdown);
|
message.set("markdown", markdown);
|
||||||
|
} else if (messageType == WE_TALK_NEWS) {
|
||||||
|
message.set("msgtype", "news");
|
||||||
|
JSONObject news = new JSONObject();
|
||||||
|
JSONArray articles = new JSONArray();
|
||||||
|
List<WeTalkRequestArticle> articleList = request.getArticleList();
|
||||||
|
if(!articleList.isEmpty()){
|
||||||
|
articleList.forEach(article -> {
|
||||||
|
JSONObject articleJson = new JSONObject();
|
||||||
|
articleJson.set("title", article.getTitle());
|
||||||
|
articleJson.set("description", article.getDescription());
|
||||||
|
articleJson.set("url", article.getUrl());
|
||||||
|
articleJson.set("picurl", article.getPicUrl());
|
||||||
|
articles.add(articleJson);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
news.set("articles", articles );
|
||||||
|
message.set("news", news);
|
||||||
} else {
|
} else {
|
||||||
log.error("输入的消息格式不对,message:"+messageType+"应该使用WETETALK前缀的消息类型");
|
log.error("输入的消息格式不对,message:"+messageType+"应该使用WE_TALK前缀的消息类型");
|
||||||
}
|
}
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user