diff --git a/src/main/java/com/kimgo/wepush/common/JsonConverter.java b/src/main/java/com/kimgo/wepush/common/JsonConverter.java new file mode 100644 index 0000000..0e6ec4f --- /dev/null +++ b/src/main/java/com/kimgo/wepush/common/JsonConverter.java @@ -0,0 +1,22 @@ +package com.kimgo.wepush.common; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonConverter { + + private final ObjectMapper objectMapper; + + public JsonConverter () { + this.objectMapper = new ObjectMapper(); + } + + // 将对象序列化为 JSON 字符串 + public String serialize(T object) throws JsonProcessingException { + return objectMapper.writeValueAsString(object); + } + // 将 JSON 字符串反序列化为对象 + public T deserialize(String json, Class clazz) throws JsonProcessingException { + return objectMapper.readValue(json, clazz); + } +} diff --git a/src/main/java/com/kimgo/wepush/request/Request.java b/src/main/java/com/kimgo/wepush/request/Request.java deleted file mode 100644 index d99c25d..0000000 --- a/src/main/java/com/kimgo/wepush/request/Request.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.kimgo.wepush.request; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.RequestBody; -import okhttp3.Response; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.io.IOException; - -public class Request { - private final Logger logger = LoggerFactory.getLogger(Request.class); - - public QyWeChatSendMessageApiResponse okhttpRequest(String url,String accessToken,T object){ - OkHttpClient client = new OkHttpClient(); - - // 使用Jackson进行序列化 - ObjectMapper objectMapper = new ObjectMapper(); - String jsonBody = null; - 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); - okhttp3.Request request = new okhttp3.Request.Builder().url(url).post(body).build(); - try (Response response = client.newCall(request).execute()) { - String responseBody = response.body().string(); - logger.info("request sendMessage api ResponseBody: {}", responseBody); - - ObjectMapper objectMapper1 = new ObjectMapper(); - QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class); - - if (apiResponse.getErrcode() == 0) { - logger.debug("Request qyWeChat Success."); - return apiResponse; - } else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) { - logger.info("Access token expired. Refreshing token..."); - // 一个方法来刷新accessToken - return apiResponse; - } else { - // 处理其他错误情况 - logger.error("Error: {}", apiResponse.getErrmsg()); - return null; - } - } catch (IOException e) { - logger.error("OkHttp request error", e); - return null; - } - } -} diff --git a/src/main/java/com/kimgo/wepush/request/SendQyWeChatMsgRequest.java b/src/main/java/com/kimgo/wepush/request/SendQyWeChatMsgRequest.java new file mode 100644 index 0000000..9b07faf --- /dev/null +++ b/src/main/java/com/kimgo/wepush/request/SendQyWeChatMsgRequest.java @@ -0,0 +1,78 @@ +package com.kimgo.wepush.request; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kimgo.wepush.common.JsonConverter; +import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; +import com.kimgo.wepush.service.TokenService; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +public class SendQyWeChatMsgRequest { + private final Logger logger = LoggerFactory.getLogger(SendQyWeChatMsgRequest.class); + private final OkHttpClient client = new OkHttpClient(); + private final TokenService tokenService; + private final JsonConverter jsonConverter = new JsonConverter<>(); + + public SendQyWeChatMsgRequest(TokenService tokenService) { + this.tokenService = tokenService; + } + + public QyWeChatSendMessageApiResponse okhttpRequest(String baseurl, String accessToken, T object) { + int retryCount = 0; + final int maxRetries = 2; + + while (retryCount <= maxRetries) { + String url = baseurl + "?access_token=" + accessToken; + // 使用Jackson进行序列化 + String jsonBody; + try { + jsonBody = jsonConverter.serialize(object); + } catch (JsonProcessingException e) { + return new QyWeChatSendMessageApiResponse(-1, "json serialization exception"); + } + // 构建请求体 + MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); + RequestBody body = RequestBody.create(jsonBody, mediaType); + + okhttp3.Request request = new okhttp3.Request.Builder().url(url).post(body).build(); + try (Response response = client.newCall(request).execute()) { + String responseBody = null; + if (response.body() != null) { + responseBody = response.body().string(); + } + logger.info("request sendMessage api ResponseBody: {}", responseBody); + + ObjectMapper objectMapper1 = new ObjectMapper(); + QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class); + + if (apiResponse.getErrcode() == 0) { + logger.debug("Request qyWeChat Success."); + return apiResponse; + } else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) { + logger.info("Access token expired. Refreshing token..."); + // 刷新accessToken + tokenService.setAccessToken(); + accessToken = tokenService.getAccessToken(); + retryCount++; + } else { + // 处理成功或其他错误情况 + return apiResponse; + } + } catch (IOException e) { + logger.error("OkHttp request error", e); + if (retryCount >= maxRetries) { + return new QyWeChatSendMessageApiResponse(-1,"the maximum number of attempts exceeded"); + } + retryCount++; + } + } + return new QyWeChatSendMessageApiResponse(-1,"request error."); + } +} diff --git a/src/main/java/com/kimgo/wepush/response/QyWeChatSendMessageApiResponse.java b/src/main/java/com/kimgo/wepush/response/QyWeChatSendMessageApiResponse.java index f6bf741..5f4dad9 100644 --- a/src/main/java/com/kimgo/wepush/response/QyWeChatSendMessageApiResponse.java +++ b/src/main/java/com/kimgo/wepush/response/QyWeChatSendMessageApiResponse.java @@ -7,4 +7,9 @@ public class QyWeChatSendMessageApiResponse { private int errcode; private String errmsg; private String msgid; + + public QyWeChatSendMessageApiResponse(int errcode, String errmsg) { + this.errcode = errcode; + this.errmsg = errmsg; + } } \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/service/MonitorService.java b/src/main/java/com/kimgo/wepush/service/MonitorService.java index 1a0ff70..1b42196 100644 --- a/src/main/java/com/kimgo/wepush/service/MonitorService.java +++ b/src/main/java/com/kimgo/wepush/service/MonitorService.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.kimgo.wepush.mapper.DeviceInfoDAOMapper; import com.kimgo.wepush.model.DeviceInfoDAO; import com.kimgo.wepush.model.TextCardMessage; -import com.kimgo.wepush.request.Request; +import com.kimgo.wepush.request.SendQyWeChatMsgRequest; import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,10 +81,11 @@ public class MonitorService { private void sendNotification(DeviceInfoDAO deviceInfoDAO){ - Request request = new Request(); + SendQyWeChatMsgRequest sendQyWeChatMsgRequest = new SendQyWeChatMsgRequest(tokenService); String accessToken = tokenService.getAccessToken(); - String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; - QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = request.okhttpRequest(url,accessToken,setTextCardMessage(deviceInfoDAO)); + String url = qyWeChatURLService.getSendTextCardMessageUrl(); + QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = sendQyWeChatMsgRequest.okhttpRequest(url, + accessToken,setTextCardMessage(deviceInfoDAO)); if (qyWeChatSendMessageApiResponse ==null){ logger.info("Send Notification Fail"); }