Commit 63e319e6639c4ac387f98fb85d5e6835b3c2af2c

Authored by puhui999
1 parent 02f4d382

【新增】SYSTEM: 发送微信小程序订阅消息

yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java
1 package cn.iocoder.yudao.module.system.api.social; 1 package cn.iocoder.yudao.module.system.api.social;
2 2
3 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;  
4 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;  
5 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO;  
6 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; 3 +import cn.iocoder.yudao.module.system.api.social.dto.*;
7 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
8 import jakarta.validation.Valid; 5 import jakarta.validation.Valid;
9 6
@@ -59,4 +56,11 @@ public interface SocialClientApi { @@ -59,4 +56,11 @@ public interface SocialClientApi {
59 */ 56 */
60 List<SocialWxSubscribeTemplateRespDTO> getSubscribeTemplate(); 57 List<SocialWxSubscribeTemplateRespDTO> getSubscribeTemplate();
61 58
  59 + /**
  60 + * 发送订阅消息
  61 + *
  62 + * @param reqDTO 请求
  63 + */
  64 + void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO);
  65 +
62 } 66 }
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.social.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
  4 +import lombok.Data;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 微信小程序订阅消息 Request DTO
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +@Data
  14 +public class SocialWxSubscribeMessageReqDTO {
  15 +
  16 + /**
  17 + * 接收者(用户)的 openid.
  18 + * <pre>
  19 + * 参数:touser
  20 + * 是否必填: 是
  21 + * 描述: 接收者(用户)的 openid
  22 + * </pre>
  23 + */
  24 + private String toUser;
  25 +
  26 + /**
  27 + * 所需下发的模板消息的id.
  28 + * <pre>
  29 + * 参数:template_id
  30 + * 是否必填: 是
  31 + * 描述: 所需下发的模板消息的id
  32 + * </pre>
  33 + */
  34 + private String templateId;
  35 +
  36 + /**
  37 + * 点击模板卡片后的跳转页面,仅限本小程序内的页面.
  38 + * <pre>
  39 + * 参数:page
  40 + * 是否必填: 否
  41 + * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
  42 + * </pre>
  43 + */
  44 + private String page;
  45 +
  46 + /**
  47 + * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
  48 + *
  49 + * 枚举 WxMaConstants.MiniProgramState
  50 + */
  51 + private String miniprogramState;
  52 +
  53 + /**
  54 + * 进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
  55 + *
  56 + * 枚举 WxMaConstants.MiniProgramLang
  57 + */
  58 + private String lang;
  59 +
  60 + /**
  61 + * 模板内容,不填则下发空模板.
  62 + * <pre>
  63 + * 参数:data
  64 + * 是否必填: 是
  65 + * 描述: 模板内容,不填则下发空模板
  66 + * </pre>
  67 + */
  68 + private List<KeyValue<String, String>> data;
  69 +
  70 +}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
@@ -122,6 +122,7 @@ public interface ErrorCodeConstants { @@ -122,6 +122,7 @@ public interface ErrorCodeConstants {
122 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); 122 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败");
123 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); 123 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败");
124 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); 124 ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败");
  125 + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败");
125 ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); 126 ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在");
126 ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置"); 127 ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置");
127 128
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java
@@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.system.api.social; @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.system.api.social;
2 2
3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;  
6 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;  
7 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO;  
8 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; 5 +import cn.iocoder.yudao.module.system.api.social.dto.*;
9 import cn.iocoder.yudao.module.system.service.social.SocialClientService; 6 import cn.iocoder.yudao.module.system.service.social.SocialClientService;
10 import jakarta.annotation.Resource; 7 import jakarta.annotation.Resource;
11 import me.chanjar.weixin.common.bean.WxJsapiSignature; 8 import me.chanjar.weixin.common.bean.WxJsapiSignature;
@@ -55,4 +52,9 @@ public class SocialClientApiImpl implements SocialClientApi { @@ -55,4 +52,9 @@ public class SocialClientApiImpl implements SocialClientApi {
55 return BeanUtils.toBean(subscribeTemplate, SocialWxSubscribeTemplateRespDTO.class); 52 return BeanUtils.toBean(subscribeTemplate, SocialWxSubscribeTemplateRespDTO.class);
56 } 53 }
57 54
  55 + @Override
  56 + public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) {
  57 + socialClientService.sendSubscribeMessage(reqDTO);
  58 + }
  59 +
58 } 60 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.social; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.social;
3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; 5 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO;
6 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
7 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; 8 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO;
8 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; 9 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
@@ -72,6 +73,20 @@ public interface SocialClientService { @@ -72,6 +73,20 @@ public interface SocialClientService {
72 */ 73 */
73 byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO); 74 byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO);
74 75
  76 + /**
  77 + * 获得微信小程订阅模板
  78 + *
  79 + * @return 微信小程订阅模板
  80 + */
  81 + List<TemplateInfo> getSubscribeTemplate();
  82 +
  83 + /**
  84 + * 发送订阅消息
  85 + *
  86 + * @param reqDTO 请求
  87 + */
  88 + void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO);
  89 +
75 // =================== 客户端管理 =================== 90 // =================== 客户端管理 ===================
76 91
77 /** 92 /**
@@ -112,11 +127,4 @@ public interface SocialClientService { @@ -112,11 +127,4 @@ public interface SocialClientService {
112 */ 127 */
113 PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO); 128 PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO);
114 129
115 - /**  
116 - * 获得微信小程订阅模板  
117 - *  
118 - * @return 微信小程订阅模板  
119 - */  
120 - List<TemplateInfo> getSubscribeTemplate();  
121 -  
122 } 130 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
@@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService; @@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
4 import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; 4 import cn.binarywang.wx.miniapp.api.WxMaSubscribeService;
5 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; 5 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
6 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 6 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  7 +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
7 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; 8 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
8 import cn.hutool.core.bean.BeanUtil; 9 import cn.hutool.core.bean.BeanUtil;
9 import cn.hutool.core.lang.Assert; 10 import cn.hutool.core.lang.Assert;
@@ -16,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; @@ -16,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.cache.CacheUtils;
16 import cn.iocoder.yudao.framework.common.util.http.HttpUtils; 17 import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
17 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 18 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
18 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; 19 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO;
  20 +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO;
19 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; 21 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
20 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; 22 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO;
21 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; 23 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
@@ -258,6 +260,32 @@ public class SocialClientServiceImpl implements SocialClientService { @@ -258,6 +260,32 @@ public class SocialClientServiceImpl implements SocialClientService {
258 } 260 }
259 } 261 }
260 262
  263 + @Override
  264 + public List<TemplateInfo> getSubscribeTemplate() {
  265 + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());
  266 + try {
  267 + WxMaSubscribeService subscribeService = service.getSubscribeService();
  268 + return subscribeService.getTemplateList();
  269 + }catch (WxErrorException e) {
  270 + log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e);
  271 + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR);
  272 + }
  273 + }
  274 +
  275 + @Override
  276 + public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) {
  277 + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());
  278 + try {
  279 + WxMaSubscribeService subscribeService = service.getSubscribeService();
  280 + WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class);
  281 + reqDTO.getData().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue())));
  282 + subscribeService.sendSubscribeMsg(message);
  283 + }catch (WxErrorException e) {
  284 + log.error("[sendSubscribeMessage][发送小程序订阅消息]", e);
  285 + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR);
  286 + }
  287 + }
  288 +
261 /** 289 /**
262 * 获得 clientId + clientSecret 对应的 WxMpService 对象 290 * 获得 clientId + clientSecret 对应的 WxMpService 对象
263 * 291 *
@@ -367,16 +395,4 @@ public class SocialClientServiceImpl implements SocialClientService { @@ -367,16 +395,4 @@ public class SocialClientServiceImpl implements SocialClientService {
367 return socialClientMapper.selectPage(pageReqVO); 395 return socialClientMapper.selectPage(pageReqVO);
368 } 396 }
369 397
370 - @Override  
371 - public List<TemplateInfo> getSubscribeTemplate() {  
372 - WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());  
373 - try {  
374 - WxMaSubscribeService subscribeService = service.getSubscribeService();  
375 - return subscribeService.getTemplateList();  
376 - }catch (WxErrorException e) {  
377 - log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e);  
378 - throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR);  
379 - }  
380 - }  
381 -  
382 } 398 }