公衆号臨時素材主要是解決使用接口發送消息時使用。下面介紹下如何通過java實作相應的操作。
一、公衆号臨時素材特點
1、臨時素材media_id是可複用的。
2、媒體檔案在微信背景儲存時間為3天,即3天後media_id失效
3、檔案格式大小限制如下表格
類型 | 格式 | 大小限制 | 長度限制 |
圖檔 | PNG, JPEG, JPG, GIF | 2MB | ● |
語音 | AMR, MP3 | 2MB | 60秒 |
視訊 | MP4 | 10MB | ● |
縮略圖 | JPG | 64KB | ● |
二、請求說明
新增臨時素材接口
請求
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"}
擷取臨時素材接口
請求
參數 | 是否必須 | 說明 |
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 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();
}
}