From 0e9014b90dbd2db6ad26dbd71e59cecf6af8dc20 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:05:44 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20TextMessage.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/model/TextMessage.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/model/TextMessage.java diff --git a/src/main/java/com/kimgo/wepush/model/TextMessage.java b/src/main/java/com/kimgo/wepush/model/TextMessage.java new file mode 100644 index 0000000..0b70d52 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/TextMessage.java @@ -0,0 +1,26 @@ +package com.kimgo.wepush.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class TextMessage { + private String touser; + private String toparty; + private String totag; + private String msgtype; + private int agentid; + private Text text; + private int safe; + private int enable_id_trans; + private int enable_duplicate_check; + private int duplicate_check_interval; + @Data + @NoArgsConstructor + public static class Text { + private String content; + + + } +} From 1baf697227c3ca0424631f727723613ea8938934 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:06:00 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20SMSServiceTest.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kimgo/wepush/service/SMSServiceTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/test/java/com/kimgo/wepush/service/SMSServiceTest.java diff --git a/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java b/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java new file mode 100644 index 0000000..f415d93 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java @@ -0,0 +1,48 @@ +package com.kimgo.wepush.service; + +import com.kimgo.wepush.model.SMSInfo; +import com.kimgo.wepush.response.ServerResponseEntity; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class SMSServiceTest { + private final Logger logger = LoggerFactory.getLogger(SMSServiceTest.class); + @Autowired + private SMSService smsService; + @Test + public void testMessageSize(){ + String message = "【话费剩余】\n" + + "您所在的家庭账户本月通信费87.90元,余额20.91元,其中本机本月累计消费87.90元(由家庭账户统一支付),家庭成员13541758298本月费用0.00元,家庭成员20935981572本月费用0.00元。新爱家58共享话费58.00元,当前剩余0.00元,\n" + + "【流量查询】\n" + + "国内通用流量共15.00GB,当前可使用14.95GB。回CXLL查明细。\n" + + "【套餐剩余】\n" + + "移动68套餐基本通话优惠分钟数余200分钟。\n" + + "发送“0000”到“10086”,订购业务清清楚楚,一键退订轻轻松松。\n" + + "【已开业务】回“1”\n" + + "【流量超市】回“2”\n" + + "【消费情况】回“3”\n" + + "【20元/月→4GB国内流量】回“4”\n" + + "【30元/月→10GB国内流量】回“5”\n" + + "【60元/月→30GB国内流量】回“6”\n" + + "【7天流量包】回“7”\n" + + "【19.9元/月→5GB国内流量+视频会员】回“8”\n" + + "【宽带专区】回“9”\n" + + "【在线客服】若您有话费/流量疑问、业务咨询/退订等其他需求可联系在线文字客服,点击官方认证通道: https://dx.10086.cn/Q_HZBg \n" + + "【为您推荐】尊敬的客户,您好!您有10元话费券待领取: http://dx.10086.cn/D/jEd1Jq ,点击查看话费使用详情: https://dx.10086.cn/38UvEQ 。。【中国移动】"; + + String accessToken = "gKGCDSgWV82XbU0H"; + SMSInfo smsInfo = new SMSInfo(); + smsInfo.setSmsContent(message); + smsInfo.setSmsNumber("11111"); + smsInfo.setSmsAcceptanceTime("11111"); + + ServerResponseEntity serverResponseEntity = smsService.getSMSInfo(accessToken,smsInfo); + logger.info(serverResponseEntity.toString()); + } +} \ No newline at end of file From 28b8588073faffec7177c91d421fd4d3776d9489 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:06:02 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20SMSService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/service/SMSService.java | 92 ++++++++++++++++--- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/SMSService.java b/src/main/java/com/kimgo/wepush/service/SMSService.java index 3820561..1c00d1a 100644 --- a/src/main/java/com/kimgo/wepush/service/SMSService.java +++ b/src/main/java/com/kimgo/wepush/service/SMSService.java @@ -2,6 +2,7 @@ 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; @@ -41,22 +42,8 @@ public class SMSService { public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken,SMSInfo smsInfo){ OkHttpClient client = new OkHttpClient(); - String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; - TextCardMessage textCardMessage = setTextCardMessage(smsInfo); - // 使用Jackson进行序列化 - ObjectMapper objectMapper = new ObjectMapper(); - String jsonBody = null; - try { - jsonBody = objectMapper.writeValueAsString(textCardMessage); - 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(); + Request request = handleMessage(accessToken,smsInfo); try (Response response = client.newCall(request).execute()) { String responseBody = response.body().string(); logger.info("Response: {}", responseBody); @@ -102,4 +89,79 @@ public class SMSService { 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; + } } \ No newline at end of file From fd740dbc52d04909b3e1bcacecf61bf9d169d1c9 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:43:17 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20PhoneNumberValidatio?= =?UTF-8?q?n.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kimgo/wepush/common/PhoneNumberValidation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java b/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java index 519eb59..797807c 100644 --- a/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java +++ b/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java @@ -13,7 +13,7 @@ public class PhoneNumberValidation { try { Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(number, "CN"); boolean isCorrect = phoneNumberUtil.isValidNumber(phoneNumber); - logger.info("号码:{},是否合法: {}",number,isCorrect); + logger.debug("号码:{},是否合法: {}",number,isCorrect); return isCorrect; } catch (NumberParseException e) { logger.error("NumberParseException was thrown: ",e); From 36402c784e3ff457eadae2b025943a326af6420e Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:43:55 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CallerController.jav?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/controller/CallerController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/controller/CallerController.java b/src/main/java/com/kimgo/wepush/controller/CallerController.java index f4079e0..049fdc8 100644 --- a/src/main/java/com/kimgo/wepush/controller/CallerController.java +++ b/src/main/java/com/kimgo/wepush/controller/CallerController.java @@ -25,7 +25,7 @@ public class CallerController { } if (callInfo == null || isNullOrEmptyOrLiteralNull(callInfo.getPhoneNumber()) || isNullOrEmptyOrLiteralNull(callInfo.getCallTime())) { - logger.info("CallInfo has invalid fields."); + logger.debug("CallInfo has invalid fields."); return ServerResponseEntity.fail("json body value error."); } return callService.getPhoneNumber(accessToken,callInfo); From 21b90672d29013ebf75925c2a1cd37e263cef74a Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:44:52 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20SMSController.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/controller/SMSController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/controller/SMSController.java b/src/main/java/com/kimgo/wepush/controller/SMSController.java index 700e91d..05d72a5 100644 --- a/src/main/java/com/kimgo/wepush/controller/SMSController.java +++ b/src/main/java/com/kimgo/wepush/controller/SMSController.java @@ -21,7 +21,7 @@ public class SMSController { public ServerResponseEntity receiveSMS(@RequestHeader("accessToken") String accessToken, @RequestBody SMSInfo smsInfo) { - logger.info("SMSInfo: {},accessToken: {}",smsInfo.toString(),accessToken); + logger.info("SMSInfo: {}",smsInfo.toString()); if(accessToken == null){ return ServerResponseEntity.fail("accessToken cannot be empty."); } From 94d9d8bab63a0040e7e4ae06f3aca1ea195741e1 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:44:58 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20WeChatAPI.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/request/WeChatAPI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/request/WeChatAPI.java b/src/main/java/com/kimgo/wepush/request/WeChatAPI.java index e065564..d8166d5 100644 --- a/src/main/java/com/kimgo/wepush/request/WeChatAPI.java +++ b/src/main/java/com/kimgo/wepush/request/WeChatAPI.java @@ -31,7 +31,7 @@ public class WeChatAPI { ObjectMapper objectMapper1 = new ObjectMapper(); QyWeChatGetAccessTokenApiResponse qyWeChatGetAccessTokenApiResponse = objectMapper1.readValue(responseBody, QyWeChatGetAccessTokenApiResponse.class); if (qyWeChatGetAccessTokenApiResponse.getErrcode() == 0){ - logger.info("get qyWeChat AccessToken Success"); + logger.debug("get qyWeChat AccessToken Success"); return qyWeChatGetAccessTokenApiResponse.getAccess_token(); } else { logger.error("getAccessToken error: {}",qyWeChatGetAccessTokenApiResponse.getErrmsg()); From f79383363c9d3af50b40831e154df7a7e18dba5d Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:45:04 +0800 Subject: [PATCH 08/10] =?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 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/kimgo/wepush/service/CallService.java b/src/main/java/com/kimgo/wepush/service/CallService.java index 6655082..0320bd8 100644 --- a/src/main/java/com/kimgo/wepush/service/CallService.java +++ b/src/main/java/com/kimgo/wepush/service/CallService.java @@ -94,6 +94,7 @@ public class CallService { 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..."); From fa8595d0300222213ec25e3ac6e175a214019ef8 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:45:08 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20TokenService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/service/TokenService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/service/TokenService.java b/src/main/java/com/kimgo/wepush/service/TokenService.java index a0e0390..42ffd93 100644 --- a/src/main/java/com/kimgo/wepush/service/TokenService.java +++ b/src/main/java/com/kimgo/wepush/service/TokenService.java @@ -75,7 +75,7 @@ public class TokenService { int result = qyWeChatAppInfoMapper.update(null, updateWrapper); if (result > 0) { - logger.info("Update successful"); + logger.debug("Update successful"); } else { logger.warn("Update failed: No rows affected"); } From 2d3d3aa676021eb7f81c1c30d7b837699a6dc706 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Wed, 6 Dec 2023 16:45:13 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20SMSServiceTest.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kimgo/wepush/service/SMSServiceTest.java | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java b/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java index f415d93..48d8219 100644 --- a/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java +++ b/src/test/java/com/kimgo/wepush/service/SMSServiceTest.java @@ -8,7 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import static org.junit.jupiter.api.Assertions.*; +import java.util.ArrayList; +import java.util.List; @SpringBootTest class SMSServiceTest { @@ -35,14 +36,41 @@ class SMSServiceTest { "【宽带专区】回“9”\n" + "【在线客服】若您有话费/流量疑问、业务咨询/退订等其他需求可联系在线文字客服,点击官方认证通道: https://dx.10086.cn/Q_HZBg \n" + "【为您推荐】尊敬的客户,您好!您有10元话费券待领取: http://dx.10086.cn/D/jEd1Jq ,点击查看话费使用详情: https://dx.10086.cn/38UvEQ 。。【中国移动】"; + String shortMsg = "【腾讯科技】尊敬的用户,您的账号whj139****3736,经人工客服核实,已根据账号使用情况进行处理,请重新登录即可。"; + String superMsg = generateMsg(); String accessToken = "gKGCDSgWV82XbU0H"; - SMSInfo smsInfo = new SMSInfo(); - smsInfo.setSmsContent(message); - smsInfo.setSmsNumber("11111"); - smsInfo.setSmsAcceptanceTime("11111"); + List smsInfoList = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + SMSInfo smsInfo = new SMSInfo(); + smsInfo.setSmsNumber("12321"); + smsInfo.setSmsAcceptanceTime("1123321"); + smsInfoList.add(smsInfo); + } - ServerResponseEntity serverResponseEntity = smsService.getSMSInfo(accessToken,smsInfo); - logger.info(serverResponseEntity.toString()); + smsInfoList.get(0).setSmsContent(message); + smsInfoList.get(1).setSmsContent(shortMsg); + smsInfoList.get(2).setSmsContent(superMsg); + for (int i = 0; i < 3; i++) { + ServerResponseEntity serverResponseEntity = smsService.getSMSInfo(accessToken,smsInfoList.get(i)); + logger.info(serverResponseEntity.toString()); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } } + private String generateMsg() { + StringBuilder msg = new StringBuilder("这是一条超长消息用于测试。"); + int size = msg.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8).length; + + while (size <= 2100) { + msg.append("这是一条超长消息用于测试。"); + size = msg.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8).length; + } + + return msg.toString(); + } + } \ No newline at end of file