Java公众号开发系列(二):新增和获取临时素材

科技技术前后端 2024-04-13 02:51:07

公众号临时素材主要是解决使用接口发送消息时使用。下面介绍下如何通过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(); }}
0 阅读:1