From 25b172e7f646e3e282b44a094ed8127e26006f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Wed, 6 May 2020 09:08:43 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84=20=E5=BE=AE=E4=BF=A1=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/controller/WxFansMsgController.java | 14 +-- .../pig4cloud/pigx/mp/handler/LogHandler.java | 9 ++ .../pigx/mp/handler/MenuHandler.java | 119 ++++++++++++++++-- 3 files changed, 124 insertions(+), 18 deletions(-) diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxFansMsgController.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxFansMsgController.java index 43187605a..0735cfadd 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxFansMsgController.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxFansMsgController.java @@ -139,15 +139,15 @@ public class WxFansMsgController { } if (WxConsts.KefuMsgType.NEWS.equals(wxMsg.getRepType())) { List list = new ArrayList<>(); - JSONArray jSONArray = JSONUtil.parseObj(wxMsg.getContent()).getJSONArray("articles"); + JSONArray articles = JSONUtil.parseObj(wxMsg.getContent()).getJSONArray("articles"); WxMpKefuMessage.WxArticle t; - for (Object object : jSONArray) { - JSONObject jSONObject = JSONUtil.parseObj(JSONUtil.toJsonStr(object)); + for (Object object : articles) { + JSONObject obj = JSONUtil.parseObj(JSONUtil.toJsonStr(object)); t = new WxMpKefuMessage.WxArticle(); - t.setTitle(jSONObject.getStr("title")); - t.setDescription(jSONObject.getStr("digest")); - t.setPicUrl(jSONObject.getStr("thumbUrl")); - t.setUrl(jSONObject.getStr("url")); + t.setTitle(obj.getStr("title")); + t.setDescription(obj.getStr("digest")); + t.setPicUrl(obj.getStr("thumbUrl")); + t.setUrl(obj.getStr("url")); list.add(t); } wxMsg.setRepName(wxMsg.getRepName()); diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/LogHandler.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/LogHandler.java index e7b37d83b..ae2ed2d58 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/LogHandler.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/LogHandler.java @@ -63,6 +63,15 @@ public class LogHandler extends AbstractHandler { if (WxConsts.XmlMsgType.TEXT.equals(wxMessage.getMsgType())) { wxMsg.setRepContent(wxMessage.getContent()); } + + if (WxConsts.MenuButtonType.VIEW.equalsIgnoreCase(wxMessage.getEvent())) { + wxMsg.setRepUrl(wxMessage.getEventKey()); + } + + if (WxConsts.MenuButtonType.CLICK.equalsIgnoreCase(wxMessage.getEvent())) { + wxMsg.setRepName(wxMessage.getEventKey()); + } + if (WxConsts.XmlMsgType.VOICE.equals(wxMessage.getMsgType())) { wxMsg.setRepName(wxMessage.getMediaId() + "." + wxMessage.getFormat()); wxMsg.setRepContent(wxMessage.getRecognition()); diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/MenuHandler.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/MenuHandler.java index 630c33535..45089f666 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/MenuHandler.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/MenuHandler.java @@ -1,36 +1,133 @@ package com.pig4cloud.pigx.mp.handler; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.mp.config.WxMpContextHolder; +import com.pig4cloud.pigx.mp.entity.WxMpMenu; +import com.pig4cloud.pigx.mp.mapper.WxMenuMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; +import me.chanjar.weixin.mp.builder.outxml.*; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; import java.util.Map; -import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; - /** * @author Binary Wang(https://github.com/binarywang) */ +@Slf4j @Component +@AllArgsConstructor public class MenuHandler extends AbstractHandler { + private final WxMenuMapper wxMenuMapper; @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService weixinService, - WxSessionManager sessionManager) { + WxSessionManager sessionManager) throws WxErrorException { + //组装菜单回复消息 + return getWxMpXmlOutMessage(wxMessage); + } - String msg = String.format("type:%s, event:%s, key:%s", - wxMessage.getMsgType(), wxMessage.getEvent(), - wxMessage.getEventKey()); - if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) { - return null; + /** + * 组装菜单回复消息 + * + * @param wxMessage + * @return + */ + public WxMpXmlOutMessage getWxMpXmlOutMessage(WxMpXmlMessage wxMessage) { + + + WxMpMenu wxMpMenu = wxMenuMapper.selectOne(Wrappers.lambdaQuery() + .eq(WxMpMenu::getWxAccountAppid, WxMpContextHolder.getAppId())); + List buttons = JSONUtil.parseObj(wxMpMenu.getMenu()).getJSONArray("button").toList(JSONObject.class); + String eventKey = wxMessage.getEventKey(); + + // 获取子集 + List buttonList = new ArrayList<>(); + for (JSONObject button : buttons) { + JSONArray subButton = button.getJSONArray("sub_button"); + if (subButton.isEmpty()) { + buttonList.add(button); + continue; + } + List subButtonList = subButton.toList(JSONObject.class); + buttonList.addAll(subButtonList); } - return WxMpXmlOutMessage.TEXT().content(msg) - .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) - .build(); + // 遍历规则 + for (JSONObject button : buttonList) { + + // 可以在这里进行自定义逻辑开发 + if (!eventKey.equalsIgnoreCase(button.getStr("key"))) { + continue; + } + + WxMpXmlOutMessage wxMpXmlOutMessage = null; + String repType = button.getStr("repType"); + String repName = button.getStr("repName"); + String repContent = button.getStr("repContent"); + String repMediaId = button.getStr("repMediaId"); + String repDesc = button.getStr("repDesc"); + if (WxConsts.KefuMsgType.TEXT.equals(repType)) { + wxMpXmlOutMessage = new TextBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).content(repContent).build(); + } + + if (WxConsts.KefuMsgType.IMAGE.equals(repType)) { + wxMpXmlOutMessage = new ImageBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(repMediaId).build(); + } + + if (WxConsts.KefuMsgType.VOICE.equals(repType)) { + wxMpXmlOutMessage = new VoiceBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(repMediaId).build(); + } + + if (WxConsts.KefuMsgType.VIDEO.equals(repType)) { + wxMpXmlOutMessage = new VideoBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(repMediaId) + .title(repName).description(repDesc).build(); + } + + if (WxConsts.KefuMsgType.MUSIC.equals(repType)) { + String repThumbMediaId = button.getStr("repThumbMediaId"); + String repUrl = button.getStr("repUrl"); + String repHqUrl = button.getStr("repHqUrl"); + + wxMpXmlOutMessage = new MusicBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .thumbMediaId(repThumbMediaId) + .title(repName).description(repDesc) + .musicUrl(repUrl).hqMusicUrl(repHqUrl).build(); + } + + if (WxConsts.KefuMsgType.NEWS.equals(repType)) { + String content = button.getStr("content"); + + List list = new ArrayList<>(); + List articles = JSONUtil.parseObj(content).getJSONArray("articles").toList(JSONObject.class); + WxMpXmlOutNewsMessage.Item t; + for (JSONObject jSONObject : articles) { + t = new WxMpXmlOutNewsMessage.Item(); + t.setTitle(jSONObject.getStr("title")); + t.setDescription(jSONObject.getStr("digest")); + t.setPicUrl(jSONObject.getStr("thumbUrl")); + t.setUrl(jSONObject.getStr("url")); + list.add(t); + } + wxMpXmlOutMessage = new NewsBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).articles(list).build(); + } + return wxMpXmlOutMessage; + } + return null; } } +