Article
对象数组;2. 设置标题、描述、图片URL和跳转链接;3. 通过NewsMessage
类封装图文列表;4. 调用API发送消息,需依赖官方SDK处理消息组装和加密。什么是图文消息?
图文消息是一种融合文字、图片、链接等元素的富媒体内容格式,常见于微信公众号、企业微信、钉钉等平台,用户可通过图文消息获取结构化信息(如新闻、产品介绍),通常包含标题、封面图、摘要和正文链接,在Java开发中,创建图文消息的核心是通过API调用平台接口,构建符合规范的JSON/XML数据并发送。
创建图文消息的关键步骤(以微信公众号为例)
前置条件
- 公众号权限:已认证的服务号,开通图文消息接口权限。
- 访问令牌:通过AppID和AppSecret获取
access_token
(有效期2小时)。// 示例:获取access_token String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; ResponseEntity<String> response = restTemplate.getForEntity(url, String.class); JSONObject json = new JSONObject(response.getBody()); String accessToken = json.getString("access_token");
构建图文消息JSON数据结构
微信公众号要求图文消息以JSON数组格式提交,每条图文包含6个必要字段:
{ "articles": [ { "title": "Java图文消息教程", "thumb_media_id": "封面图片MediaID", "author": "作者名", "digest": "摘要文本", "show_cover_pic": 1, // 是否显示封面图(0/1) "content": "正文HTML内容", "content_source_url": "原文链接" } ] }
上传封面图片获取MediaID
使用media/upload
接口上传图片并获取thumb_media_id
:
// 示例:上传图片 String uploadUrl = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=TOKEN&type=image"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("media", new FileSystemResource("cover.jpg")); // 封面图片文件 HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(body, headers); String result = restTemplate.postForObject(uploadUrl, request, String.class); JSONObject jsonResult = new JSONObject(result); String thumbMediaId = jsonResult.getString("media_id"); // 关键ID
发送图文消息
调用material/add_news
接口提交图文数据:
String apiUrl = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=" + accessToken; JSONObject article = new JSONObject(); article.put("title", "Java图文消息教程"); article.put("thumb_media_id", thumbMediaId); article.put("author", "TechAuthor"); article.put("digest", "学习使用Java创建微信公众号图文消息"); article.put("show_cover_pic", 1); article.put("content", "<h1>正文标题</h1><p>使用HTML标签编写正文...</p>"); article.put("content_source_url", "https://example.com"); JSONArray articles = new JSONArray(); articles.put(article); JSONObject requestBody = new JSONObject(); requestBody.put("articles", articles); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> request = new HttpEntity<>(requestBody.toString(), headers); String response = restTemplate.postForObject(apiUrl, request, String.class); // 响应示例:{"media_id":"NEWS_MEDIA_ID"} 用于后续群发
技术栈与工具
- HTTP客户端
- Spring Boot的
RestTemplate
或WebClient
- Apache HttpClient
- Spring Boot的
- JSON处理
org.json.JSONObject
(轻量级)- Jackson库(高性能)
- HTML内容生成
- 使用Thymeleaf/Freemarker模板引擎动态生成
- 手动拼接HTML字符串(简单场景)
注意事项安全**
- 过滤用户输入的HTML标签(防止XSS攻击),推荐使用Jsoup:
String safeHtml = Jsoup.clean(rawHtml, Safelist.basic());
- 性能优化
- 复用
access_token
(避免频繁请求) - 图片压缩:封面图建议尺寸900×500像素,大小≤2MB
- 复用
- 平台限制
单次请求最多支持8条图文HTML长度不超过200KB
- 错误处理
- 检查接口返回的
errcode
(如40014表示token失效) - 重试机制(网络超时场景)
- 检查接口返回的
完整流程总结
- 获取
access_token
→ 2. 上传封面图得thumb_media_id
→ 3. 构建JSON请求体 → 4. 调用图文接口 → 5. 处理响应
最佳实践:生产环境建议封装图文消息工具类,集成Spring Boot Starter,通过配置中心管理AppID/Secret。
引用说明
- 微信公众号图文消息接口文档:微信官方文档
- JSON处理库:org.json
- HTML过滤工具:Jsoup
- Spring RestTemplate:Spring Framework Docs
遵循微信公众号最新API规范,适用于2025年10月后的接口版本,代码示例基于Java 11+Spring Boot 3.x实现。)
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/44641.html