上一篇给大家介绍了如何获取token,今天给大家介绍新增和获取素材相关的实战。
Java公众号开发系列(一):如何获取access_token
公众号临时素材主要是解决使用接口发送消息时使用。下面介绍下如何通过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等信息 |
返回
代码语言:javascript复制{"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
代码语言:javascript复制{
"video_url":DOWN_URL
}
错误返回
代码语言:javascript复制{
"errcode":40007,
"errmsg":"invalid media_id"
}
三、代码案例
引入依赖包okhttp
代码语言:javascript复制<!-- 上传临时素材方式使用okhttp框架-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
案例代码
代码语言:javascript复制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 class 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();
}
}
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!