Java微信公众平台开发之素材管理(Spring Boot 2.X)

微信素材管理和群发这块文档对Java很不友好。本文只对新增临时素材,新增永久素材做介绍,其余获取、删除、修改自行补充

公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。

素材的限制

图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式

一、新增临时素材

接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,再传一个媒体文件类型,可以是图片(image)、语音(voice)、视频(video)和缩略图(thumb)。

1、订阅号和服务号要通过认证
2、临时素材media_id是可复用的
3、媒体文件在微信后台保存时间为3天,即3天后media_id失效。

/**
     * 新增临时素材(本地)
     *
     * @param accessToken
     * @param type        媒体文件类型,分别有图片(image)、语音(voice)、(video)和缩略图(thumb)
     * @param filePath    本地路径
     * @return
     */
    @Override
    public MaterialResult uploadTempMediaFile(String accessToken, String type, String filePath) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", type);
        try {
            String result = MaterialUtil.uploadMediaFile(wechatMaterialConfig.getUploadTempMediaUrl(), params, filePath);
            return JsonUtil.fromJson(result, MaterialResult.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 新增临时素材(网络)
     *
     * @param accessToken
     * @param type        媒体文件类型,分别有图片(image)、语音(voice)、(video)和缩略图(thumb)
     * @param url         网络路径
     * @return
     */
    @Override
    public MaterialResult uploadTempMediaUrl(String accessToken, String type, String url) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", type);
        try {
            String result = MaterialUtil.uploadMediaUrl(wechatMaterialConfig.getUploadTempMediaUrl(), params, url);
            return JsonUtil.fromJson(result, MaterialResult.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

二、新增永久素材

接口:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE,媒体文件类型,分别有图片(image)、语音(voice)、视频(video,例外)和缩略图(thumb)

/**
     * 新增永久素材(本地)
     *
     * @param accessToken
     * @param type        媒体文件类型,分别有图片(image)、语音(voice)和缩略图(thumb)
     * @param filePath    本地路径
     * @return
     */
    @Override
    public MaterialResult uploadForeverMediaFile(String accessToken, String type, String filePath) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", type);
        try {
            String result = MaterialUtil.uploadMediaFile(wechatMaterialConfig.getUploadForeverMediaUrl(), params, filePath);
            return JsonUtil.fromJson(result, MaterialResult.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 新增永久素材(网络)
     *
     * @param accessToken
     * @param type        媒体文件类型,分别有图片(image)、语音(voice)和缩略图(thumb)
     * @param url         网络路径
     * @return
     */
    @Override
    public MaterialResult uploadForeverMediaUrl(String accessToken, String type, String url) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", type);
        try {
            String result = MaterialUtil.uploadMediaUrl(wechatMaterialConfig.getUploadForeverMediaUrl(), params, url);
            return JsonUtil.fromJson(result, MaterialResult.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

新增永久视频素材需特别注意,在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息title和introduction,内容格式为JSON

/**
     * 上传本地video永久素材
     * 返回格式
     * {
     * "media_id":MEDIA_ID
     * }
     *
     * @param accessToken
     * @param title        视频素材的标题
     * @param introduction 视频素材的描述
     * @param filePath     本地路径
     * @return
     */
    @Override
    public String uploadForeverMediaFile(String accessToken, String title, String introduction, String filePath) {
        //只能是mp4的
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_VIDEO);
        try {
            String result = MaterialUtil.uploadVideoMediaFile(wechatMaterialConfig.getUploadForeverMediaUrl(),
                    params, filePath, title, introduction);
            return JsonUtil.fromJson(result, MaterialResult.class).getMediaId();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * 上传网络video永久素材
     * 返回格式
     * {
     * "media_id":MEDIA_ID
     * }
     *
     * @param accessToken
     * @param title        视频素材的标题
     * @param introduction 视频素材的描述
     * @param url          网络路径
     * @return
     */
    @Override
    public String uploadForeverMediaUrl(String accessToken, String title, String introduction, String url) {
        //只能是mp4的
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        params.put("type", WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_VIDEO);
        try {
            String result = MaterialUtil.uploadVideoMediaUrl(wechatMaterialConfig.getUploadForeverMediaUrl(),
                    params, url, title, introduction);
//            log.error(result);
            return JsonUtil.fromJson(result, MaterialResult.class).getMediaId();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

三、新增永久图文素材

接口:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
 对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用.
1、永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
3、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。
4、"上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
5、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。

 /**
     * 新增永久图文素材
     * 返回示例
     * {
     * "media_id":MEDIA_ID
     * }
     * 活得新增的图文消息素材的media_id
     *
     * @param accessToken
     * @param entity      图文消息article组合的data
     * @return
     * @see WechatMassService#uploadForMassNewsFile
     */
    @Override
    public String uploadNewsMedia(String accessToken, UploadNewsEntity entity) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        String data = JsonUtil.toJson(entity);
        String result = HttpUtil.doPost(wechatMaterialConfig.getAddNewsUrl(), params, data);
        return JsonUtil.fromJson(result, MassNewsResult.class).getMediaId();
    }

四、上传图文消息内的图片获取URL

接口:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下,此接口返回的url就是上传图片的URL,可放置图文消息中使用。

  /**
     * {
     * "url":  "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
     * }
     * 图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取
     * 获取
     *
     * @param accessToken
     * @param filePath    本地路径
     * @return
     */
    @Override
    public String uploadFileForNewsMedia(String accessToken, String filePath) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        try {
            String result = MaterialUtil.uploadMediaFile(wechatMaterialConfig.getUploadimgMediaUrl(), params, filePath);
            return JsonUtil.fromJson(result, MaterialResult.class).getUrl();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    /**
     * {
     * "url":  "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
     * }
     * 图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取
     * 获取
     *
     * @param accessToken
     * @param url         网络路径
     * @return
     */
    @Override
    public String uploadUrlForNewsMedia(String accessToken, String url) {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", accessToken);
        try {
            String result = MaterialUtil.uploadMediaUrl(wechatMaterialConfig.getUploadimgMediaUrl(), params, url);
            return JsonUtil.fromJson(result, MaterialResult.class).getUrl();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

五、Junit测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = WechatMainApplication.class)
@ActiveProfiles("dev")
public class WechatMaterialServiceImplTest {

    @Autowired
    private WechatAuthService wechatAuthService;

    @Autowired
    private WechatMaterialService wechatMaterialService;

    @Test
    public void uploadTempMediaFile() {
        String filePath = "C:/Users/Phil/Pictures/cc0a42661f668d17e18d0a0f3a699909.jpeg";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增临时本地图片素材,返回" + wechatMaterialService.uploadTempMediaFile(accessToken,
                WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_IMAGE, filePath));
        //新增临时本地图片素材,返回MassNewsResult(type=image, mediaId=rh0D9L_B5Ty_-EcwIFULGjb57eCGAbQZRz8bNrWnfcLMiMz2Pm7vIQCdUKzC8C_8, createdAt=1543648966, url=null)
    }

    @Test
    public void uploadTempMediaUrl() {
        String url = "http://b-ssl.duitang.com/uploads/item/201503/14/20150314212812_kCLmy.jpeg";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增临时网络图片素材,返回 " + wechatMaterialService.uploadTempMediaUrl(accessToken,
                WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_IMAGE, url));
        //新增临时网络图片素材,返回 MassNewsResult(type=image, mediaId=lgbD-K0ltDTmsW2dSxus6sFxqqFc3mU_NiIAOev_U_mU2Yqa6iSv8KPF5e5WE7yC, createdAt=1543648973, url=null)
    }

    @Test
    public void uploadForeverMediaFile() {
        String filePath = "C:/Users/Phil/Pictures/cc0a42661f668d17e18d0a0f3a699909.jpeg";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增永久本地图片素材,返回" + wechatMaterialService.uploadForeverMediaFile(accessToken,
                WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_IMAGE, filePath));
        //新增永久本地图片素材,返回MassNewsResult(type=null, mediaId=tbP52CbH1vuCLlyUAt2rlUEZKK230SjWIaB9xablAPw, createdAt=0, url=http://mmbiz.qpic.cn/mmbiz_jpg/L8zibbZGicwDyd6CV9JpbEe6T7rjqK2fBibCrZAxEvwDCJKHAgtfUialcnNlcjxTsAmycHSKjrO6KzdDUMeDwhYsIA/0?wx_fmt=jpeg)
    }

    @Test
    public void uploadForeverMediaUrl() {
        String url = "http://www.59xihuan.cn/uploads/allimg/201309/9181378183464-lp.jpg";
//        String url = "http://b-ssl.duitang.com/uploads/item/201503/14/20150314212812_kCLmy.jpeg";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增永久网络图片素材, 返回" + wechatMaterialService.uploadForeverMediaUrl(accessToken,
                WechatMaterialConstant.MATERIAL_UPLOAD_TYPE_IMAGE, url));
        //新增永久网络图片素材, 返回MassNewsResult(type=null, mediaId=GG16CzQSj3di2OTScAcNAzmoxg_5_KTyxsJ6uEEBpiM, createdAt=0, url=http://mmbiz.qpic.cn/mmbiz_jpg/3WjFdhSpzNwwEwTpWMU4j8UVddOSDGR2zRuJsQZXaRYnsIB3g4yESBqjxkf1e7ruIWYfUO5FtRWIibaVwt6icOHw/0?wx_fmt=jpeg)
    }

    @Test
    public void uploadNewsMedia() {
        String accessToken = wechatAuthService.getAccessToken();
        UploadNewsEntity entity = new UploadNewsEntity();
        UploadNewsEntity.UploadNewsArticle article1 = new UploadNewsEntity.UploadNewsArticle();
        article1.setThumbMediaId("tbP52CbH1vuCLlyUAt2rlWEIB6qGsfypnI01Jwwonjg");
        article1.setAuthor("article1");
        article1.setTitle("article1");
        article1.setContentSourceUrl("");
        article1.setContent("article1");
        article1.setDigest("article1");
        article1.setShowConverPic(1);
        entity.addArticle(article1);
        UploadNewsEntity.UploadNewsArticle article2 = new UploadNewsEntity.UploadNewsArticle();
        article2.setThumbMediaId("tbP52CbH1vuCLlyUAt2rlRjbl4sO2dPYqvCLZNwIorg");
        article2.setAuthor("article2");
        article2.setTitle("article2");
        article2.setContentSourceUrl("");
        article2.setContent("article2");
        article2.setDigest("article2");
        article2.setShowConverPic(0);
        entity.addArticle(article2);
        System.out.println("新增永久图文素材, 返回" + wechatMaterialService.uploadNewsMedia(accessToken, entity));
        //新增永久图文素材, 返回tbP52CbH1vuCLlyUAt2rlVvIMceFKJmY663R_urJAYc
    }

    @Test
    public void uploadFileForNewsMedia() {
        String accessToken = wechatAuthService.getAccessToken();
        String filePath = "D:\\Project\\Phil\\Wechat\\phil_new_wechat\\src\\main\\webapp\\image\\00_01.jpeg";
        System.out.println(wechatMaterialService.uploadFileForNewsMedia(accessToken, filePath));
        //http://mmbiz.qpic.cn/mmbiz_jpg/L8zibbZGicwDw6sv1WWkFK1nCUDY9bJrHiaEbJuTS37XbJR3hEiblAkibzjdTHdHKqXb6Ij53CDfNwztRsOwljibEp8A/0
    }

    @Test
    public void uploadUrlForNewsMedia() {
        String accessToken = wechatAuthService.getAccessToken();
        String url = "http://www.59xihuan.cn//uploads/allimg/20130728/64511374987081-lp.jpg";
        System.out.println(wechatMaterialService.uploadUrlForNewsMedia(accessToken, url));
        //http://mmbiz.qpic.cn/mmbiz_jpg/L8zibbZGicwDw6sv1WWkFK1nCUDY9bJrHiaQXwtf52SyM4ftxVeuickvh1rDLPMaeE1jDxgpWice9TgJOzYPIRAy8uA/0
    }

    @Test
    public void uploadForeverVideoMediaFile() {
        String filePath = "D:/Project/Phil/Wechat/phil_new_wechat/src/main/webapp/video/1539717180390.mp4";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增永久本地视频素材, 返回" + wechatMaterialService.uploadForeverMediaFile(accessToken,
                "title", "test", filePath));
        //新增永久本地视频素材, 返回GG16CzQSj3di2OTScAcNA-LTwMdsrKszM7M677NJyic
    }

    @Test
    public void uploadForeverVideoMediaUrl() {
        //String url = "http://vs6.bdstatic.com/browse_static/v3/common/widget/global/player/newPlayer_e2332cd1.swf";
        //转换
        String url = "http://xiaozhaozhao.nat300.top/video/1539717180390.mp4";
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println("新增永久网络视频素材, 返回" + wechatMaterialService.uploadForeverMediaUrl(accessToken,
                "title", "test", url));
        // 新增永久网络视频素材, 返回GG16CzQSj3di2OTScAcNA6OWJlBHKk8sXSmbgPzxEQo
    }

    @Test
    public void getTempMaterial() {
        String accessToken = wechatAuthService.getAccessToken();
        String mediaId = "c985PlW3avLd3w9gUclA75geC9PFFozfX6-Jn6s9kRWwV2gu0KHSaBEDJu0Eugno";
        System.out.println(wechatMaterialService.getTempMaterial(accessToken, mediaId));
    }

    @Test
    public void getMaterial() {
        String accessToken = wechatAuthService.getAccessToken();
//        String mediaId = "tbP52CbH1vuCLlyUAt2rlUEZKK230SjWIaB9xablAPw"; //图片
        String mediaId = "tbP52CbH1vuCLlyUAt2rlVvIMceFKJmY663R_urJAYc"; //图文
        System.out.println(wechatMaterialService.getMaterial(accessToken, mediaId));
    }

    @Test
    public void deleteMaterial() {
        String mediaId = "tbP52CbH1vuCLlyUAt2rlYaBvU3BHrs8g0-XxdnNILY";
        //tbP52CbH1vuCLlyUAt2rlfnoE7EJNJvPvEv0nFkezsw
        //tbP52CbH1vuCLlyUAt2rlYUYsAvjhY7UmdgQ_8qnip4
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println(wechatMaterialService.deleteMaterial(accessToken, mediaId));
        //ResultState(errcode=0, errmsg=ok)
    }

    @Test
    public void geMaterialCount() {
        String accessToken = wechatAuthService.getAccessToken();
        System.out.println(wechatMaterialService.geMaterialCount(accessToken));
        //MaterialCountResult(voiceCount=0, videoCount=5, imageCount=15, newsCount=2)
    }
}

  

具体源码:https://github.com/philjing/my_wechat

原文地址:https://www.cnblogs.com/phil_jing/p/12077973.html

时间: 2024-07-29 22:24:41

Java微信公众平台开发之素材管理(Spring Boot 2.X)的相关文章

Java微信公众平台开发_03_消息管理之被动回复消息

GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图,这个url就是回调url,是开发者用来接收微信消息和事件的接口URL .也就是说,用户在微信公众号中发送的消息会被推送到这个回调url,而我们可以接收用户的消息,并进行回复. 2.被动回复消息的流程 官方文档: 我们在上一节中设置的消息加解密方式是安全模式.因此在用户发给公众号的消息(接收消息)以及

Java微信公众平台开发_02_启用服务器配置

一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册:(https://mp.weixin.qq.com/) 3.策略文件 见:[ Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size ] 4.微信官方消息加解密工具包 需要下载微信官方的消息加解密的工具包,主要是AES加密工具 下载地址:

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConstants这个文件(这个真心占的不少),还有一部分就是说源码的问题,所以今天特意抽了时间补充下这两点! (一)关于GlobalConstants

java微信公众平台开发事件推送

import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import com.ifp.weixin.biz.cor

Java微信公众平台开发(一)--接入微信公众平台

转自:http://www.cuiyongzhi.com/post/38.html (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通过文档我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成: 填写服务器配置 验证服务器地址的有效性 依据接口文档实现业务逻辑 按照上面的逻辑可能是填写服务器配置信息是在第一步,但

Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息

转自:http://www.cuiyongzhi.com/post/78.html 好长时间没有写文章了,主要是最近的工作和生活上的事情比较多而且繁琐,其实到现在我依然还是感觉有些迷茫,最后还是决定静下心来坚持一开始的选择,继续我们的微信系列文章的后续更新,也希望在自己有时间的时候能把更多的内容呈现给大家,前面一系列的文章讲述了很多微信开发相关的基础知识点 [微信系列文章],那么从这一篇开始将讲述微信较深一层次或者说在产品应用中时刻会用到的一些技术点,那么下面就让我们进入正题吧,这一篇我要讲述的

java微信公众平台开发教程分享

微信公众平台深度开发JAVA版第一季 下载地址:链接:http://pan.baidu.com/s/1sCXI2 密码:6x90 课程讲师:翟东平 课程分类:Java适合人群:高级课时数量:24(41节)课时更新程度:完毕服务类型:C类(普通服务类课程)用到技术:微信公众平台,微信,java涉及项目:超市促销活动,微信限时秒杀活动第一季01_开篇 第一季02_程序员眼中的微信公众平台 第一季03_账号申请 第一季04_群发.自动回复 第一季05_环境搭建1 第一季06_环境搭建2 第一季07_开

Java微信公众平台开发(十五)--微信JSSDK的使用

转自:http://www.cuiyongzhi.com/post/63.html 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS-SDK给我们带来便捷,那么这里我们就简述如何在微信web开发中使用必要的方法!微信的JS-SDk中为我们提供的方法很多,这里我有一个简单截图如下: 在上图的提供的所有口中我们可以按照接口实现的难易程度分成两个部分: