|
|
@@ -0,0 +1,107 @@
|
|
|
+package com.kym.service.wechat.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.io.IoUtil;
|
|
|
+import cn.hutool.core.util.CharsetUtil;
|
|
|
+import cn.hutool.core.util.XmlUtil;
|
|
|
+import com.kym.common.utils.CommUtil;
|
|
|
+import com.kym.entity.miniapp.MpRelation;
|
|
|
+import com.kym.service.miniapp.impl.MpRelationServiceImpl;
|
|
|
+import com.kym.service.wechat.WeixinMPService;
|
|
|
+import jakarta.servlet.http.HttpServletRequest;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 微信公众号服务
|
|
|
+ *
|
|
|
+ * @author skyline
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class WeixinMPServiceImpl implements WeixinMPService {
|
|
|
+
|
|
|
+ private final MpRelationServiceImpl mpRelationService;
|
|
|
+
|
|
|
+ public WeixinMPServiceImpl(MpRelationServiceImpl mpRelationService) {
|
|
|
+ this.mpRelationService = mpRelationService;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理微信公众号通知
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void handleWxMPNotify(HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ String result = "";
|
|
|
+ try {
|
|
|
+ String xml = IoUtil.read(request.getInputStream(), CharsetUtil.CHARSET_UTF_8);
|
|
|
+ log.info("收到微信公众号通知:xml message:{}", xml);
|
|
|
+
|
|
|
+ Map<String, Object> ret = XmlUtil.xmlToMap(xml);
|
|
|
+ log.info("收到微信公众号通知:map message:{}", ret);
|
|
|
+
|
|
|
+ if (!CommUtil.isEmptyOrNull(ret)) {
|
|
|
+ // 公众号用户的openid
|
|
|
+ var mpOpenid = ret.get("FromUserName").toString();
|
|
|
+ // 事件类型
|
|
|
+ var msgType = ret.get("MsgType").toString();
|
|
|
+ var event = ret.get("Event").toString();
|
|
|
+ if ("event".equals(msgType) && CommUtil.isEmptyOrNull(event)) {
|
|
|
+ switch (msgType) {
|
|
|
+ case "subscribe":
|
|
|
+ // 关注公众号
|
|
|
+ log.info("收到微信公众号关注通知: {}", mpOpenid);
|
|
|
+ // 通过openid获取用户信息中的unionid,关联小程序用户
|
|
|
+ mpRelationService.bindMpUser(mpOpenid);
|
|
|
+ break;
|
|
|
+ case "unsubscribe":
|
|
|
+ // 取消关注公众号
|
|
|
+ log.info("收到微信公众号取消关注通知: {}", mpOpenid);
|
|
|
+ // 更新用户的关注状态
|
|
|
+ mpRelationService.lambdaUpdate().set(MpRelation::getSubscribe, false).eq(MpRelation::getOpenid, mpOpenid).update();
|
|
|
+ break;
|
|
|
+ case "scan":
|
|
|
+ // 扫描二维码
|
|
|
+ log.info("收到微信公众号扫描二维码通知: {}", mpOpenid);
|
|
|
+ break;
|
|
|
+ case "location":
|
|
|
+ // 上报地理位置
|
|
|
+ log.info("收到微信公众号上报地理位置通知: {}", mpOpenid);
|
|
|
+ break;
|
|
|
+ case "click":
|
|
|
+ // 点击菜单拉取消息
|
|
|
+ log.info("收到微信公众号点击菜单拉取消息通知: {}", mpOpenid);
|
|
|
+ break;
|
|
|
+ case "view":
|
|
|
+ // 点击菜单跳转链接
|
|
|
+ log.info("收到微信公众号点击菜单跳转链接通知: {}", mpOpenid);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ response.setContentType("text/html");
|
|
|
+ result = XmlUtil.mapToXmlStr(ret);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信公众号消息处理异常", e);
|
|
|
+ } finally {
|
|
|
+ try {
|
|
|
+ log.info("收到微信公众号通知响应: {}", result);
|
|
|
+ PrintWriter writer = response.getWriter();
|
|
|
+ writer.print(result);
|
|
|
+ writer.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|