前面只讲了文本消息,如果要发图片或语音视频等消息,则需要先将相关文件如图片上传到微信,之后可以将其作为素材,在消息中引用它,实现图片消息。
新增图片素材
@GetMapping("/addMaterial")
public void addMaterial(){
String url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={1}&type=image";
//微信要求以form表单形式提交图片文件,需使用MultiValueMap
MultiValueMap<String, Object> form = new LinkedMultiValueMap<String, Object>();
//微信指定的文件参数名为media
form.add("media", new FileSystemResource("e://1.jpg"));
Map<String,Object> map = restTemplate.postForObject(url, form, Map.class,"你的access_token");
以上即可将e盘的1.jpg文件上传到,返回结果中有两个参数:
media_id:素材id,如果要发图片消息,直接在消息参数中配置这个id即可,以后会讲。这个id需要自行保存到数据库。
url:上传图片的外网可访问地址。
text/plain转json
微信大多数返回的json类型的接口,都能自动转换json。而有少部分接口比如上面这个,返回的数据是json格式,但是响应头确是text/plain。后台会报一个异常:no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [text/plain],无法将text/plain类型转化为map对象。通过以下配置可增加对text/plain类型数据的转换,排除异常。
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.TEXT_PLAIN);
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(mediaTypes);
return mappingJackson2HttpMessageConverter;
}
新增语音和视频素材
基本和图片一样,只是请求url的参数type不一样,语音type=voice,视频type=video。另视频需要添加一些额外的参数,标题和介绍,参数代码如下:
MultiValueMap<String, Object> form = new LinkedMultiValueMap<String, Object>();
form.add("media", new FileSystemResource("e://1.mp4"));
Map description = new HashMap();
description.put("title","标题");
description.put("introduction","介绍");
form.add("description", description);
文件格式和大小
以下源自微信官网
图片(image): 2M,支持bmp/png/jpeg/jpg/gif格式
语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式
删除素材
只需传入你要删除的素材id即可。
String url = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token={1}";
Map body = new HashMap();
body.put("media_id", "素材id");
Map<String,Object> map = restTemplate.postForObject(url, body, Map.class,"你的access_token");
获取素材列表
要查看当前的素材情况,如下。可查到批量的素材id,及其url等相关信息,自行打印查看结果,不多说了。
String url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token={1}";
Map body = new HashMap();
body.put("type", "imiage"); //素材类型
body.put("offset", 0); //从0即第1个素材开始查找
body.put("count", 10); //一共10个,最多20
Map<String,Object> map = restTemplate.postForObject(url, body, Map.class,"你的access_token");
System.out.println(map);