|
@@ -0,0 +1,130 @@
|
|
|
+package org.ruoyi.config;
|
|
|
+
|
|
|
+
|
|
|
+import com.google.common.collect.Maps;
|
|
|
+import jakarta.annotation.PostConstruct;
|
|
|
+import lombok.val;
|
|
|
+import me.chanjar.weixin.common.api.WxConsts;
|
|
|
+import me.chanjar.weixin.cp.api.WxCpService;
|
|
|
+import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
|
|
|
+import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
|
|
|
+import me.chanjar.weixin.cp.constant.WxCpConsts;
|
|
|
+import me.chanjar.weixin.cp.message.WxCpMessageHandler;
|
|
|
+import me.chanjar.weixin.cp.message.WxCpMessageRouter;
|
|
|
+import org.ruoyi.handler.*;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 单实例配置
|
|
|
+ *
|
|
|
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
|
|
|
+ */
|
|
|
+@Configuration
|
|
|
+@EnableConfigurationProperties(WxCpProperties.class)
|
|
|
+public class WxCpConfiguration {
|
|
|
+ private final LogHandler logHandler;
|
|
|
+ private NullHandler nullHandler;
|
|
|
+ private LocationHandler locationHandler;
|
|
|
+ private MenuHandler menuHandler;
|
|
|
+ private MsgHandler msgHandler;
|
|
|
+ private final UnsubscribeHandler unsubscribeHandler;
|
|
|
+ private SubscribeHandler subscribeHandler;
|
|
|
+ private WxCpProperties properties;
|
|
|
+
|
|
|
+ private static Map<Integer, WxCpMessageRouter> routers = Maps.newHashMap();
|
|
|
+ private static Map<Integer, WxCpService> cpServices = Maps.newHashMap();
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public WxCpConfiguration(LogHandler logHandler, NullHandler nullHandler, LocationHandler locationHandler,
|
|
|
+ MenuHandler menuHandler, MsgHandler msgHandler, UnsubscribeHandler unsubscribeHandler,
|
|
|
+ SubscribeHandler subscribeHandler, WxCpProperties properties) {
|
|
|
+ this.logHandler = logHandler;
|
|
|
+ this.nullHandler = nullHandler;
|
|
|
+ this.locationHandler = locationHandler;
|
|
|
+ this.menuHandler = menuHandler;
|
|
|
+ this.msgHandler = msgHandler;
|
|
|
+ this.unsubscribeHandler = unsubscribeHandler;
|
|
|
+ this.subscribeHandler = subscribeHandler;
|
|
|
+ this.properties = properties;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static Map<Integer, WxCpMessageRouter> getRouters() {
|
|
|
+ return routers;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static WxCpService getCpService(Integer agentId) {
|
|
|
+ return cpServices.get(agentId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @PostConstruct
|
|
|
+ public void initServices() {
|
|
|
+ cpServices = this.properties.getAppConfigs().stream().map(a -> {
|
|
|
+ val configStorage = new WxCpDefaultConfigImpl();
|
|
|
+ configStorage.setCorpId(this.properties.getCorpId());
|
|
|
+ configStorage.setAgentId(a.getAgentId());
|
|
|
+ configStorage.setCorpSecret(a.getSecret());
|
|
|
+ configStorage.setToken(a.getToken());
|
|
|
+ configStorage.setAesKey(a.getAesKey());
|
|
|
+ val service = new WxCpServiceImpl();
|
|
|
+ service.setWxCpConfigStorage(configStorage);
|
|
|
+ routers.put(a.getAgentId(), this.newRouter(service));
|
|
|
+ return service;
|
|
|
+ }).collect(Collectors.toMap(service -> service.getWxCpConfigStorage().getAgentId(), a -> a));
|
|
|
+ }
|
|
|
+
|
|
|
+ private WxCpMessageRouter newRouter(WxCpService wxCpService) {
|
|
|
+ final val newRouter = new WxCpMessageRouter(wxCpService);
|
|
|
+
|
|
|
+ // 记录所有事件的日志 (异步执行)
|
|
|
+ newRouter.rule().handler(this.logHandler).next();
|
|
|
+
|
|
|
+ // 自定义菜单事件
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.MenuButtonType.CLICK).handler(this.menuHandler).end();
|
|
|
+
|
|
|
+ // 点击菜单链接事件(这里使用了一个空的处理器,可以根据自己需要进行扩展)
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.MenuButtonType.VIEW).handler(this.nullHandler).end();
|
|
|
+
|
|
|
+ // 关注事件
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler)
|
|
|
+ .end();
|
|
|
+
|
|
|
+ // 取消关注事件
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.EventType.UNSUBSCRIBE)
|
|
|
+ .handler((WxCpMessageHandler) this.unsubscribeHandler).end();
|
|
|
+
|
|
|
+ // 上报地理位置事件
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.EventType.LOCATION).handler(this.locationHandler)
|
|
|
+ .end();
|
|
|
+
|
|
|
+ // 接收地理位置消息
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION)
|
|
|
+ .handler(this.locationHandler).end();
|
|
|
+
|
|
|
+ // 扫码事件(这里使用了一个空的处理器,可以根据自己需要进行扩展)
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxConsts.EventType.SCAN).handler((WxCpMessageHandler) this.nullHandler).end();
|
|
|
+
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxCpConsts.EventType.CHANGE_CONTACT).handler(new ContactChangeHandler()).end();
|
|
|
+
|
|
|
+ newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
|
|
|
+ .event(WxCpConsts.EventType.ENTER_AGENT).handler(new EnterAgentHandler()).end();
|
|
|
+
|
|
|
+ // 默认
|
|
|
+ newRouter.rule().async(false).handler(this.msgHandler).end();
|
|
|
+
|
|
|
+ return newRouter;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|