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;