From f89bbbc55161c8310a2f60bc1bdc7ed7a11d5b18 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 19 Apr 2024 16:19:15 +0800 Subject: [PATCH] Update CallService.java --- .../com/kimgo/wepush/service/CallService.java | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/CallService.java b/src/main/java/com/kimgo/wepush/service/CallService.java index bf4ed45..20f797e 100644 --- a/src/main/java/com/kimgo/wepush/service/CallService.java +++ b/src/main/java/com/kimgo/wepush/service/CallService.java @@ -30,37 +30,67 @@ public class CallService { this.tokenService = tokenService; } - public ServerResponseEntity getPhoneNumber(String accessToken, CallInfo callInfo){ + /** + * 根据提供的accessToken和呼叫信息获取电话号码。 + * 首先验证提供的accessToken的有效性,然后通过调用信息(电话号码和呼叫时间)向企业微信发送消息, + * 并根据企业微信的响应返回成功或失败的服务器响应。 + * + * @param accessToken 用户提供的accessToken用于身份验证。 + * @param callInfo 呼叫信息,包含电话号码和呼叫时间。 + * @return 返回一个服务器响应实体,如果成功则包含消息ID,如果失败则包含错误信息。 + */ + public ServerResponseEntity getPhoneNumber(String accessToken, CallInfo callInfo) { + // 通过token服务获取正确的accessToken String correctAccessToken = tokenService.getApiAccessToken(); - logger.info("accessToken: {} correctAccessToken: {}",accessToken,correctAccessToken); - if (!correctAccessToken.equals(accessToken)){ + logger.info("accessToken: {} correctAccessToken: {}", accessToken, correctAccessToken); + // 验证提供的accessToken是否有效 + if (!correctAccessToken.equals(accessToken)) { return ServerResponseEntity.fail("Invalid accessToken"); } + // 从呼叫信息中获取电话号码和呼叫时间 String phoneNumber = callInfo.getPhoneNumber(); String callTime = callInfo.getCallTime(); + // 获取企业微信的访问令牌 String qyAccessToken = tokenService.getAccessToken(); - QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = requestWithOkhttp(qyAccessToken,phoneNumber,callTime); + // 使用企业微信的accessToken、电话号码和呼叫时间发送消息,并获取响应 + QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = requestWithOkhttp(qyAccessToken, phoneNumber, callTime); + // 检查发送消息的响应代码 int code = qyWeChatSendMessageApiResponse.getErrcode(); - if (code == 0){ + if (code == 0) { + // 如果消息发送成功,构建并返回成功的服务器响应 SendMessageResonse sendMessageResonse = new SendMessageResonse(); sendMessageResonse.setMsgid(qyWeChatSendMessageApiResponse.getMsgid()); return ServerResponseEntity.success(sendMessageResonse); } else { + // 如果消息发送失败,返回失败的服务器响应 return ServerResponseEntity.fail("request qyWeChat error,please check server error log."); } } + + /** + * 设置文本卡片消息的内容。 + * + * @param phoneNumber 来电电话号码 + * @param callTime 来电时间 + * @return TextCardMessage 文本卡片消息对象,包含了设置好的内容 + */ public TextCardMessage setTextCardMessage(String phoneNumber, String callTime) { TextCardMessage textCardMessage = new TextCardMessage(); + // 从api设置中获取用户信息,并设置到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()); + + // 创建TextCard对象,并设置其内容 TextCardMessage.TextCard textCard = new TextCardMessage.TextCard(); textCard.setTitle("新来电通知"); + // 设置描述信息,包含来电号码和来电时间 textCard.setDescription("
您有一通新来电
来电号码: " + phoneNumber + "
来电时间: " + callTime + "
如果您认识这个号码,请及时回电。如果不认识,请注意可能是垃圾电话或诈骗电话。"); textCard.setUrl("https://kimgo.cn"); + // 将TextCard对象设置到TextCardMessage中 textCardMessage.setTextcard(textCard); @@ -69,37 +99,53 @@ public class CallService { return textCardMessage; } - public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken,String phoneNumber,String callTime){ + + /** + * 使用OkHttp发送企业微信文本卡片消息。 + * + * @param accessToken 访问令牌,用于授权访问企业微信API。 + * @param phoneNumber 接收消息的手机号码。 + * @param callTime 预约的呼叫时间。 + * @return 返回企业微信发送消息的API响应,如果失败则返回null。 + */ + public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken, String phoneNumber, String callTime) { + // 构建发送文本卡片消息的URL String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; OkHttpClient client = new OkHttpClient(); - TextCardMessage textCardMessage = setTextCardMessage(phoneNumber,callTime); - // 使用Jackson进行序列化 + // 设置文本卡片消息内容 + TextCardMessage textCardMessage = setTextCardMessage(phoneNumber, callTime); + // 将消息对象序列化为JSON字符串 ObjectMapper objectMapper = new ObjectMapper(); String jsonBody; try { jsonBody = objectMapper.writeValueAsString(textCardMessage); - logger.info("jsonBody: {}",jsonBody); + logger.info("jsonBody: {}", jsonBody); } catch (JsonProcessingException e) { logger.error("JSON processing error", e); return null; } - // 构建请求体 + + // 构建HTTP请求体 RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody); Request request = new 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); + // 反序列化API响应 ObjectMapper objectMapper1 = new ObjectMapper(); QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class); + // 处理不同的API响应结果 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..."); - tokenService.setAccessToken(); // 一个方法来刷新accessToken + tokenService.setAccessToken(); // 刷新accessToken的方法 String newAccessToken = tokenService.getAccessToken(); return requestWithOkhttp(newAccessToken, phoneNumber, callTime); } else {