微信公众号开发(四)——点击菜单回复图片和语音

先讲回复图片,语音类似。

这个发送图片,并不是点击输入框右侧的“➕”,去选择本地照片,而是要把图片上传的公众号的服务器。

按照开发文档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>
发布了130 篇原创文章 · 获赞 42 · 访问量 79万+

猜你喜欢

转载自blog.csdn.net/bdmh/article/details/103488458