先讲回复图片,语音类似。
这个发送图片,并不是点击输入框右侧的“➕”,去选择本地照片,而是要把图片上传的公众号的服务器。
按照开发文档https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html,被动回复图片消息格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
大厂的定义也是够不正规的,多种图片消息格式竟然不统一,这里的MediaId节点是在Image(注意首字母大写)节点之下的,其他图片消息MediaId节点是一级节点,注意一下啊!
增加菜单“看图”,并定义key值。参照《创建菜单》
{
"button":[
{
"type":"click",
"name":"Hello",
"key":"mh001"
},
{
"type":"click",
"name":"看图",
"key":"mh002"
}
}
根据开发文档,对之前的WXMessgeBean进行修改,增加一个字段和一个ImageMessage的Bean
package com.myweb.demo.bean;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class WXMessgeBean {
......
private ImageMessage Image;
......
public ImageMessage getImage() {
return Image;
}
public void setImage(ImageMessage image) {
Image = image;
}
public static class ImageMessage{
private String mediaId;
public String getMediaId() {
return mediaId;
}
//注意这里,设置MediaId节点名称,一定是首字母大写
@XmlElement(name = "MediaId")
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
}
}
设置MediaId节点名称,一定是首字母大写!!!
另外这个MediaId从哪里来呢,通过微信公众平台接口调试工具,将图片提交到服务器(当然还要先获取accessToken)
按照图示的样子,填写信息,点击“检查问题”,成功后,就会在下方显示MediaID。
回复消息的代码如下:
@PostMapping(value = "/checktoken", produces = MediaType.APPLICATION_XML_VALUE)
public String receiveWX(HttpServletRequest request, HttpServletResponse response ){
try {
Marshaller marshaller;
Unmarshaller unmarshal;
//你要解析成哪个bean对象,newInstance的参数就是哪个对象
JAXBContext jaxbContext = JAXBContext.newInstance(WXMessgeBean.class);
unmarshal = jaxbContext.createUnmarshaller();
//xml解码成bean对象
WXMessgeBean wxMessgeBean = (WXMessgeBean) unmarshal.unmarshal(request.getInputStream());
//准备返回文字信息
WXMessgeBean bean = new WXMessgeBean();
bean.setFromUserName(wxMessgeBean.getToUserName());
bean.setToUserName(wxMessgeBean.getFromUserName());
bean.setCreateTime(new Date().getTime());
//通过比对菜单项的key值
if (wxMessgeBean.getEventKey().equals("mh001")) {
......
}
else if (wxMessgeBean.getEventKey().equals("mh002")){
bean.setMsgType("image");
bean.setImage(new WXMessgeBean.ImageMessage());
bean.getImage().setMediaId("DSUR_MT-pbZTA7gf6CITwK3RtCnxwB_K5zUKUWAZNgbKbGB1HS3n3hyGNJZPWbFD");
}
else{
......
}
//把bean对象组装成xml格式,并返回
marshaller = jaxbContext.createMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(bean,writer);
return writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
把之前获得的MediaId填进去就是了。启动服务,点击“看图”按钮,就会看到了。
回复图像搞定之后,语音的就简单了,所有步骤都一样,唯一不同的就是MsgType=video。
<MsgType><![CDATA[video]]></MsgType>