• 微信公众号开发之新增永久其他(图片、声音、视频)素材(九)


    对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。

    请注意:

    1、最近更新:永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。

    2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为100000,其他类型为1000。

    3、素材的格式大小等要求与公众平台官网一致:

    图片(image): 2M,支持bmp/png/jpeg/jpg/gif格式

    语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式

    视频(video):10MB,支持MP4格式

    缩略图(thumb):64KB,支持JPG格式

    4、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。

    5、"上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的100000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。

    6、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。

    一、新增其他类型永久素材

    接口调用请求说明

    通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。

    http请求方式: POST,需使用https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE 调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材,curl命令的使用请自行查阅资料)

    参数说明

    参数是否必须说明
    access_token 调用接口凭证
    type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
    media form-data中媒体文件标识,有filename、filelength、content-type等信息

    新增永久视频素材需特别注意

    在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON,格式如下: 

    {
        "title":VIDEO_TITLE,
        "introduction":INTRODUCTION
    }

    新建一个MaterialUtil在其中新增一个addMaterialFilePath方法用作上传永久素材,包括四个参数

    /**
         * 添加永久素菜
         * 新增永久视频素材需特别注意,在上传视频素材时需要POST另一个表单,包含素材的描述信息,内容格式为JSON
         */
        public String addMaterialFilePath(String filePath, String type,
                                  String title, String introduction) {
    
            String accessToken = accessTokenUtil.getAccessToken();
            if (accessToken != null) {
                String url = URIConstant.ADD_MATERIAL_URL.replace("ACCESS_TOKEN", accessToken)
                        .replace("TYPE", type);
                log.info("ADD_MATERIAL_URL:{}",url);
    
                //设置请求体,注意是LinkedMultiValueMap
                MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
                if("vedio".equalsIgnoreCase(type)){
                    if(!StringUtils.isEmpty(title) && !StringUtils.isEmpty(introduction)){
                        data.add("title", title);
                        data.add("introduction", introduction);
                    }
                }
    
                //设置上传文件
                FileSystemResource fileSystemResource = new FileSystemResource(filePath);
                data.add("media", fileSystemResource);
    
                //上传文件,设置请求头
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
                httpHeaders.setContentLength(fileSystemResource.getFile().length());
    
                HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data,
                        httpHeaders);
                try{
                    //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
                    String resultString = restTemplate.postForObject(url, requestEntity, String.class);
                    log.info("上传返回的信息是:{}",resultString);
                    return resultString;
                }catch (Exception e){
                    log.error(e.getMessage());
                }
            }
            return null;
    
        }

     

    我们编写一个Controller,在里面写一个方法用在swagger里测试一下

     /**
         * 添加永久素材列表
         */
        @ApiOperation(value = "添加永久素材FilePath")
        @RequestMapping(value = "/addMaterialFilePath", method = RequestMethod.POST)
        @ApiImplicitParams({
                @ApiImplicitParam(name="filePath",value="文件路径", paramType="query",dataType="String"),
                @ApiImplicitParam(name="title",value="视频素材的标题", paramType="query",dataType="String"),
                @ApiImplicitParam(name="introduction",value="视频素材的描述", paramType="query",dataType="String"),
                @ApiImplicitParam(name="type",value="素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)", paramType="query",dataType="String")
        })
        public Object addMaterialFilePath(String filePath, String type,
                                          String title, String introduction) {
    
            String tempString = materialUtil.addMaterialFilePath(filePath, type, title, introduction);
            return tempString;
    
        }

    在swagger中提交一个图片,测试一下

     可以看到,我们成功获取到了上传素材文件的media_id

    二、获取(下载) 永久素材

    再写一个获取(下载)永久素材的方法downloadMaterialImage

    /**
         * 根据mediaId获取永久素菜
         */
        public ResponseEntity<byte[]> downloadMaterialImage(String mediaId){
    
            String accessToken = accessTokenUtil.getAccessToken();
            if(accessToken != null) {
                String url = URIConstant.GET_MATERIAL_URL.replace("ACCESS_TOKEN", accessToken);
                log.info("GET_MATERIAL_URL:{}", url);
    
                String fileName = mediaId+ ".jpg";
                JSONObject data = new JSONObject();
                data.put("media_id", mediaId);
    
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    
                try {
                    fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                headers.setContentDispositionFormData("attachment", fileName);// 文件名称
                ResponseEntity<byte[]> responseEntity = restTemplate.postForEntity(url, data, byte[].class);
                return responseEntity;
            }
            return null;
        }

     

    我们在swagger里再写一个获取(下载)永久素材的方法

    在swagger中测试我们的获取(下载)永久素材

    点击Download file下载文件

    打开这个文件看看,确认是我们上传的永久素材图片

    另外,我们还有几个接口,比如

    1、getMaterialcount【统计每种永久素材的数量】

     

    /**
     * 获取素菜数量
     * @return
     */
    public String getMaterialcount(){
    
        String accessToken = accessTokenUtil.getAccessToken();
        if(accessToken != null){
            String url = URIConstant.GET_MATERIALCOUNT_URL.replace("ACCESS_TOKEN", accessToken);
            //发起GET请求
            String resultString = restTemplate.getForObject(url, String.class);
            return resultString;
        }
        return null;
    }

    2、batchgetMaterial(String type, Integer offset, Integer count)【获取素菜列表】

    /**
     * 获取素菜列表
     * @return
     */
    public String batchgetMaterial(String type, Integer offset, Integer count){
    
        String accessToken = accessTokenUtil.getAccessToken();
        if(accessToken != null){
            String url = URIConstant.BATCHGET_MATERIAL_URL.replace("ACCESS_TOKEN", accessToken);
            log.info("BATCHGET_MATERIAL_URL:{}",url);
    
            JSONObject jsonObject = new JSONObject();
            //素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
            jsonObject.put("type", type);
            //从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
            jsonObject.put("offset", offset);
            //返回素材的数量,取值在1到20之间
            jsonObject.put("count", count);
    
            //发起POST请求
            String resultString = restTemplate.postForObject(url, jsonObject.toJSONString(),String.class);
            return resultString;
        }
        return null;
    }

     

    本篇先到这里,我们下回再见!

    如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!

  • 相关阅读:
    linux sqlite replace into
    编译原理
    什么是协程
    从源码解析Nginx对 Native aio支持_运维_youbingchen的博客-CSDN博客 https://blog.csdn.net/youbingchen/article/details/51767587
    SSL_ERROR_WANT_READ
    阻塞事务提交
    nysql 定时器
    __init__ raises an exception, then __del__ will still be called
    int ping = 11; 限流 客户端验证与服务端是连接的
    四元组一样
  • 原文地址:https://www.cnblogs.com/xulijun137/p/12213643.html
Copyright © 2020-2023  润新知