Sfoglia il codice sorgente

feat(mp): 添加给粉丝群发消息功能

zrd 3 mesi fa
parent
commit
9efc915b9e

+ 10 - 3
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.java

@@ -10,13 +10,12 @@ import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
 import cn.iocoder.yudao.module.mp.service.message.MpMessageService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 公众号消息")
@@ -43,5 +42,13 @@ public class MpMessageController {
         MpMessageDO message = mpMessageService.sendKefuMessage(reqVO);
         return success(MpMessageConvert.INSTANCE.convert(message));
     }
+    
+    @PostMapping("/sendTextMessageToAll")
+    @Operation(summary = "给粉丝群发发送消息")
+    @PreAuthorize("@ss.hasPermission('mp:message:send')")
+    public CommonResult<MpMessageRespVO> sendTextMessageToAll(@Valid @RequestBody MpMessageSendReqVO reqVO) {
+        MpMessageDO message = mpMessageService.sendTextMessageToAll(reqVO);
+        return success(MpMessageConvert.INSTANCE.convert(message));
+    }
 
 }

+ 8 - 9
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java

@@ -3,30 +3,29 @@ package cn.iocoder.yudao.module.mp.controller.admin.message.vo.message;
 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
 import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils.*;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
 import java.util.List;
 
 @Schema(description = "管理后台 - 公众号消息发送 Request VO")
 @Data
 public class MpMessageSendReqVO {
 
-    @Schema(description = "公众号粉丝的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotNull(message = "公众号粉丝的编号不能为空")
-    private Long userId;
-
-    // ========== 消息内容 ==========
-
     @Schema(description = "消息类型 TEXT/IMAGE/VOICE/VIDEO/NEWS", requiredMode = Schema.RequiredMode.REQUIRED, example = "text")
     @NotEmpty(message = "消息类型不能为空")
     public String type;
-
+    
+    // ========== 消息内容 ==========
+    @Schema(description = "公众号粉丝的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "公众号粉丝的编号不能为空")
+    private Long userId;
     @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好呀")
     @NotEmpty(message = "消息内容不能为空", groups = TextMessageGroup.class)
     private String content;
+    private String appId;
 
     @Schema(description = "媒体 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP")
     @NotEmpty(message = "消息内容不能为空", groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class})

+ 3 - 2
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageService.java

@@ -5,11 +5,10 @@ import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageP
 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO;
 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
+import jakarta.validation.Valid;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
 
-import jakarta.validation.Valid;
-
 /**
  * 公众号消息 Service 接口
  *
@@ -54,5 +53,7 @@ public interface MpMessageService {
      * @return 消息
      */
     MpMessageDO sendKefuMessage(MpMessageSendReqVO sendReqVO);
+    
+    MpMessageDO sendTextMessageToAll(MpMessageSendReqVO sendReqVO);
 
 }

+ 17 - 0
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageServiceImpl.java

@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
 import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
@@ -145,6 +146,22 @@ public class MpMessageServiceImpl implements MpMessageService {
         mpMessageMapper.insert(message);
         return message;
     }
+    
+    @Override
+    public MpMessageDO sendTextMessageToAll(MpMessageSendReqVO sendReqVO) {
+        MpMessageDO message = new MpMessageDO();
+        WxMpService mpService = mpServiceFactory.getRequiredMpService(sendReqVO.getAppId());
+        WxMpMassTagMessage wxtagMessage = new WxMpMassTagMessage();
+        wxtagMessage.setMsgType("text");
+        wxtagMessage.setContent(sendReqVO.getContent());
+        try {
+            mpService.getMassMessageService().massGroupMessageSend(wxtagMessage);
+        } catch (WxErrorException e) {
+            throw exception(MESSAGE_SEND_FAIL, e.getError().getErrorMsg());
+        }
+        
+        return message;
+    }
 
     /**
      * 下载消息使用到的媒体文件,并上传到文件服务