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.response.QyWeChatSendMessageApiResponse; import com.kimgo.wepush.model.SMSInfo; import com.kimgo.wepush.model.TextCardMessage; import com.kimgo.wepush.response.ServerResponseEntity; import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; @Service public class SMSService { private final Logger logger = LoggerFactory.getLogger(SMSService.class); @Autowired private ApiSettingService apiSettingService; @Autowired private TokenService tokenService; @Autowired private QyWeChatURLService qyWeChatURLService; public ServerResponseEntity getSMSInfo(String accessToken, SMSInfo smsInfo){ 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,smsInfo); if (qyWeChatSendMessageApiResponse != null){ return ServerResponseEntity.success(qyWeChatSendMessageApiResponse.getMsgid()); } return ServerResponseEntity.fail("request qyWeChat error,please check server error log."); } public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken,SMSInfo smsInfo){ OkHttpClient client = new OkHttpClient(); Request request = handleMessage(accessToken,smsInfo); 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, smsInfo); } else { // 处理其他错误情况 logger.error("Error: {}", apiResponse.getErrmsg()); return apiResponse; } } catch (IOException e) { logger.error("OkHttp request error", e); return null; } } public TextCardMessage setTextCardMessage(SMSInfo smsInfo) { TextCardMessage textCardMessage = new TextCardMessage(); textCardMessage.setTouser(apiSettingService.getApiSetting().getTouser()); textCardMessage.setMsgtype(apiSettingService.getApiSetting().getMsgtype()); textCardMessage.setAgentid(apiSettingService.getApiSetting().getAgentid()); textCardMessage.setEnable_duplicate_check(apiSettingService.getApiSetting().getEnableDuplicateCheck()); textCardMessage.setDuplicate_check_interval(apiSettingService.getApiSetting().getDuplicateCheckInterval()); TextCardMessage.TextCard textCard = new TextCardMessage.TextCard(); textCard.setTitle("新短信通知"); textCard.setDescription("
您有一条新短信
短信号码: " + smsInfo.getSmsNumber() + "
接受短信时间: " + smsInfo.getSmsAcceptanceTime() + "
" + smsInfo.getSmsContent()); textCard.setUrl("https://kimgo.cn"); // 将TextCard对象设置到TextCardMessage中 textCardMessage.setTextcard(textCard); logger.info("TextCardMessage: {}", textCardMessage.toString()); return textCardMessage; } public TextMessage setTextMessage(SMSInfo smsInfo){ 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短信号码: "+smsInfo.getSmsNumber() + "\n接受时间: " + smsInfo.getSmsAcceptanceTime() + "\n内容: \n"+ smsInfo.getSmsContent()); textMessage.setText(text); logger.info("TextMessage: {}", textMessage.toString()); return textMessage; } private Request bulidRequest(String accessToken,T object){ String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; // 使用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); Request request = new Request.Builder().url(url).post(body).build(); return request; } private Request handleMessage(String accessToken, SMSInfo smsInfo) { TextCardMessage textCardMessage = setTextCardMessage(smsInfo); int textCardMessageSize = checkMessageSize(textCardMessage.getTextcard().getDescription()); if (textCardMessageSize <= 512) { return bulidRequest(accessToken, textCardMessage); } else { TextMessage textMessage = setTextMessage(smsInfo); int textMessageSize = checkMessageSize(textMessage.getText().getContent()); if (textMessageSize <= 2048) { return bulidRequest(accessToken, textMessage); } else { TextCardMessage wrMsg = setWarningTextCardMessage(); return bulidRequest(accessToken, wrMsg); } } } public TextCardMessage setWarningTextCardMessage() { TextCardMessage textCardMessage = new TextCardMessage(); textCardMessage.setTouser(apiSettingService.getApiSetting().getTouser()); textCardMessage.setMsgtype(apiSettingService.getApiSetting().getMsgtype()); textCardMessage.setAgentid(apiSettingService.getApiSetting().getAgentid()); textCardMessage.setEnable_duplicate_check(apiSettingService.getApiSetting().getEnableDuplicateCheck()); textCardMessage.setDuplicate_check_interval(apiSettingService.getApiSetting().getDuplicateCheckInterval()); TextCardMessage.TextCard textCard = new TextCardMessage.TextCard(); textCard.setTitle("警告消息"); textCard.setDescription("
警告: 短信消息过长请查看手机。
"); textCard.setUrl("https://kimgo.cn"); // 将TextCard对象设置到TextCardMessage中 textCardMessage.setTextcard(textCard); logger.info("TextCardMessage: {}", textCardMessage.toString()); return textCardMessage; } public int checkMessageSize(String message){ byte[] messageBytes = message.getBytes(java.nio.charset.StandardCharsets.UTF_8); int size = messageBytes.length; logger.info("Message size in bytes: " + size); return size; } }