package cn.iocoder.yudao.module.mp.framework.mp.core.util; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; import jakarta.validation.Validator; /** * 公众号工具类 * * @author 芋道源码 */ @Slf4j public class MpUtils { /** * 校验消息的格式是否符合要求 * * @param type 类型 * @param message 消息 */ public static void validateMessage(Validator validator, String type, Object message) { // 获得对应的校验 group Class group; switch (type) { case WxConsts.XmlMsgType.TEXT: group = TextMessageGroup.class; break; case WxConsts.XmlMsgType.IMAGE: group = ImageMessageGroup.class; break; case WxConsts.XmlMsgType.VOICE: group = VoiceMessageGroup.class; break; case WxConsts.XmlMsgType.VIDEO: group = VideoMessageGroup.class; break; case WxConsts.XmlMsgType.NEWS: group = NewsMessageGroup.class; break; case WxConsts.XmlMsgType.MUSIC: group = MusicMessageGroup.class; break; default: log.error("[validateMessage][未知的消息类型({})]", message); throw new IllegalArgumentException("不支持的消息类型:" + type); } // 执行校验 ValidationUtils.validate(validator, message, group); } public static void validateButton(Validator validator, String type, String messageType, Object button) { if (StrUtil.isBlank(type)) { return; } // 获得对应的校验 group Class group; switch (type) { case WxConsts.MenuButtonType.CLICK: group = ClickButtonGroup.class; validateMessage(validator, messageType, button); // 需要额外校验回复的消息格式 break; case WxConsts.MenuButtonType.VIEW: group = ViewButtonGroup.class; break; case WxConsts.MenuButtonType.MINIPROGRAM: group = MiniProgramButtonGroup.class; break; case WxConsts.MenuButtonType.SCANCODE_WAITMSG: group = ScanCodeWaitMsgButtonGroup.class; validateMessage(validator, messageType, button); // 需要额外校验回复的消息格式 break; case "article_" + WxConsts.MenuButtonType.VIEW_LIMITED: group = ViewLimitedButtonGroup.class; break; case WxConsts.MenuButtonType.SCANCODE_PUSH: // 不用校验,直接 return 即可 case WxConsts.MenuButtonType.PIC_SYSPHOTO: case WxConsts.MenuButtonType.PIC_PHOTO_OR_ALBUM: case WxConsts.MenuButtonType.PIC_WEIXIN: case WxConsts.MenuButtonType.LOCATION_SELECT: return; default: log.error("[validateButton][未知的按钮({})]", button); throw new IllegalArgumentException("不支持的按钮类型:" + type); } // 执行校验 ValidationUtils.validate(validator, button, group); } /** * 根据消息类型,获得对应的媒体文件类型 * * 注意,不会返回 WxConsts.MediaFileType.THUMB,因为该类型会有明确标注 * * @param messageType 消息类型 {@link WxConsts.XmlMsgType} * @return 媒体文件类型 {@link WxConsts.MediaFileType} */ public static String getMediaFileType(String messageType) { switch (messageType) { case WxConsts.XmlMsgType.IMAGE: return WxConsts.MediaFileType.IMAGE; case WxConsts.XmlMsgType.VOICE: return WxConsts.MediaFileType.VOICE; case WxConsts.XmlMsgType.VIDEO: return WxConsts.MediaFileType.VIDEO; default: return WxConsts.MediaFileType.FILE; } } /** * Text 类型的消息,参数校验 Group */ public interface TextMessageGroup {} /** * Image 类型的消息,参数校验 Group */ public interface ImageMessageGroup {} /** * Voice 类型的消息,参数校验 Group */ public interface VoiceMessageGroup {} /** * Video 类型的消息,参数校验 Group */ public interface VideoMessageGroup {} /** * News 类型的消息,参数校验 Group */ public interface NewsMessageGroup {} /** * Music 类型的消息,参数校验 Group */ public interface MusicMessageGroup {} /** * Click 类型的按钮,参数校验 Group */ public interface ClickButtonGroup {} /** * View 类型的按钮,参数校验 Group */ public interface ViewButtonGroup {} /** * MiniProgram 类型的按钮,参数校验 Group */ public interface MiniProgramButtonGroup {} /** * SCANCODE_WAITMSG 类型的按钮,参数校验 Group */ public interface ScanCodeWaitMsgButtonGroup {} /** * VIEW_LIMITED 类型的按钮,参数校验 Group */ public interface ViewLimitedButtonGroup {} }