公众号临时素材主要是解决使用接口发送消息时使用。下面介绍下如何通过java实现相应的操作。
一、公众号临时素材特点1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效
3、文件格式大小限制如下表格
类型
格式
大小限制
长度限制
图片
PNG, JPEG, JPG, GIF
2MB
●
语音
AMR, MP3
2MB
60秒
视频
MP4
10MB
●
缩略图
JPG
64KB
●
二、请求说明新增临时素材接口请求
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
http请求方式:POST/FORM
参数
是否必须
说明
access_token
是
调用接口凭证
type
是
媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
media
是
form-data中媒体文件标识,有filename、filelength、content-type等信息
返回
{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}{"errcode":40004,"errmsg":"invalid media type"}获取临时素材接口请求
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
参数
是否必须
说明
access_token
是
调用接口凭证
media_id
是
媒体文件ID
响应
取临时素材(即下载临时的多媒体文件),浏览器访问直接下载文件,也可以后台调用接口获得byte字节数组,然后后台根据实际业务保存或者发送消息。
注意:如果是视频素材返回的是下载url
{ "video_url":DOWN_URL}错误返回
{ "errcode":40007, "errmsg":"invalid media_id"}三、代码案例引入依赖包okhttp<!-- 上传临时素材方式使用okhttp框架--><dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version></dependency>案例代码import cn.hutool.core.util.StrUtil;import cn.hutool.http.HttpUtil;import cn.hutool.json.JSONObject;import cn.hutool.json.JSONUtil;import java.io.*;import java.net.URL;import java.util.Objects;import okhttp3.*;/** * 临时素材上传、下载 */public Demo2_AddTemporaryMedia { public static void main(String[] args) throws IOException { String imgurl = "https://developer.qcloudimg.com/user/attachment/4392601/20231019-977f3b10.png"; // 获取公众号token String token = ""; //上传图片素材 String mediaId= uploadTemporaryMedia(imgurl, token); // 下载图片素材到本地 GetTemporaryMediaByMediaId(mediaId,token); } /** * 上传临时素材获取 media_id * * @param imageUrl * @param accessToken * @return * @throws IOException */ private static String uploadTemporaryMedia(String imageUrl, String accessToken) throws IOException { URL url = new URL(imageUrl); InputStream inputStream = url.openStream(); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("media", "image.png", RequestBody.create(MediaType.parse("image/png"), Objects.requireNonNull(inputStreamToBytes(inputStream)))) .build(); Request request = new Request.Builder() .url("https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accessToken + "&type=image") .post(requestBody) .build(); Response response = client.newCall(request).execute(); String responseBody = ""; if (response.isSuccessful()) { responseBody = Objects.requireNonNull(response.body()).string(); System.out.println(responseBody); } else { System.out.println("Request failed: " + response.code() + " - " + response.message()); } response.close(); // 解析返回结果,获取上传后的媒体 ID JSONObject result = JSONUtil.parseObj(responseBody); System.out.println(result.get("media_id").toString()); return result.get("media_id").toString(); } /** * 下载微信素材到本地 * @param mediaId 媒体id * @param accessToken 公众号token * @throws FileNotFoundException */ private static void GetTemporaryMediaByMediaId(String mediaId, String accessToken) throws FileNotFoundException { String url = StrUtil.format("https://api.weixin.qq.com/cgi-bin/media/get?access_token={}&media_id={}", accessToken, mediaId); HttpUtil.downloadFile(url,"D:\\test.png"); } /** * 转为为byte数组 * * @param inputStream * @return * @throws IOException */ private static byte[] inputStreamToBytes(InputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, bytesRead); } byteArrayOutputStream.close(); return byteArrayOutputStream.toByteArray(); }}