From 42133da8985c02520b4884488a738665c9a3f31d Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Tue, 12 Dec 2023 18:28:20 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20WeChatMsgForwarderCont?= =?UTF-8?q?roller.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WeChatMsgForwarderController.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/controller/WeChatMsgForwarderController.java diff --git a/src/main/java/com/kimgo/wepush/controller/WeChatMsgForwarderController.java b/src/main/java/com/kimgo/wepush/controller/WeChatMsgForwarderController.java new file mode 100644 index 0000000..b16544c --- /dev/null +++ b/src/main/java/com/kimgo/wepush/controller/WeChatMsgForwarderController.java @@ -0,0 +1,39 @@ +package com.kimgo.wepush.controller; + +import com.kimgo.wepush.model.WeChatMsg; +import com.kimgo.wepush.response.ServerResponseEntity; +import com.kimgo.wepush.service.HandleWeChatMsgService; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@Validated +@RequestMapping(value = "/api",method = RequestMethod.POST) +public class WeChatMsgForwarderController { + + private final Logger logger = LoggerFactory.getLogger(WeChatMsgForwarderController.class); + + private final HandleWeChatMsgService handleWeChatMsgService; + + public WeChatMsgForwarderController(HandleWeChatMsgService handleWeChatMsgService) { + this.handleWeChatMsgService = handleWeChatMsgService; + } + + @PostMapping("/wechat") + public ServerResponseEntity receiveMsg(@RequestHeader("accessToken") String accessToken, + @RequestBody @Valid WeChatMsg weChatMsg){ + logger.info("CallInfoO: {}",weChatMsg.toString()); + if(accessToken == null){ + logger.warn("Access token is missing or empty"); + return ServerResponseEntity.fail("accessToken cannot be empty."); + } + if (weChatMsg.isInvalid()) { + logger.debug("CallInfo has invalid fields."); + return ServerResponseEntity.fail("json body value error."); + } + return handleWeChatMsgService.handleMsg(accessToken,weChatMsg); + } +} From 82356f0fb4550fbebb4bce315b0b90d76875f276 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Tue, 12 Dec 2023 18:28:23 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20WeChatMsg.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/model/WeChatMsg.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/model/WeChatMsg.java diff --git a/src/main/java/com/kimgo/wepush/model/WeChatMsg.java b/src/main/java/com/kimgo/wepush/model/WeChatMsg.java new file mode 100644 index 0000000..b0668e0 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/WeChatMsg.java @@ -0,0 +1,22 @@ +package com.kimgo.wepush.model; + +import lombok.Data; + +@Data +public class WeChatMsg { + private String packageName; + private String appName; + private String title; + private String sender; + private String message; + private String currentTime; + public boolean isInvalid() { + return !isStringValid(packageName) || !isStringValid(appName) + || !isStringValid(title) || !isStringValid(sender) + || !isStringValid(message) || !isStringValid(currentTime); + } + + private boolean isStringValid(String value) { + return value != null && !value.isEmpty() && !"null".equals(value); + } +} From e9272c2b44c4827d068414f02d3a09f4624b1b1d Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Tue, 12 Dec 2023 18:28:26 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CallService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/service/CallService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/CallService.java b/src/main/java/com/kimgo/wepush/service/CallService.java index 47f1900..8c1a483 100644 --- a/src/main/java/com/kimgo/wepush/service/CallService.java +++ b/src/main/java/com/kimgo/wepush/service/CallService.java @@ -20,8 +20,6 @@ import java.io.IOException; @Service public class CallService { private final Logger logger = LoggerFactory.getLogger(CallService.class); - - private ServerResponseEntity serverResponseEntity; @Autowired private QyWeChatURLService qyWeChatURLService; @Autowired @@ -62,7 +60,7 @@ public class CallService { // 将TextCard对象设置到TextCardMessage中 textCardMessage.setTextcard(textCard); - logger.info("TextCardMessage: {}", textCardMessage.toString()); + logger.info("TextCardMessage: {}", textCardMessage); return textCardMessage; } @@ -74,7 +72,7 @@ public class CallService { TextCardMessage textCardMessage = setTextCardMessage(phoneNumber,callTime); // 使用Jackson进行序列化 ObjectMapper objectMapper = new ObjectMapper(); - String jsonBody = null; + String jsonBody; try { jsonBody = objectMapper.writeValueAsString(textCardMessage); logger.info("jsonBody: {}",jsonBody); From 4b7b719563453ad40b711f8adc598ec15617ee2a Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Tue, 12 Dec 2023 18:28:29 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20HandleWeChatMsgService?= =?UTF-8?q?.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HandleWeChatMsgService.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/service/HandleWeChatMsgService.java diff --git a/src/main/java/com/kimgo/wepush/service/HandleWeChatMsgService.java b/src/main/java/com/kimgo/wepush/service/HandleWeChatMsgService.java new file mode 100644 index 0000000..6002d57 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/HandleWeChatMsgService.java @@ -0,0 +1,107 @@ +package com.kimgo.wepush.service; + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kimgo.wepush.model.TextMessage; +import com.kimgo.wepush.model.WeChatMsg; +import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; +import com.kimgo.wepush.response.ServerResponseEntity; +import okhttp3.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +@Service +public class HandleWeChatMsgService { + private final TokenService tokenService; + private final ApiSettingService apiSettingService; + private final QyWeChatURLService qyWeChatURLService; + private final Logger logger = LoggerFactory.getLogger(HandleWeChatMsgService.class); + + public HandleWeChatMsgService(TokenService tokenService, ApiSettingService apiSettingService, QyWeChatURLService qyWeChatURLService) { + this.tokenService = tokenService; + this.apiSettingService = apiSettingService; + this.qyWeChatURLService = qyWeChatURLService; + } + + public ServerResponseEntity handleMsg(String accessToken, WeChatMsg weChatMsg){ + String correctAccessToken = tokenService.getApiAccessToken(); + logger.info("accessToken: {} correctAccessToken: {}",accessToken,correctAccessToken); + if (!correctAccessToken.equals(accessToken)){ + return ServerResponseEntity.fail("Invalid accessToken"); + } + String qyAccessToken = tokenService.getAccessToken(); + QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = requestWithOkhttp(qyAccessToken,weChatMsg); + if (qyWeChatSendMessageApiResponse != null){ + return ServerResponseEntity.success(qyWeChatSendMessageApiResponse.getMsgid()); + } + return ServerResponseEntity.fail("request qyWeChat error,please check server error log."); + } + + public TextMessage setTextMessage(WeChatMsg weChatMsg){ + TextMessage textMessage = new TextMessage(); + textMessage.setTouser(apiSettingService.getApiSetting().getTouser()); + textMessage.setMsgtype("text"); + textMessage.setAgentid(apiSettingService.getApiSetting().getAgentid()); + textMessage.setEnable_duplicate_check(apiSettingService.getApiSetting().getEnableDuplicateCheck()); + textMessage.setDuplicate_check_interval(apiSettingService.getApiSetting().getDuplicateCheckInterval()); + TextMessage.Text text = new TextMessage.Text(); + text.setContent("你收到一条微信通知\n 接受时间: " +weChatMsg.getCurrentTime() + + "\nsender: " + weChatMsg.getSender() + + "\ntitle: "+ weChatMsg.getTitle() + + "\n内容: \n"+ weChatMsg.getMessage()); + textMessage.setText(text); + logger.info("TextMessage: {}", textMessage); + return textMessage; + } + + private Request bulidRequest(String accessToken, T object){ + String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; + // 使用Jackson进行序列化 + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody; + try { + jsonBody = objectMapper.writeValueAsString(object); + logger.info("jsonBody: {}",jsonBody); + } catch (JsonProcessingException e) { + logger.error("JSON processing error", e); + return null; + } + // 构建请求体 + RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody); + Request request = new Request.Builder().url(url).post(body).build(); + return request; + } + + public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken, WeChatMsg weChatMsg){ + OkHttpClient client = new OkHttpClient(); + TextMessage textMessage = setTextMessage(weChatMsg); + Request request = bulidRequest(accessToken,textMessage); + try (Response response = client.newCall(request).execute()) { + String responseBody = response.body().string(); + logger.info("Response: {}", responseBody); + + ObjectMapper objectMapper1 = new ObjectMapper(); + QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class); + + if (apiResponse.getErrcode() == 0) { + return apiResponse; + } else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) { + logger.info("Access token expired. Refreshing token..."); + tokenService.setAccessToken(); // 一个方法来刷新accessToken + String newAccessToken = tokenService.getAccessToken(); + return requestWithOkhttp(newAccessToken, weChatMsg); + } else { + // 处理其他错误情况 + logger.error("Error: {}", apiResponse.getErrmsg()); + return apiResponse; + } + } catch (IOException e) { + logger.error("OkHttp request error", e); + return null; + } + } +} From e1db48006728f1c09c32c6e379dab623c1db071a Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Tue, 12 Dec 2023 18:28:31 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20WeChatMsgTest.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/model/WeChatMsgTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/test/java/com/kimgo/wepush/model/WeChatMsgTest.java diff --git a/src/test/java/com/kimgo/wepush/model/WeChatMsgTest.java b/src/test/java/com/kimgo/wepush/model/WeChatMsgTest.java new file mode 100644 index 0000000..07cce6d --- /dev/null +++ b/src/test/java/com/kimgo/wepush/model/WeChatMsgTest.java @@ -0,0 +1,55 @@ +package com.kimgo.wepush.model; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class WeChatMsgTest { + + @Test + void isInvalid_AllFieldsValid() { + WeChatMsg weChatMsg = new WeChatMsg(); + weChatMsg.setPackageName("com.example.package"); + weChatMsg.setAppName("Example App"); + weChatMsg.setTitle("Example Title"); + weChatMsg.setSender("Example Sender"); + weChatMsg.setMessage("Example Message"); + + assertFalse(weChatMsg.isInvalid(), "WeChatMsg should be valid when all fields are valid."); + } + + @Test + void isInvalid_OneFieldIsNull() { + WeChatMsg weChatMsg = new WeChatMsg(); + weChatMsg.setPackageName(null); // 设置一个字段为 null + weChatMsg.setAppName("Example App"); + weChatMsg.setTitle("Example Title"); + weChatMsg.setSender("Example Sender"); + weChatMsg.setMessage("Example Message"); + + assertTrue(weChatMsg.isInvalid(), "WeChatMsg should be invalid if any field is null."); + } + + @Test + void isInvalid_OneFieldIsEmpty() { + WeChatMsg weChatMsg = new WeChatMsg(); + weChatMsg.setPackageName(""); // 设置一个字段为空字符串 + weChatMsg.setAppName("Example App"); + weChatMsg.setTitle("Example Title"); + weChatMsg.setSender("Example Sender"); + weChatMsg.setMessage("Example Message"); + + assertTrue(weChatMsg.isInvalid(), "WeChatMsg should be invalid if any field is an empty string."); + } + + @Test + void isInvalid_OneFieldIsStringNull() { + WeChatMsg weChatMsg = new WeChatMsg(); + weChatMsg.setPackageName("null"); // 设置一个字段为字面字符串 "null" + weChatMsg.setAppName("Example App"); + weChatMsg.setTitle("Example Title"); + weChatMsg.setSender("Example Sender"); + weChatMsg.setMessage("Example Message"); + + assertTrue(weChatMsg.isInvalid(), "WeChatMsg should be invalid if any field is the literal string \"null\"."); + } +}