| | |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import me.chanjar.weixin.cp.api.WxCpService; |
| | | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; |
| | | import me.chanjar.weixin.cp.bean.article.NewArticle; |
| | | import me.chanjar.weixin.cp.bean.message.WxCpMessage; |
| | | import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | return doSend(message, scope, target, "text"); |
| | | } |
| | | |
| | | @Override |
| | | public WxCpPushResultVO pushNews(String title, String description, String url, String picUrl, |
| | | Integer scope, String target) { |
| | | if (StrUtil.isBlank(url)) { |
| | | throw new IllegalArgumentException("推送图文消息时 url 不能为空"); |
| | | } |
| | | NewArticle article = NewArticle.builder() |
| | | .title(title) |
| | | .description(StrUtil.blankToDefault(description, "")) |
| | | .url(url) |
| | | .picUrl(picUrl) |
| | | .build(); |
| | | WxCpMessage message = WxCpMessage.NEWS() |
| | | .agentId(agentId()) |
| | | .addArticle(article) |
| | | .build(); |
| | | return doSend(message, scope, target, "news"); |
| | | } |
| | | |
| | | @Override |
| | | public WxCpPushResultVO pushFile(java.io.File file, String fileName, String textContent, |
| | | Integer scope, String target) { |
| | | if (file == null || !file.exists()) { |
| | | return new WxCpPushResultVO(false, null, "文件不存在,无法推送", null, null); |
| | | } |
| | | try { |
| | | // 1. 上传文件到企业微信,换取 mediaId |
| | | WxMediaUploadResult upload = wxCpService.getMediaService().upload("file", file); |
| | | if (upload == null || StrUtil.isBlank(upload.getMediaId())) { |
| | | return new WxCpPushResultVO(false, null, "文件上传企业微信失败", null, null); |
| | | } |
| | | // 2. 先发送说明文本,再发送文件;文本失败不阻塞文件发送 |
| | | if (StrUtil.isNotBlank(textContent)) { |
| | | pushText(textContent, scope, target); |
| | | } |
| | | // 3. 发送文件消息 |
| | | WxCpMessage message = WxCpMessage.FILE() |
| | | .agentId(agentId()) |
| | | .mediaId(upload.getMediaId()) |
| | | .build(); |
| | | WxCpPushResultVO result = doSend(message, scope, target, "file"); |
| | | log.info("[pushFile][文件推送完成 fileName={} success={}]", fileName, result.getSuccess()); |
| | | return result; |
| | | } catch (Exception e) { |
| | | log.error("[pushFile][文件上传或推送异常 fileName={}]", fileName, e); |
| | | return new WxCpPushResultVO(false, null, "文件推送异常:" + e.getMessage(), null, null); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public WxCpPushResultVO pushImage(java.io.File file, Integer scope, String target) { |
| | | if (file == null || !file.exists()) { |
| | | return new WxCpPushResultVO(false, null, "图片文件不存在,无法推送", null, null); |
| | | } |
| | | try { |
| | | // 企业微信图片消息要求先用 image 类型上传换取 mediaId |
| | | WxMediaUploadResult upload = wxCpService.getMediaService().upload("image", file); |
| | | if (upload == null || StrUtil.isBlank(upload.getMediaId())) { |
| | | return new WxCpPushResultVO(false, null, "图片上传企业微信失败", null, null); |
| | | } |
| | | WxCpMessage message = WxCpMessage.IMAGE() |
| | | .agentId(agentId()) |
| | | .mediaId(upload.getMediaId()) |
| | | .build(); |
| | | return doSend(message, scope, target, "image"); |
| | | } catch (Exception e) { |
| | | log.error("[pushImage][图片上传或推送异常 file={}]", file.getName(), e); |
| | | return new WxCpPushResultVO(false, null, "图片推送异常:" + e.getMessage(), null, null); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 统一处理接收者解析、发送与错误包装 |
| | | */ |