|
|
@@ -15,6 +15,7 @@ import jakarta.servlet.http.HttpServletResponse;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
import me.chanjar.weixin.mp.api.WxMpService;
|
|
|
+import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
|
|
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
|
|
|
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
@@ -67,7 +68,29 @@ public class WeixinMPServiceImpl implements WeixinMPService {
|
|
|
String xml = IoUtil.read(request.getInputStream(), CharsetUtil.CHARSET_UTF_8);
|
|
|
log.info("收到微信公众号通知:xml message:{}", xml);
|
|
|
|
|
|
+ // 处理加密消息:公众号安全模式下推送的消息需要先解密
|
|
|
Map<String, Object> ret = XmlUtil.xmlToMap(xml);
|
|
|
+ if (ret.containsKey("Encrypt")) {
|
|
|
+ String timestamp = request.getParameter("timestamp");
|
|
|
+ String nonce = request.getParameter("nonce");
|
|
|
+ String msgSignature = request.getParameter("msg_signature");
|
|
|
+ WxMpXmlMessage decrypted = WxMpXmlMessage.fromEncryptedXml(
|
|
|
+ xml, wxMpService.getWxMpConfigStorage(), timestamp, nonce, msgSignature);
|
|
|
+ log.info("消息已解密: FromUser={}, MsgType={}, Event={}",
|
|
|
+ decrypted.getFromUser(), decrypted.getMsgType(), decrypted.getEvent());
|
|
|
+ // 将解密后的字段回填到 ret map,后续逻辑无需改动
|
|
|
+ ret.clear();
|
|
|
+ ret.put("ToUserName", decrypted.getToUser());
|
|
|
+ ret.put("FromUserName", decrypted.getFromUser());
|
|
|
+ ret.put("CreateTime", String.valueOf(decrypted.getCreateTime()));
|
|
|
+ ret.put("MsgType", decrypted.getMsgType());
|
|
|
+ ret.put("Content", decrypted.getContent());
|
|
|
+ ret.put("MsgId", decrypted.getMsgId());
|
|
|
+ if (decrypted.getEvent() != null) {
|
|
|
+ ret.put("Event", decrypted.getEvent());
|
|
|
+ ret.put("EventKey", decrypted.getEventKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
log.info("收到微信公众号通知:map message:{}", ret);
|
|
|
|
|
|
if (!CommUtil.isEmptyOrNull(ret)) {
|