From 9b32c2fd75fe8cf32cde93a0af7d3de569d388d2 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 6 Jan 2025 18:44:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BE=AE=E4=BF=A1=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E9=80=9A=E7=9F=A5=EF=BC=8C=E8=B0=83=E6=95=B4=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/CustomExceptionHandle.java | 5 +- .../com/ycwl/basic/notify/NotifyFactory.java | 8 +++ .../basic/notify/adapters/INotifyAdapter.java | 2 +- .../adapters/ServerChanNotifyAdapter.java | 2 +- .../notify/adapters/WxMpSrvNotifyAdapter.java | 59 +++++++++++++++++++ .../basic/notify/entity/NotifyContent.java | 9 +++ .../basic/notify/entity/ServerChanConfig.java | 1 - .../basic/notify/entity/WxMpSrvConfig.java | 15 +++++ .../ycwl/basic/notify/enums/NotifyType.java | 1 + 9 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/notify/adapters/WxMpSrvNotifyAdapter.java create mode 100644 src/main/java/com/ycwl/basic/notify/entity/WxMpSrvConfig.java diff --git a/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java b/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java index 49f2d0d..91f4f58 100644 --- a/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java +++ b/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java @@ -62,7 +62,10 @@ public class CustomExceptionHandle { @ExceptionHandler(value = Exception.class) public ApiResponse handle(Exception e) { LOGGER.error("系统异常 -> {}", e.getMessage(), e); - NotifyFactory.to().send(new NotifyContent("帧途后台报错了!", e.getMessage() + "\n\n" + Arrays.toString(e.getStackTrace()))); + NotifyFactory.to().sendTo( + new NotifyContent("帧途后台报错了!", e.getMessage() + "\n\n" + Arrays.toString(e.getStackTrace())), + "default_user" + ); return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR); } diff --git a/src/main/java/com/ycwl/basic/notify/NotifyFactory.java b/src/main/java/com/ycwl/basic/notify/NotifyFactory.java index 74a7885..6dd3210 100644 --- a/src/main/java/com/ycwl/basic/notify/NotifyFactory.java +++ b/src/main/java/com/ycwl/basic/notify/NotifyFactory.java @@ -2,6 +2,7 @@ package com.ycwl.basic.notify; import com.ycwl.basic.notify.adapters.INotifyAdapter; import com.ycwl.basic.notify.adapters.ServerChanNotifyAdapter; +import com.ycwl.basic.notify.adapters.WxMpSrvNotifyAdapter; import com.ycwl.basic.notify.enums.NotifyType; import java.util.HashMap; @@ -12,11 +13,18 @@ public class NotifyFactory { switch (type) { case SERVER_CHAN: return new ServerChanNotifyAdapter(); + case WX_MP_SRV: + return new WxMpSrvNotifyAdapter(); default: throw new RuntimeException("不支持的通知类型"); } } + public static INotifyAdapter get(NotifyType type, Map config) { + INotifyAdapter adapter = get(type); + adapter.loadConfig(config); + return adapter; + } protected static Map namedNotifier = new HashMap<>(); protected static INotifyAdapter defaultNotifier = null; diff --git a/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java b/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java index 42e447f..93bad9b 100644 --- a/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java +++ b/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java @@ -7,5 +7,5 @@ import java.util.Map; public interface INotifyAdapter { void loadConfig(Map _config); - void send(NotifyContent notifyContent); + void sendTo(NotifyContent notifyContent, String to); } diff --git a/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java b/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java index 764378d..2e4af1e 100644 --- a/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java +++ b/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java @@ -21,7 +21,7 @@ public class ServerChanNotifyAdapter implements INotifyAdapter { } @Override - public void send(NotifyContent notifyContent) { + public void sendTo(NotifyContent notifyContent, String to) { scSend(notifyContent.getTitle(), notifyContent.getContent(), config.getKey()); } diff --git a/src/main/java/com/ycwl/basic/notify/adapters/WxMpSrvNotifyAdapter.java b/src/main/java/com/ycwl/basic/notify/adapters/WxMpSrvNotifyAdapter.java new file mode 100644 index 0000000..89a2494 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/adapters/WxMpSrvNotifyAdapter.java @@ -0,0 +1,59 @@ +package com.ycwl.basic.notify.adapters; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.ycwl.basic.notify.entity.NotifyContent; +import com.ycwl.basic.notify.entity.WxMpSrvConfig; + +import java.util.Date; +import java.util.Map; + +public class WxMpSrvNotifyAdapter implements INotifyAdapter{ + private WxMpSrvConfig config; + + @Override + public void loadConfig(Map _config) { + WxMpSrvConfig config = new WxMpSrvConfig(); + config.setAppId(_config.get("appId")); + config.setAppSecret(_config.get("appSecret")); + if (_config.containsKey("state")) { + config.setState(_config.get("state")); + } + config.checkEverythingOK(); + this.config = config; + } + + @Override + public void sendTo(NotifyContent notifyContent, String openId) { + Map params = notifyContent.getParams(); + params.put("touser", openId); + params.put("miniprogram_state", config.getState()); + sendServiceNotification(params); + } + + private static final String SEND_TEMPLATE_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s"; + + private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; + private String ACCESS_TOKEN = ""; + private Date expireTime = new Date(); + + private String getAccessToken() { + if (ACCESS_TOKEN != null && !ACCESS_TOKEN.isEmpty()) { + if (expireTime.getTime() > System.currentTimeMillis()) { + return ACCESS_TOKEN; + } + } + String url = String.format(ACCESS_TOKEN_URL, config.getAppId(), config.getAppSecret()); + String response = HttpUtil.get(url); + JSONObject jsonObject = JSONObject.parseObject(response); + ACCESS_TOKEN = jsonObject.getString("access_token"); + expireTime = new Date(System.currentTimeMillis() + jsonObject.getInteger("expires_in") * 1000); + return ACCESS_TOKEN; + } + + public void sendServiceNotification(Map params) { + String url = String.format(SEND_TEMPLATE_MESSAGE_URL, getAccessToken()); + String response = HttpUtil.post(url, JSONObject.toJSONString(params)); + System.out.println(response); + } +} diff --git a/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java b/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java index 2739048..d6527f8 100644 --- a/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java +++ b/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java @@ -4,10 +4,19 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.HashMap; +import java.util.Map; + @Data @NoArgsConstructor @AllArgsConstructor public class NotifyContent { private String title; private String content; + private Map params = new HashMap<>(); + + public NotifyContent(String title, String content) { + this.title = title; + this.content = content; + } } diff --git a/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java b/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java index 9fc5e57..7a2a91d 100644 --- a/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java +++ b/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java @@ -7,6 +7,5 @@ public class ServerChanConfig { private String key; public void checkEverythingOK() { - return; } } diff --git a/src/main/java/com/ycwl/basic/notify/entity/WxMpSrvConfig.java b/src/main/java/com/ycwl/basic/notify/entity/WxMpSrvConfig.java new file mode 100644 index 0000000..e2a95ca --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/entity/WxMpSrvConfig.java @@ -0,0 +1,15 @@ +package com.ycwl.basic.notify.entity; + +import lombok.Data; + +@Data +public class WxMpSrvConfig { + private String appId; + private String appSecret; + private String state = "formal"; + private String templateId; + + public void checkEverythingOK() { + + } +} diff --git a/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java b/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java index 799f3e8..b16b286 100644 --- a/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java +++ b/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java @@ -4,6 +4,7 @@ import lombok.Getter; @Getter public enum NotifyType { + WX_MP_SRV("WX_MP_SRV"), SERVER_CHAN("SERVER_CHAN"); private final String type;