天天看點

Java公衆号開發系列(二):新增和擷取臨時素材

作者:IT技術分享社群
Java公衆号開發系列(二):新增和擷取臨時素材

公衆号臨時素材主要是解決使用接口發送消息時使用。下面介紹下如何通過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();
    }
}

           

繼續閱讀