Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

本文主要是介绍Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,...

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发
在数字化营销与内容传播日益重要的今天,微信公众号已成为企业和个人进行信息发布与推广的重要平台。对于开发者而言,通过代码实现自动化的文章管理操作,如上传文章到草稿箱、群发文章等,能够极大提高工作效率。本文将详细介绍如何使用 Spring Boot 框架结合 WxJava 开发工具包,实现文章上传到微信公众号草稿箱以及群发功能。

一、项目环境准备

1.1 开发环境

JDK:建议使用 JDK 1.8 及以上版本,以确保与 Spring Boot 和 WxJava 的兼容性。
IDE:推荐使用 IntelliJ IDEA 或 Eclipse,两者都对 Spring Boot 项目有良好的支持。
Maven:用于项目依赖管理和构建,版本建议在 3.6 以上。

1.2 微信公众号准备

在开始开发前,需要提前准备好微信公众号的相关信息:
公众号 AppID:用于唯一标识你的公众号,在微信公众平台后台的 “开发 - 基本配置” 中获取。
公众号 AppSecret:与 AppID 配合使用,用于获取接口调用凭证(Access_token),同样在 “开发 - 基本配置” 中查看。
IP 白名单设置:为保证接口调用的安全性,需要将服务器的 IP 地址添加到微信公众平台后台的 “开发 - 基本配置 - IP 白名单” 中。

二、Spring Boot 项目搭建

2.1 创建 Spring Boot 项目

可以通过 Spring Initializr(https://start.spring.io/)快速创建一个 Spring Boot 项目,在创建过程中选择以下依赖:
Spring Web:用于构建 Web 应用,方便后续编写接口进行功能测试。
Lombok:简化 Java 代码,通过注解自动生成 getter、setter、构造函数等。

2.2 添加 WxJava 依赖

在项目的pom.XML文件中添加 WxJava 相关依赖:

    <dependency>
        <groupId>com.github.binarywang</groupId>
        <artifactId>weixin-java-mp</artifactId>
        <version>4.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.14.3</version> <!-- or latest version China编程-->
    </dependency>

WxJava 是一个优秀的微信开发 Java 工具包,weixin-java-mp模块专门用于微信公众号开发。然后这里发现还引入了jsoup,这肯定是大有用处,可接着看后续的内容。

三、配置微信公众号信息

在 Spring Boot 项目中,创建一个配置类用于加载微信公众号的 AppID 和 AppSecret 等信息。例如,创建WeChatConfig.java:

import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WeChatConfig {
    @Value("${wechat.mp.appId}")
    private String appId;
    @Value("${wechat.mp.appSecret}")
    private String appSecret;
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }
    @Bean
    public me.chanjar.weixin.mp.config.WxMpConfigStorage wxMpConfigStorage() {
        me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl wxMpConfigStorage = new me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl();
        wxMpConfigStorage.setAppId(appId);
        wxMpConfigStorage.setSecret(appSecret);
        return wxMpConfigStorage;
    }
}

同时,在application.propertiesapplication.yml文件中添加微信公众号的配置信息:

wechat.mp.appId=your_apChina编程p_id
wechat.mp.appSecret=your_app_secret

将your_app_id和your_app_secret替换为实际获取到的公众号 AppID 和 AppSecret。

四、实现文章上传到草稿箱

4.1 定义文章实体类

创建一个 Java 类用于表示微信公众号文章,例如WeChatArticle.java:
import lombok.Data;

@Data
public class WeChatArticle {
    private String title;
    private String content;
    private String author;
    // 其他文章属性,如封面图片URL等可根据需求添加
}

该类定义了文章的基本属性,如标题、内容和作者,可根据实际需求扩展更多属性。

4.2 编写上传草稿箱代码

创建一个服务类,如WeChatArticleService.java,用于实现上传文章到草稿箱的逻辑:

这里要特别注意,由于微信有些html标签不支持,所以需要将文章内容复制到专门的微信markdown编辑器中格式化后,在从编辑器复制出html出来,然后在通过代码上传。

import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.material.WxMpMassArticle;
import me.chanjar.weixin.mp.bean.material.WxMpMassArticleArticle;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUploadResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class WeChatArticleService {
    @Resource
    private WxMpService wxMpService;
    public String addDraft(String title, String content, String thumbnailUrl) throws WxErrorException {
        // 提取图片URL并替换
        List<String> imageUrls = extractImageUrls(content);
        for (String imgUrl : imageUrls) {
            String wechatUrl = uploadImage(imgUrl);
            content = content.replace(imgUrl, wechatUrl);
        }
        WxMpDraftArticles article = new WxMpDraftArticles();
        article.setAuthor("拾壹");
        article.setContent(content);
        article.setTitle(title);
        article.setThumbMediaId(mediaUploadInImage(thumbnailUrl));
        // 可根据需求设置更多文章属性,如封面图片等
        WxMpAddDraft news = new WxMpAddDraft();
        news.setArticles(Collections.singletonList(article));
        return wxMpService.getDraftService().addDraft(news);
    }
      /**
     * 根据url上传永久素材
     * @param url 图片url
     * @return 微信素材ID
     */
    public String mediaUploadInImage(String url) throws IOException, WxErrorException {
        byte[] bytes = this.downloadImage(url);
        File file = convert(bytes);
        String mediaId = materialFileUpload("image",file);
        FileUtil.del(file);
        return mediaId;
    }
    /**
     * 根据文件上传永久素材
     * @param type 文件类型
     * @param file 文件
     * @return 微信素材ID
     */
    public String materialFileUpload(String type,File file) throws IOException, WxErrorException {
        WxMpMaterial wxMpMaterial = new WxMpMaterial();
        wxMpMaterial.setFile(file);
        WxMpMaterialUploadResult image = wxMpService.getMaterialService().materialFileUpload(type,wxMpMaterial);
        return image.getMediaId();
    }
      /**
     * 根据url上传图片
     * @param url 图片url
     * @return 微信可访问的url地址
     */
    public String uploadImage(String url) throws IOException, WxErrorException {
        byte[] bytes = this.downloadImage(url);
        //bytes转成file
        File file = convert(bytes);
        WxMediaImgUploadResult wxMediaImgUploadResult = wxMpService.getMaterialService().mediaImgUpload(file);
        FileUtil.del(file);
        return wxMediaImgUploadResult.getUrl();
    }
      /**
     * byte[] 转 File
     *
     * @param bytes
     * @return
     * @throws IOException
     */
    public static File convert(byte[] bytes) throws IOException {
        // 创建一个临时文件
        File tempFile = File.createTempFile("temp-", ".png");
        // 使用 FileOutputStream 将字节数组写入文件
        try (FileOutputStream fos = new FileOutputStream(tempFile)) {
            fos.write(bytes);
        }
        return tempFile;
    }
      /**
     * 下载图片
     *
     * @param url
     * @return
     */
    private byte[] downloadImage(String url) {
        return new RestTemplate().getForObject(url, byte[].class);
    }
      /**
     * 提取 HTML 中的图片 URL
 GJjqfUd    */
    private List<String> extractImageUrls(String html) {
        org.jsoup.nodes.Document doc = Jsoup.parse(html);
        return doc.select("img").stream()
                .map(img -> img.attr("src"))
                .collect(Collectors.toList());
    }
}

上述代码将WeChatArticle对象转换为 WxJava 中的文章对象格式,并调用WxMpService编程China编程的接口方法将文章上传到草稿箱,返回文章的 mediaId,后续群发文章时会用到该 mediaId。
然后就是因为公众号不能用其他外链的图片,然后我们的图片基本都是已经上传好了的外链地址,所以需要先将图片上传到公众号,然后再替换成返回的公众号图片url地址。

五、实现文章群发功能

在WeChatArticleService.java中继续添加文章群发的方法:

import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.material.WxMpMassArticle;
import me.chanjar.weixin.mp.bean.material.WxMpMassArticleArticle;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUploadResult;
import me.chanjar.weixin.mp.bean.message.WxMpMassMessage;
import me.chanjar.weixin.mp.bean.message.WxMpMassMessageResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class WeChatArticleService {
    public void wechatSendAll(String mediaId)www.chinasem.cn {
        try {
            WxMpDraftInfo draft = wxMpService.getDraftService().getDraft(mediaId);
            if (draft == null || draft.getNewsItem() == null || draft.getNewsItem().isEmpty()) {
                throw new ServiceException("无效的mediaId: " + mediaId);
            }
            WxMpMassTagMessage wxMpMassTagMessage = new WxMpMassTagMessage();
            wxMpMassTagMessage.setMediaId(mediaId);
            wxMpMassTagMessage.setMsgType("mpnews");
            wxMpMassTagMessage.setSendAll(true);
            wxMpMassTagMessage.setSendIgnoreReprint(true);
            wxMpService.getMassMessageService().massGroupMessageSend(wxMpMassTagMessage);
        } catch (WxErrorException e) {
            log.error("微信群发失败", e);
            throw new RuntimeException(e);
        }
    }
}

该方法通过传入文章的 mediaId,构建群发消息对象,并调用WxMpService的群发接口将文章发送给公众号的关注用户。

七、总结与注意事项

通过上述步骤,我们成功实现了使用 Spring Boot 和 WxJava 将文章上传到微信公众号草稿箱以及群发的功能。在实际开发过程中,还需要注意以下几点:
接口调用频率限制:微信公众号接口对调用频率有一定限制,需合理控制接口调用次数,避免因频率过高导致调用失败。
错误处理:代码中对WxErrorException进行了简单抛出,实际应用中应根据具体错误码进行更详细的错误处理和日志记录。
内容审核:群发的文章内容需符合微信公众平台的相关规定,否则可能导致文章发送失败或公众号受到处罚。
希望本文能帮助你快速掌握使用 Spring Boot 和 WxJava 进行微信公众号文章管理开发的技能,进一步拓展公众号的自动化运营能力。
上述文章涵盖了完整的实现流程与要点。你可以说说对文章篇幅、某些技术细节讲解的看法,若有特殊需求,我可进一步修改。

到此这篇关于Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发的文章就介绍到这了,更多相关Spring Boot WxJava上传微信公众号草稿箱与群发内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155375

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三