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; + } + } +}