ソースを参照

微信公众号基类代码跟jar包添加提交

wangzl 7 ヶ月 前
コミット
607cf68028

+ 6 - 1
tr-dependencies/pom.xml

@@ -545,7 +545,12 @@
                 <artifactId>weixin-java-miniapp</artifactId>
                 <version>${wx.version}</version>
             </dependency>
-
+            <!--微信对应工具类-->
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-mp</artifactId>
+                <version>${wx.version}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>

+ 5 - 0
tr-modules/tr-module-smartFollowUp/pom.xml

@@ -53,6 +53,11 @@
             <artifactId>weixin-java-miniapp</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-module-system</artifactId>

+ 15 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/dto/WxTemplateDTO.java

@@ -0,0 +1,15 @@
+package cn.tr.module.smart.wx.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * @author wangzl
+ * @description: 微信模板消息基类
+ *
+ * @date 2025/5/23 11:10
+ */
+@Data
+@ApiModel("微信模板消息基类")
+public class WxTemplateDTO{
+}

+ 65 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/handler/AbstractWxSendTemplateMsgHandler.java

@@ -0,0 +1,65 @@
+package cn.tr.module.smart.wx.handler;
+
+import cn.tr.core.utils.JsonUtils;
+import lombok.Getter;
+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.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author wangzl
+ * @description: 发送微信公众号发送基类
+ * @date 2025/5/23 10:03
+ */
+@Getter
+@Slf4j
+public abstract class AbstractWxSendTemplateMsgHandler<T> {
+
+    public abstract String templateId();
+    public abstract Class<T>  getSupportedType();
+
+
+    /**
+     * 消息处理转换方法(将DTO转换为微信模板数据)
+     *
+     * @param obj 消息DTO对象
+     */
+    private List<WxMpTemplateData> convertToTemplateData(T obj) {
+        String json = JsonUtils.toJsonString(obj);
+        Map<String, Object> map = JsonUtils.parseMap(json);
+        return map.entrySet().stream()
+                .filter(entry->entry.getValue() != null)
+                .map(entry->new WxMpTemplateData(entry.getKey(), String.valueOf(entry.getValue())))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 发送微信模板消息
+     *
+     * @param wxMpService 微信服务实例
+     * @param unionId     用户unionId
+     * @param msg         消息DTO
+     */
+    public String sendMessage(WxMpService wxMpService, String unionId, String appId, String url, T msg) throws WxErrorException {
+        //转换模板数据
+        List<WxMpTemplateData> templateDataList = convertToTemplateData(msg);
+        //构建模板消息
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(unionId)
+                .url(url)
+                .templateId(templateId())
+                .data(templateDataList)
+                .build();
+        //发送消息
+        wxMpService.switchoverTo(appId);
+        String result = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        log.info("发送模板消息结果:{}", result);
+        return result;
+    }
+}

+ 67 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/register/WxSendTemplateMsgRegister.java

@@ -0,0 +1,67 @@
+package cn.tr.module.smart.wx.register;
+
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.smart.wx.dto.WxTemplateDTO;
+import cn.tr.module.smart.wx.handler.AbstractWxSendTemplateMsgHandler;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/5/23 11:02
+ */
+@Component
+@Slf4j
+public class WxSendTemplateMsgRegister implements BeanPostProcessor {
+    private final Map<Class<?>, AbstractWxSendTemplateMsgHandler<?>> map = new HashMap<>();
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+        if (bean instanceof AbstractWxSendTemplateMsgHandler) {
+
+            AbstractWxSendTemplateMsgHandler<?> handler = (AbstractWxSendTemplateMsgHandler<?>) bean;
+            Class<?> clazz = handler.getSupportedType();
+            if (clazz == null) {
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "Handler 未正确实现 getSupportedType(): " + handler.getClass());
+            }
+            map.put(((AbstractWxSendTemplateMsgHandler<?>) bean).getSupportedType(), (AbstractWxSendTemplateMsgHandler<?>) bean);
+            log.info("注册 Handler: " + clazz + " -> " + handler.getClass());
+        }
+        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends WxTemplateDTO> String sendMessage(WxMpService wxMpService, String unionId, String appId, String url, T msg) throws WxErrorException {
+        if (msg == null) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "参数对象msg不能为空");
+        }
+        Class<?> clazz = AopUtils.isAopProxy(msg) ? AopUtils.getTargetClass(msg) : msg.getClass();
+        AtomicReference<AbstractWxSendTemplateMsgHandler<T>> handler = new AtomicReference<>((AbstractWxSendTemplateMsgHandler<T>) map.get(clazz));
+
+        // 如果直接没找到,尝试找父类匹配的 handler
+        if (handler.get() == null) {
+            map.entrySet().stream()
+                    .filter(entry -> entry.getKey().isAssignableFrom(clazz))
+                    .findFirst()
+                    .ifPresent(entry -> handler.set((AbstractWxSendTemplateMsgHandler<T>) entry.getValue()));
+
+        }
+
+        if (handler.get() == null) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "没有找到对handler对象" + clazz);
+        }
+        return handler.get().sendMessage(wxMpService, unionId, url, appId, msg);
+
+    }
+}