diff --git a/coolstore-partner-model/pom.xml b/coolstore-partner-model/pom.xml index 0a5705685..b24df7cd5 100644 --- a/coolstore-partner-model/pom.xml +++ b/coolstore-partner-model/pom.xml @@ -39,6 +39,10 @@ com.alibaba easyexcel + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java new file mode 100644 index 000000000..8ad82c9f3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java @@ -0,0 +1,35 @@ +package com.cool.store.dto.wechat; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/10/14 14:39 + * @Version 1.0 + */ +@Data +@JacksonXmlRootElement(localName = "xml") +public class CallbackMessageDTO { + + @JacksonXmlProperty(localName = "ToUserName") + private String toUserName; + + @JacksonXmlProperty(localName = "FromUserName") + private String fromUserName; + + @JacksonXmlProperty(localName = "CreateTime") + private Long createTime; + + @JacksonXmlProperty(localName = "MsgType") + private String msgType; + + @JacksonXmlProperty(localName = "Event") + private String event; + + @JacksonXmlProperty(localName = "EventKey") + private String eventKey; + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java b/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java new file mode 100644 index 000000000..33adf8cb6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java @@ -0,0 +1,106 @@ +package com.cool.store.handler; + +import com.cool.store.dto.wechat.CallbackMessageDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @Author suzhuhong + * @Date 2025/10/14 14:56 + * @Version 1.0 + */ +@Component +@Slf4j +public class WeChatHandler { + + + public String processMessage(CallbackMessageDTO message) { + String msgType = message.getMsgType(); + + switch (msgType) { + case "event": + return handleEvent(message); + +// case "text": +// return handleTextMessage(message); +// +// case "image": +// return handleImageMessage(message); + + default: + // 其他类型的消息直接回复success + return buildSuccessReply(message.getFromUserName(), message.getToUserName()); + } + } + + private String handleEvent(CallbackMessageDTO message) { + String event = message.getEvent(); + + switch (event) { + case "subscribe": + // 关注事件 - 绑定用户 + return handleSubscribeEvent(message); + + case "unsubscribe": + // 取消关注事件 - 解绑用户 + return handleUnsubscribeEvent(message); + + default: + return buildWelcomeReply(message.getFromUserName(), message.getToUserName()); + } + } + + private String handleSubscribeEvent(CallbackMessageDTO message) { + String openId = message.getFromUserName(); + + try { + //userBindingService.bindOfficialAccountUser(openId); + // 立即回复欢迎消息 + return buildWelcomeReply(message.getFromUserName(), message.getToUserName()); + + } catch (Exception e) { + // 即使处理失败也要返回success + return buildWelcomeReply(message.getFromUserName(), message.getToUserName()); + } + } + + /** + * 处理取消关注事件 + */ + private String handleUnsubscribeEvent(CallbackMessageDTO message) { + String openId = message.getFromUserName(); + + // 异步处理用户解绑 + //userBindingService.unbindOfficialAccountUser(openId); + + return "success"; + } + + private String buildSuccessReply(String fromUser, String toUser) { + return String.format( + "" + + "" + + "" + + "%d" + + "" + + "" + + "", + fromUser, toUser, System.currentTimeMillis() / 1000 + ); + } + + + private String buildWelcomeReply(String fromUser, String toUser) { + return String.format( + "" + + "" + + "" + + "%d" + + "" + + "" + + "", + fromUser, toUser, System.currentTimeMillis() / 1000 + ); + } + +} diff --git a/coolstore-partner-web/pom.xml b/coolstore-partner-web/pom.xml index 22e75fcb9..9afd3a4b0 100644 --- a/coolstore-partner-web/pom.xml +++ b/coolstore-partner-web/pom.xml @@ -33,6 +33,10 @@ com.aliyun.oss aliyun-sdk-oss + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java index 2f6cdc355..a35709410 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java @@ -8,6 +8,7 @@ import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.HqtTokenDTO; import com.cool.store.dto.ModifyPasswordDTO; +import com.cool.store.dto.wechat.CallbackMessageDTO; import com.cool.store.dto.wechat.WechatTemplateMessageDTO; import com.cool.store.entity.*; import com.cool.store.enums.DownSystemTypeEnum; @@ -15,6 +16,7 @@ import com.cool.store.enums.MessageEnum; import com.cool.store.enums.SMSMsgEnum; import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.enums.wechat.WechatTemplateEnum; +import com.cool.store.handler.WeChatHandler; import com.cool.store.job.XxlJobHandler; import com.cool.store.mapper.FranchiseFeeMapper; import com.cool.store.mapper.LineInfoMapper; @@ -43,6 +45,8 @@ import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.poi.StringUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -558,7 +562,41 @@ public class PCTestController { } return request; } + private final XmlMapper xmlMapper = new XmlMapper(); + @Autowired + WeChatHandler weChatHandler; + @RequestMapping(value = "/testWxNotice", produces = "application/xml;charset=UTF-8") + @ApiOperation("testWxNotice") + public String handleWechatMessage( + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam(value = "echostr", required = false) String echostr, + @RequestBody(required = false) String requestBody) { + + System.out.println("收到微信消息:"); + System.out.println("signature: " + signature); + System.out.println("timestamp: " + timestamp); + System.out.println("nonce: " + nonce); + System.out.println("echostr: " + echostr); + System.out.println("requestBody: " + requestBody); + + // 验证签名 +// if (!verifySignature(signature, timestamp, nonce, TOKEN)) { +// return "signature verification failed"; +// } + if (StringUtils.isNotEmpty(requestBody)) { + try { + CallbackMessageDTO message = xmlMapper.readValue(requestBody, CallbackMessageDTO.class); + return weChatHandler.processMessage(message); + } catch (Exception e) { + log.info("回调处理失败 e:{}",e.getMessage()); + return "success"; + } + } + return nonce; + } @Resource WechatTemplateService wechatTemplateService; diff --git a/pom.xml b/pom.xml index b4d687d85..093ad8d70 100644 --- a/pom.xml +++ b/pom.xml @@ -232,6 +232,12 @@ alibabacloud-dysmsapi20170525 2.0.24 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.15.2 +