天天看点

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();
    }
}