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

2024-01-28 08:43:18 浏览数 (2)

上一篇给大家介绍了如何获取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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞