一个 Demo,记录一下发布公众号图文时需要用到的接口
公众号开发时需用到的一些网站
- 微信官方文档平台 ,开发公众号只用查看公众号那一块
- 微信公众平台接口测试帐号申请 ,申请公众号测试账号
- 微信公众平台接口调试工具 ,官方提供的接口测试工具
- WxJava 仓库 , WxJava仓库地址
- natapp ,内网穿透工具
1. 下载 WxJava 公众号 Demo
git clone https://github.com/Wechat-Group/weixin-java-demo-springmvc.git
2. 用微信扫码登录测试账号申请平台
修改 application.yml 文件的 appId 和 secret 值为网页上显示的,剩下的 token 和 aesKey 暂时不用管
网页上还有一个接口配置信息修改,需要填写接口配置信息,如果你有自己的域名及内网穿透工具,可以自行配置,如果没有,可以去 natapp 申请一个免费的
WxJava 提供的 Demo 验证路径已经写好,按照下面的方式填写,host 为 natapp 申请的域名, appID 和 token 为 yml 里面的配置
- URL: http://{host}/wx/portal/{appID}
- Token: token
启动 demo 项目,如果没有问题,在网页上提交,微信会发验证请求到 demo,然后验证成功
3. 开发图文发布接口
找到微信的发布接口 ,查看后,发布图文需要下面的前置步骤
- 要先将图文素材以草稿的形式保存,选择要发布的草稿 media_id 进行发布
- 新建草稿接口 ,提交参数的必填项 thumb_media_id 封面图片素材id 需要调用先调用素材接口
- 素材管理接口,分为临时素材接口和永久素材接口,永久素材接口又分成两个,上传图文消息内的图片获取URL 和 新增其他类型永久素材
- 临时素材接口,目前不用关注
- 永久素材接口
- 上传图文消息内的图片获取URL,不占用公众号的素材库中图片数量的100000个的限制
- 新增其他类型永久素材,保存总数量有上限:图文消息素材、图片素材上限为100000,其他类型为1000
有了上面的接口整理,我们可以理清思路,对于一篇图文,需要把封面上传新增其他类型永久素材,图文内的图片通过上传图文消息内的图片获取URL接口上传,防止占用容量
然后新建草稿,拿到图文草稿的 media_id,最后通过图文的 media_id 发布图文
4.编写代码
新建一个 TestController,编写第三步提到的逻辑
@AllArgsConstructor
@RestController
@RequestMapping("/test")
public class TestController {
private final WxMpService wxService;
//上传永久素材(占用容量)
@GetMapping("/imgId")
public String imgId() throws WxErrorException {
String image = "C:\\Users\\xxx\\Pictures\\test.jpg";
//永久图片 ID
WxMpMaterial wxMpMaterial = new WxMpMaterial("img", new File(image), "图片", "图片");
WxMpMaterialUploadResult wxMediaImgUploadResult = wxService.getMaterialService().materialFileUpload(WxConsts.MediaFileType.IMAGE, wxMpMaterial);
return wxMediaImgUploadResult.getMediaId();
}
//永久图片链接(不占用容量)
@GetMapping("/imgUrl")
public String imgUrl() throws WxErrorException {
String image = "C:\\Users\\xxx\\Pictures\\test.jpg";
//永久图片链接
WxMediaImgUploadResult wxMediaImgUploadResult = wxService.getMaterialService().mediaImgUpload(new File(image));
return wxMediaImgUploadResult.getUrl();
}
//草稿
@GetMapping("/draft")
public String draft() throws WxErrorException {
String imgMediaId = "";
String imgUrl = "";
WxMpAddDraft wxMpAddDraft = new WxMpAddDraft();
List<WxMpDraftArticles> wxMpDraftArticlesList = new ArrayList<>();
WxMpDraftArticles articles = new WxMpDraftArticles();
articles.setTitle("标题");
articles.setContent(String.format("正文<div><img src=\"%s\"> </div>", imgUrl));
articles.setThumbMediaId(imgMediaId);
wxMpDraftArticlesList.add(articles);
wxMpAddDraft.setArticles(wxMpDraftArticlesList);
WxMpAddDraft draftFromat = WxMpAddDraft.fromJson(wxMpAddDraft.toJson());
String mediaId = wxService.getDraftService().addDraft(draftFromat);
return mediaId;
}
//发布
@GetMapping("/submit")
public String submit() throws WxErrorException {
String mediaId = "";
String submit = wxService.getFreePublishService().submit(mediaId);
return submit;
}
}
- 调用 /test/imgId 得到返回封面图片素材 id
- 调用 /test/imgUrl 得到图文里面的图片 url
- 调用 /test/draft 提交草稿,注意把第一、二步调用得到的参数填入
- 调用 /test/submit 发布图文,注意把第三步调用得到的参数填入
- 一切正常后控制台会输出发布成功图文链接
5.其他一些内容
通过微信提供的网页端管理平台,可以在图文中插入视频,那么可以通过接口发布带视频的图文吗?
不行,起码目前(2022.10.07)不可以,通过接口上传的视频 微信反馈 目前没有审核流程,只会审核通过网页上传的视频,所以是无法发布的。
如果在图文中插入审核后的视频,可以通过接口发布带视频的图文吗?
查了一下资料,应该是可以的,不过不能用 video 标签,需要自己拼接视频 html,
思路是通过获取草稿接口,查看网页端新建的带视频的草稿,观察返回的 html 是怎么处理的,照葫芦画瓢,
不过不建议用,不稳定,因为微信接口文档没有正式提供带视频的图文发布接口