2017-04-22 12:10:27 hq0556 阅读数 1405
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79058 人正在学习 去看看 翟东平

本例中有些引用的类与方法不做过多介绍,之后会提供完整源码下载,请自行查看。

本篇根据开发者文档-被动回复用户消息编写。请对照查看,一些传入与返回参数就不过多介绍。地址为:https://mp.weixin.qq.com/wiki/18/c66a9f0b5aa952346e46dc39de20f672.html


简述

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给公众号的消息以及公众号被动回复用户消息都会继续加密(但),详见被动回复消息加解密说明。

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。
“`
/*
* 被动回复用户消息
* http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
*/
public class BaseRespMsg {

public static XStream xstream = XMLUtil.xstream;

private String ToUserName;          // 开发者微信号
private String FromUserName;        // 发送方帐号(一个OpenID)
private long   CreateTime;          // 消息创建时间 (整型)
private String MsgType;             // 消息类型(text/image/location/link)

public String getToUserName() {
    return ToUserName;
}
public void setToUserName(String toUserName) {
    ToUserName = toUserName;
}

public String getFromUserName() {
    return FromUserName;
}
public void setFromUserName(String fromUserName) {
    FromUserName = fromUserName;
}

public long getCreateTime() {
    return CreateTime;
}
public void setCreateTime(long createTime) {
    CreateTime = createTime;
}

public String getMsgType() {
    return MsgType;
}
public void setMsgType(String msgType) {
    MsgType = msgType;
}   

}

“`

回复消息类型

回复文本消息

/*
 * 被动回复用户消息
 * http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
 */
public class BaseRespMsg {

    public static XStream xstream = XMLUtil.xstream;

    private String ToUserName;          // 开发者微信号
    private String FromUserName;        // 发送方帐号(一个OpenID)
    private long   CreateTime;          // 消息创建时间 (整型)
    private String MsgType;             // 消息类型(text/image/location/link)

    public String getToUserName() {
        return ToUserName;
    }
    public void setToUserName(String toUserName) {
        ToUserName = toUserName;
    }

    public String getFromUserName() {
        return FromUserName;
    }
    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }

    public long getCreateTime() {
        return CreateTime;
    }
    public void setCreateTime(long createTime) {
        CreateTime = createTime;
    }

    public String getMsgType() {
        return MsgType;
    }
    public void setMsgType(String msgType) {
        MsgType = msgType;
    }   
}

回复图片消息

/*
 * MsgType--->
 * image:图片消息
 */
public class ImageRespMsg extends BaseRespMsg {

    private List<Image> Image;

    public List<Image> getImage() {
        if(Image == null) Image = new ArrayList<Image>();
        return Image;
    }
    public void setImage(List<Image> images) {
        Image = images;
    }

    public class Image {
        private String MediaId;     //是 通过素材管理中的接口上传多媒体文件,得到的id

        public String getMediaId() {
            return MediaId;
        }
        public void setMediaId(String mediaId) {
            MediaId = mediaId;
        }
    }

    /*
     * 返回的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>12345678</CreateTime>
     *   <MsgType><![CDATA[image]]></MsgType>
     *   <Image>
     *       <MediaId><![CDATA[media_id]]></MediaId>
     *   </Image>
     * </xml>
     */
    public static String responseMessage(ImageRespMsg imageMessage) {
        imageMessage.setCreateTime(new Date().getTime());
      imageMessage.setMsgType(WeChatEntitiesType.RESP_MESSAGE_TYPE_IMAGE);

        xstream.alias("xml", imageMessage.getClass());  
        xstream.addImplicitCollection(imageMessage.getClass(), "Image");  
        xstream.alias("Image", imageMessage.new Image().getClass());
        return xstream.toXML(imageMessage);
    }

    public static String test(String xmlStr) {
        String response = "ImageRespMsg-->error";
        try {
            ImageReqMsg imageReqMsg = ImageReqMsg.requestMessage(xmlStr);
            ImageRespMsg imageRespMsg = new ImageRespMsg();
          imageRespMsg.setToUserName(imageReqMsg.getFromUserName());
          imageRespMsg.setFromUserName(imageReqMsg.getToUserName());
            int images = 1;
            for(int i=0; i<images; i++) {
                ImageRespMsg.Image image = imageRespMsg.new Image();
                image.setMediaId(imageReqMsg.getMediaId());
                imageRespMsg.getImage().add(image);
            }
            response = responseMessage(imageRespMsg);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}

回复语音消息

/*
 * MsgType--->
 * voice:语音消息
 */
public class VoiceRespMsg extends BaseRespMsg {

    private List<Voice> Voice;

    public List<Voice> getVoice() {
        if(Voice == null) Voice = new ArrayList<Voice>();
        return Voice;
    }
    public void setVoice(List<Voice> voice) {
        Voice = voice;
    }

    public class Voice {
        private String MediaId;     //是 通过素材管理中的接口上传多媒体文件,得到的id

        public String getMediaId() {
            return MediaId;
        }
        public void setMediaId(String mediaId) {
            MediaId = mediaId;
        }
    }

    /*
     * 返回的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>12345678</CreateTime>
     *   <MsgType><![CDATA[voice]]></MsgType>
     *   <Voice>
     *       <MediaId><![CDATA[media_id]]></MediaId>
     *   </Voice>
     * </xml>
     */
    public static String responseMessage(VoiceRespMsg voiceMessage) {
        voiceMessage.setCreateTime(new Date().getTime());
      voiceMessage.setMsgType(WeChatEntitiesType.RESP_MESSAGE_TYPE_VOICE);

        xstream.alias("xml", voiceMessage.getClass());
        xstream.addImplicitCollection(voiceMessage.getClass(), "Voice");  
        xstream.alias("Voice", voiceMessage.new Voice().getClass());
        return xstream.toXML(voiceMessage);
    }

    public static String test(String xmlStr) {
        String response = "VoiceRespMsg-->error";
        try {
            VoiceReqMsg voiceReqMsg = VoiceReqMsg.requestMessage(xmlStr);
            VoiceRespMsg voiceRespMsg = new VoiceRespMsg();
          voiceRespMsg.setToUserName(voiceReqMsg.getFromUserName());
          voiceRespMsg.setFromUserName(voiceReqMsg.getToUserName());
            int voices = 1;
            for(int i=0; i<voices; i++) {
                VoiceRespMsg.Voice voice = voiceRespMsg.new Voice();
                voice.setMediaId(voiceReqMsg.getMediaID());
                voiceRespMsg.getVoice().add(voice);
            }
            response = responseMessage(voiceRespMsg);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}

回复视频消息

/*
 * MsgType--->
 * video:视频消息
 */
public class VideoRespMsg extends BaseRespMsg {

    private List<Video> Video;

    public List<Video> getVideo() {
        if(Video == null) Video = new ArrayList<Video>();
        return Video;
    }
    public void setImage(List<Video> video) {
        Video = video;
    }

    public class Video {
        private String MediaId;     //是 通过素材管理中的接口上传多媒体文件,得到的id
        private String Title;       //否 视频消息的标题
        private String Description; //否 视频消息的描述

        public String getMediaId() {
            return MediaId;
        }
        public void setMediaId(String mediaId) {
            MediaId = mediaId;
        }

        public String getTitle() {
            return Title;
        }
        public void setTitle(String title) {
            Title = title;
        }

        public String getDescription() {
            return Description;
        }
        public void setDescription(String description) {
            Description = description;
        }
    }

    /*
     * 返回的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>12345678</CreateTime>
     *   <MsgType><![CDATA[video]]></MsgType>
     *   <Video>
     *      <MediaId><![CDATA[media_id]]></MediaId>
     *      <Title><![CDATA[title]]></Title>
     *      <Description><![CDATA[description]]></Description>
     *   </Video> 
     * </xml>
     */
    public static String responseMessage(VideoRespMsg videoMessage) {
        videoMessage.setCreateTime(new Date().getTime());
      videoMessage.setMsgType(WeChatEntitiesType.RESP_MESSAGE_TYPE_VIDEO);

        xstream.alias("xml", videoMessage.getClass());  
        xstream.addImplicitCollection(videoMessage.getClass(), "Video");  
        xstream.alias("Video", videoMessage.new Video().getClass());
        return xstream.toXML(videoMessage);
    }

    public static String test(String xmlStr) {
        String response = "VideoRespMsg-->error";
        try {
            VideoReqMsg videoReqMsg = VideoReqMsg.requestMessage(xmlStr);
            VideoRespMsg videoRespMsg = new VideoRespMsg();
          videoRespMsg.setToUserName(videoReqMsg.getFromUserName());
          videoRespMsg.setFromUserName(videoReqMsg.getToUserName());
            int videos = 1;
            for(int i=0; i<videos; i++) {
                VideoRespMsg.Video video = videoRespMsg.new Video();
                video.setMediaId(WeChatCertificate.VIDEO_MEDIAID);
                video.setTitle("title");
                video.setDescription("description");
                videoRespMsg.getVideo().add(video);
            }
            response = responseMessage(videoRespMsg);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}

回复音乐消息

/*
 * MsgType--->
 * music:音乐消息
 */
public class MusicRespMsg extends BaseRespMsg {

    private List<Music> Music;

    public List<Music> getMusic() {
        if(Music == null) Music = new ArrayList<Music>();
        return Music;
    }
    public void setMusic(List<Music> music) {
        Music = music;
    }

    public class Music {
        private String Title;           //否 音乐标题
        private String Description;     //否 音乐描述
        private String MusicUrl;        //否 音乐链接
        private String HQMusicUrl;      //否 高质量音乐链接,WIFI环境优先使用该链接播放音乐
        private String ThumbMediaId;    //是 缩略图的媒体id,通过素材管理中的接口上传多媒体文件,得到的id

        public String getTitle() {
            return Title;
        }
        public void setTitle(String title) {
            Title = title;
        }

        public String getDescription() {
            return Description;
        }
        public void setDescription(String description) {
            Description = description;
        }

        public String getMusicUrl() {
            return MusicUrl;
        }
        public void setMusicUrl(String musicURL) {
            MusicUrl = musicURL;
        }

        public String getHQMusicUrl() {
            return HQMusicUrl;
        }
        public void setHQMusicUrl(String hQMusicUrl) {
            HQMusicUrl = hQMusicUrl;
        }

        public String getThumbMediaId() {
            return ThumbMediaId;
        }
        public void setThumbMediaId(String thumbMediaId) {
            ThumbMediaId = thumbMediaId;
        }
    }

    /*
     * 返回的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>12345678</CreateTime>
     *   <MsgType><![CDATA[music]]></MsgType>
     *   <Music>
     *      <Title><![CDATA[TITLE]]></Title>
     *      <Description><![CDATA[DESCRIPTION]]></Description>
     *      <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
     *      <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
     *      <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
     *   </Music>
     * </xml>
     */
    public static String responseMessage(MusicRespMsg musicMessage) {
        musicMessage.setCreateTime(new Date().getTime());
      musicMessage.setMsgType(WeChatEntitiesType.RESP_MESSAGE_TYPE_MUSIC);

        xstream.alias("xml", musicMessage.getClass());
        xstream.addImplicitCollection(musicMessage.getClass(), "Music");  
        xstream.alias("Music", musicMessage.new Music().getClass());
        return xstream.toXML(musicMessage);
    }

    public static String test(String xmlStr) {
        String response = "MusicRespMsg-->error";
        try {
            TextReqMsg textReqMsg = TextReqMsg.requestMessage(xmlStr);
            MusicRespMsg musicRespMsg = new MusicRespMsg();
          musicRespMsg.setToUserName(textReqMsg.getFromUserName());
          musicRespMsg.setFromUserName(textReqMsg.getToUserName());
            int musics = 1;
            for(int i=0; i<musics; i++) {
                MusicRespMsg.Music music = musicRespMsg.new Music();
                music.setTitle("残酷月光");
                music.setDescription(" 林宥嘉 词:向月娥 曲:陈小霞");
                music.setMusicUrl("http://wma.5282.cc/2008-11//20140226/1.mp3");
                music.setHQMusicUrl("http://wma.5282.cc/2008-11//20140226/1.mp3");
                musicRespMsg.getMusic().add(music);
            }
            response = responseMessage(musicRespMsg);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}

回复图文消息

/*
 * MsgType--->
 * news:图文消息
 */
public class NewsRespMsg extends BaseRespMsg {

    private int ArticleCount;       //是 图文消息个数,限制为10条以内
    private List<Article> Articles; //是 多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应

    public int getArticleCount() {
        return ArticleCount;
    }
    public void setArticleCount(int articleCount) {
        ArticleCount = articleCount;
    }

    public List<Article> getArticles() {
        if(Articles == null) Articles = new ArrayList<Article>();
        return Articles;
    }
    public void setArticles(List<Article> articles) {
        Articles = articles;
    }

    public class Article{
        private String Title;               //否 图文消息标题
        private String Description;         //否 图文消息描述
        private String PicUrl;              //否 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
        private String Url;                 //否 点击图文消息跳转链接

        public String getTitle() {
            return Title;
        }
        public void setTitle(String title) {
            Title = title;
        }

        public String getDescription() {
            return Description;
        }
        public void setDescription(String description) {
            Description = description;
        }

        public String getPicUrl() {
            return PicUrl;
        }
        public void setPicUrl(String picUrl) {
            PicUrl = picUrl;
        }

        public String getUrl() {
            return Url;
        }
        public void setUrl(String url) {
            Url = url;
        }
    }

    /*
     * 返回的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>12345678</CreateTime>
     *   <MsgType><![CDATA[news]]></MsgType>
     *   <ArticleCount>2</ArticleCount>
     *   <Articles>
     *      <item>
     *          <Title><![CDATA[title1]]></Title> 
     *          <Description><![CDATA[description1]]></Description>
     *          <PicUrl><![CDATA[picurl]]></PicUrl>
     *          <Url><![CDATA[url]]></Url>
     *      </item>
     *      <item>
     *          <Title><![CDATA[title]]></Title>
     *          <Description><![CDATA[description]]></Description>
     *          <PicUrl><![CDATA[picurl]]></PicUrl>
     *          <Url><![CDATA[url]]></Url>
     *      </item>
     *   </Articles>
     * </xml>
     */
    public static String responseMessage(NewsRespMsg newsMessage) {
        newsMessage.setCreateTime(new Date().getTime());
      newsMessage.setMsgType(WeChatEntitiesType.RESP_MESSAGE_TYPE_NEWS);

        xstream.alias("xml", newsMessage.getClass());
        xstream.alias("item", newsMessage.new Article().getClass());
        return xstream.toXML(newsMessage);
    }

    public static String test(String xmlStr) {
        String response = "NewsRespMsg-->error";
        try {
            TextReqMsg textReqMsg = TextReqMsg.requestMessage(xmlStr);
            NewsRespMsg newsRespMsg = new NewsRespMsg();
          newsRespMsg.setToUserName(textReqMsg.getFromUserName());
          newsRespMsg.setFromUserName(textReqMsg.getToUserName());
            int articleCount = 3;
            newsRespMsg.setArticleCount(articleCount);
            for(int i=0; i<articleCount; i++) {
                NewsRespMsg.Article articla = newsRespMsg.new Article();
                articla.setTitle("title"+i);
                articla.setDescription("description"+i);
              articla.setPicUrl("http://img5.imgtn.bdimg.com/it/u=1938623644,625001929&fm=11&gp=0.jpg");
                articla.setUrl("http://www.baidu.com");
                newsRespMsg.getArticles().add(articla);
            }
            response = responseMessage(newsRespMsg);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}
2017-04-23 15:43:18 aojiancc2 阅读数 2017
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79058 人正在学习 去看看 翟东平


            

                  微信接收用户普通消息可以在官方文档中直接看


           

           

                   微信普通消息分为:

            

   

             接受用户文本消息 与 回复文本信息           

             

          注意在接收用户普通消息的时候,推送的xml格式没有eventKey,event 

      

          这个是菜单点击的时候推送的菜单的标识

             

             接收文本消息格式

           

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName> 
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

           处理文本消息的类   

                        

            

            接收消息 

  /// <summary>
    /// 处理用户发送的文本消息方法
    /// </summary>
    public class TextProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出消息内容
            string Content = xl.Elements().Where(a => a.Name == "Content").FirstOrDefault().Value;
        }
    }

           回复文本消息工具类封装,增加回复文本消息方法       

   /// <summary>
        /// 回复文本消息的方法
        /// </summary>
        public void SendTextMesXml(HttpResponseBase Response, ReTextMsgModel _rmg)
        {

            string rxmls = string.Format(@"<xml>
                               <ToUserName>{0}</ToUserName>
                               <FromUserName>{1}</FromUserName>
                               <CreateTime>{2}</CreateTime>
                               <MsgType><![CDATA[text]]></MsgType>
                               <Content><![CDATA[{3}]]></Content>
                             </xml>           
                           ", _rmg.ToUserName, _rmg.FromUserName
                            , ConvertDateTimeInt(DateTime.Now), _rmg.Content);

            Response.Write(rxmls);

            Response.End();
        }

            在处理类中调用该方法        

/// <summary>
    /// 处理用户发送的文本消息方法
    /// </summary>
    public class TextProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出消息内容
            string Content = xl.Elements().Where(a => a.Name == "Content").FirstOrDefault().Value;

            //回复的内容
            string retmes = "";

            if (Content == "1")
                retmes = "用户输入1";
            else if (Content == "2")
                retmes = "用户输入了2";
            else
                retmes = "随便回复一个^_^";

            //组建回复文本信息的类
            ReTextMsgModel rsm = new ReTextMsgModel();

            rsm.MsgType = "text";
            rsm.Content = retmes;
            rsm.ToUserName = FromUserName;
            rsm.FromUserName = ToUserName;

            //调用回复文本信息方法
            new SendMesTool().SendTextMesXml(_response, rsm);

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Text", Content = Content });

            _response.End();

        }
    }

                    效果如下

            


            发表情也会认为是一个文本信息!!

            



           接受用户图片消息 与 回复图片信息

           

                  接收图片消息看官方文档,格式为       

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[image]]></MsgType>
 <PicUrl><![CDATA[this is a url]]></PicUrl>
 <MediaId><![CDATA[media_id]]></MediaId>
 <MsgId>1234567890123456</MsgId>
 </xml>
         

             其他都一样,主要是两个属性PicUrl和MediaId,一个是图片的url,

          一个是对应图片的Id

          可以先取出来,记录在日志中查看

    /// <summary>
    /// 处理图片信息的方法
    /// </summary>
    public class ImageProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出图片连接
            string PicUrl = xl.Elements().Where(a => a.Name == "PicUrl").FirstOrDefault().Value;

            //取出MediaId,图片资源对应的id
            string MediaId = xl.Elements().Where(a => a.Name == "MediaId").FirstOrDefault().Value;

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Image", Remark = "PicUrl:" + PicUrl,
                                          Remark2 = MediaId });

            _response.End();
        }
    }
              

             PicUrl就是一个图片链接,可以在浏览器中访问

            

            MediaId是串很长的字符

            


            回复图片信息

                  先看看文档        

<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,如果回复一个和用户一样的图片

           就把用户传递的MediaId回传给他就行了,如果要回复其他图片,看文档上解释

             

             需要通过素材接口上传,然后获取一个与之关联的MediaId就可了


              

               编写回复图片信息的model           

   /// <summary>
    /// 回复图片信息的model
    /// </summary>
    public class ReImageMsgModel
    {
        public string ToUserName { get; set; }
        public string FromUserName { get; set; }
        public int CreateTime { get; set; }
        public string MsgType { get; set; }
        public string MediaId { get; set; }
    }
            

           在回复信息的工具类中编写回复图片信息的方法          

  /// <summary>
        /// 回复图片消息的方法
        /// </summary>
        public void SendImageMesXml(HttpResponseBase Response, ReImageMsgModel _rmg)
        {

            string rxmls = string.Format(@"<xml>
                               <ToUserName>{0}</ToUserName>
                               <FromUserName>{1}</FromUserName>
                               <CreateTime>{2}</CreateTime>
                               <MsgType><![CDATA[{3}]]></MsgType>
                               <Image>
                                  <MediaId><![CDATA[{4}]]></MediaId>
                                 </Image>
                             </xml>           
                           ", _rmg.ToUserName, _rmg.FromUserName
                            , ConvertDateTimeInt(DateTime.Now),_rmg.MsgType,_rmg.MediaId);

            Response.Write(rxmls);
            Response.End();
        }
         

            在图片信息处理类中调用该方法进行回复一个图片信息        

  /// <summary>
    /// 处理图片信息的方法
    /// </summary>
    public class ImageProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出图片连接
            string PicUrl = xl.Elements().Where(a => a.Name == "PicUrl").FirstOrDefault().Value;

            //取出MediaId,图片资源对应的id
            string MediaId = xl.Elements().Where(a => a.Name == "MediaId").FirstOrDefault().Value;


            //组建回复图片信息的类
            ReImageMsgModel rsm = new ReImageMsgModel();

            rsm.MsgType = "image";
            rsm.MediaId = MediaId;
            rsm.ToUserName = FromUserName;
            rsm.FromUserName = ToUserName;

            new SendMesTool().SendImageMesXml(_response, rsm);

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Image", Remark = "PicUrl:" + PicUrl,
                                          Remark2 = MediaId });

            _response.End();
        }
    }
             

           效果如下

            

           

           




          

2014-10-20 15:16:01 piaoxuefengqi 阅读数 4247
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79058 人正在学习 去看看 翟东平

背景


最近申请了一个微信公众号,想根据用户的消息进行智能动态回复。于是有了这篇文章。

公众号申请:https://mp.weixin.qq.com。

想根据具体消息进行智能动态回复,需要开启开发者模式。

开发者模式需要进入开发者中心进行编码认证。这里面只讲主要的代码,关键步骤见参考资料


开发环境


环境:python + sae + Flask



myapp.py


开启后需要认证服务器,服务器认证代码编写:

import hashlib
from flask import Flask, request, render_template, jsonify, make_response
import time
import _elementtree as ET

app = Flask(__name__)
app.debug = True

@app.route('/weixin/', methods=['GET', 'POST'])
def wechat_auth():
    if request.method == 'GET':
        token = '****'   # your token
    query = request.args
    signature = query.get('signature', '')
    timestamp = query.get('timestamp', '')
    nonce = query.get('nonce', '')
    echostr = query.get('echostr', '')
    s = [timestamp, nonce, token]
    s.sort()
    s = ''.join(s)
    if hashlib.sha1(s).hexdigest() == signature:
        return make_response(echostr)



设置消息回复

认证完毕后,即可根据微信发来的xml进行消息解析,然后根据具体消息进行回复。

设置消息回复的代码如下,只需要修改刚才的函数体:

@app.route('/weixin/', methods=['GET', 'POST'])
def wechat_auth():
    cQuestion = CQuestion()
    xml_recv = ET.fromstring(request.data)
    ToUserName = xml_recv.find("ToUserName").text
    FromUserName = xml_recv.find("FromUserName").text
    Content = xml_recv.find("Content").text
    cResponse = CResponse()
    cQuestion.insertIntoSql(ToUserName)
    cQuestion.insertIntoSql(FromUserName)
    if Content.strip() == "1":
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello, world!")
    elif Content.strip() == "2":
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello, python!")
    else:
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello!")


测试


编写完上面的代码并提交后开始测试,测试效果如下:





更多测试


关注微信号itoffer。

二维码:   


提供多种功能,包括新闻检索、微信游戏、面试题获取、图片处理、领域知识尝试等功能,后续多种功能持续集成中。

参考资料 








2016-05-12 17:42:56 qq_29407009 阅读数 1257
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79058 人正在学习 去看看 翟东平

在前面我实现了配置微信接口的配置,将自己的订阅号的控制交给我自己控制,用户回复消息,微信的后台会通过发送一个post请求到自己的服务器,是发送一个XML
消息的接收:
文本消息(在微信的开发者文档中能看到)

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>

自己写一个方法,解析xml,将所有的内容解析完成之后,存放在一个Map中(首先设置一下编码集),
用到的jar包:dom4j-1.6.1.jar

```
//servlet中调用
request.setCharacterEncoding("utf-8");//设置编码集
response.setCharacterEncoding("utf-8");//设置编码集
Map<String,String> map=MessageUtils.xmlToMap(request);
//解析xml的方法
public static Map<String,String> xmlToMap(HttpServletRequest request){
        Map<String,String> map=new HashMap<String,String>();
        SAXReader reader=new  SAXReader();
        InputStream inputStream=null;
        try {
            inputStream = request.getInputStream();
            Document document=reader.read(inputStream);
            Element root=document.getRootElement();
            @SuppressWarnings("unchecked")
            List<Element> list=root.elements();
            for (Element e : list) {
                map.put(e.getName(), e.getText());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }finally{
            if (inputStream!=null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return map;
    }
```
将解析微信后台发送给我的xml后得到map,再在map中取值

```
String toUserName=map.get("ToUserName");//自己公众号的账号
String fromUserName=map.get("FromUserName");//发送消息用户的账号
String msgType=map.get("MsgType");//得到消息的类型
String content=map.get("Content");//得到文本消息的内容
/**
* 消息的类型:都可以在微信的开发者文档中找到
* 
*/
    public static final String MESSAGE_TEXT="text";//文本消息
    public static final String MESSAGE_VOICE="voice";//语音消息
    public static final String MESSAGE_MUSIC="music";//音乐
    public static final String MESSAGE_SHORTVIDEO="shortvideo";//视频
    public static final String MESSAGE_LOCATION="location";//地理位置
    public static final String MESSAGE_LINK="link";//链接
    public static final String MESSAGE_IMAGE="image";//图片
    public static final String MESSAGE_EVENT="event";//事件
    public static final String MESSAGE_SUBSCRIBE="subscribe";//关注事件
    public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注事件
    public static final String MESSAGE_NEWS="news";//图文
    public static final String MESSAGE_CLICK = "CLICK";//菜单的点击事件
    public static final String MESSAGE_VIEW = "VIEW";//菜单的跳转
    public static final String MESSAGE_SCANCODE= "scancode_push";//扫描二维码事件
```

消息的回复
在公众号收到用户发送的消息后,进行消息的判断,然后在回复给用户,回复的格式也xml
回复消息是使用java对象进行转化,而且有些格式中的字段是都有的,所以可以生成一个父类,后面的各种类型的消息都继承这个父类

//文本消息的格式
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
//父类
public class BaseMessage {
    private String ToUserName;// 给哪个账号
    private String FromUserName;// 来自哪个账号
    private long CreateTime;// 创建时间
    private String MsgType;// 消息类型
    public String getToUserName() {
        return ToUserName;
    }
    public void setToUserName(String toUserName) {
        ToUserName = toUserName;
    }
    public String getFromUserName() {
        return FromUserName;
    }
    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }
    public long getCreateTime() {
        return CreateTime;
    }
    public void setCreateTime(long createTime) {
        CreateTime = createTime;
    }
    public String getMsgType() {
        return MsgType;
    }
    public void setMsgType(String msgType) {
        MsgType = msgType;
    }
}
//回复的文本信息
public class TextMessage extends BaseMessage{
    private String Content;// 文本内容
    private String MsgId;// 消息ID
    public String getContent() {
        return Content;
    }
    public void setContent(String content) {
        Content = content;
    }
    public String getMsgId() {
        return MsgId;
    }
    public void setMsgId(String msgId) {
        MsgId = msgId;
    }
    @Override
    public String toString() {
        return "TextMessage [Content=" + Content + ", MsgId=" + MsgId + "]";
    }

}

在创建了类之后,并且在要回复的信息封装好之后我们要将java对象转化成xml格式,这样要使用一个jar,帮助我们将java对象转化成xml格式的字符串:xstream-1.3.1.jar

    /**
     * 将文本对象转化为xml
     * @param textMessage
     * @return
     */
    public static String textMessageToXml(TextMessage baseMessage){
        XStream stream=new XStream();
        stream.alias("xml", baseMessage.getClass());
        return stream.toXML(baseMessage);
    }
    //封装回复的消息
    TextMessage message=new TextMessage();
    message.setFromUserName(toUserName);//这里填写的自己的账号,也就是前面的toUserName
    message.setToUserName(fromUserName);//填写给那个用户,也就是前面的fromUserName
    message.setMsgType("text");//消息的类型
    message.setCreateTime(new Date().getTime());//时间
    message.setContent("你好,欢迎关注我的微信公众号!");
    String xmlMessage=MessageUtils.textMessageToXml(message);//将java对象转化成xml格式的字符串
    if(xmlMessage!=null && !"".equals(xmlMessage)){
        out.print(xmlMessage);//输出字符串
    }
    out.flush();
    out.close();

这是测试的效果
这里写图片描述

2019-12-25 18:29:15 chen15369337607 阅读数 43
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79058 人正在学习 去看看 翟东平

一、前言
闲来有空,正好把这两年开发微信的东西拿出来抖抖。从零基础搭建一个微信开发基础框架。闲来搭建微信消息实体,包括接收的用户消息和回复用户消息两个基本实体。
在这里插入图片描述
二、参考/说明
主要需要参看微信公众平台开发者文档
网页地址:微信开发者文档
实体类中使用了lombok,所以省略了set ,get ,equal,hash以及ToString方法。
三、消息实体类
参看微信开发者文档消息管理中的第一栏,接收用户消息中分为文本消息、图片消息、语音消息,视频消息、链接消息等等吧,有一些共同属性,进行提取。包结构如下:
在这里插入图片描述
1)BaseEntity

package com.zlc.wechat.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:34
 **/
@Data
public class BaseEntity implements Serializable {
    
    private static final long serialVersionUID = 1L;
    /**
     * 媒体Id,用于从微信素材接口调用
     */
    private long mediaId;
    
}

2)ArticleEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * 微信图文
 * @author :  追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 15:22
 **/
@Data
public class ArticleEntity extends BaseEntity{
    /**
     * 图文消息标题
     */
    private String title;
    /**
     * 图文消息描述
     */
    private String description;
    /**
     * 图片的链接
     * 支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致
     */
    private String pictureUrl;
    /**
     * 点击图文消息后要跳转的url
     */
    private String url;

}

3)ImageEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * 微信图片
 * @author :  追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 15:22
 **/
@Data
public class ImageEntity extends BaseEntity{
	
	/**
	 * 图片链接(由系统生成)
	 */
	private String picUrl;
	
}

4)LinkEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 9:47
 **/
@Data
public class LinkEntity extends BaseEntity{
    
    /**
     * 消息标题
     */
    private String title;
    /**
     * 消息描述
     */
    private String description;
    /**
     * 消息链接
     */
    private String url;
    
}

5)LocationEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 17:06
 **/
@Data
public class LocationEntity extends BaseEntity{

    /**
     * 地理位置维度
     */
    private String locationX;
    /**
     * 地理位置经度
     */
    private String locationY;
    /**
     * 地图缩放大小
     */
    private String scale;
    /**
     * 地理位置信息
     */
    private String label;
    
}

6)MusicEntity

package com.zlc.wechat.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * 微信音乐
 * @author :  追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 15:22
 **/
@Data
public class MusicEntity implements Serializable {

	private static final long serialVersionUID = 1L;
	
	/**
	 * 音乐名称
	 */
	private String title;
	/**
	 * 音乐描述
	 */
	private String description;
	/**
	 * 音乐链接
	 */
	private String musicUrl;
	/**
	 * 质量音乐链接,WIFI环境优先使用该链接播放音乐
	 */
	private String HQMusicUrl;
	/**
	 * 缩略图的媒体id,通过上传多媒体文件得到的id
	 */
	private String thumbMediaId;
	
}

7)TextEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:40
 **/
@Data
public class TextEntity extends BaseEntity{
    
    /**
     * 文本消息内容
     */
    private String content;
    
}

8)VideoEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * 微信视频
 * @author :  追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 15:22
 **/
@Data
public class VideoEntity extends BaseEntity {
	
	/**
	 * 视频缩略图的媒体Id,(缩略图就是微信中的那个小窗口视频,图片和视频都会缩略)
	 */
	private String thumbMediaId;
	
}

9)VoiceEntity

package com.zlc.wechat.entity;

import lombok.Data;

/**
 * 微信语音
 * @author :  追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 15:22
 **/
@Data
public class VoiceEntity extends BaseEntity {
	
	/**
	 * 语音格式,如amr,speex等
	 */
	private String format;
	/**
	 * 开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加
	 * 语音格式:amr
	 * 语音识别结果,UTF8编码()
	 */
	private String recognition;
	
}

三、用户发送消息类
1)BaseWeChatMsg

package com.zlc.wechat.message;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:08
 **/
@Data
public class BaseWeChatMsg implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 消息Id,64位整形
     */
    private long msgId;
    /**
     * 开发者微信号
     */
    private String toUserName;
    /**
     * 发送方帐号(一个OpenID)
     */
    private String fromUserName;
    /**
     * 消息创建时间 (整型)
     */
    private Date createTime;
    /**
     * 消息类型
     */
    private String msgType;
    /**
     * 位0x0001被标志时,星标刚收到的消息
     */
    private int funcFlag;
    
}

2)ReceiveImageMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.ImageEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 图片消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:31
 **/
@Data
public class ReceiveImageMsg extends BaseWeChatMsg {
   
    /**
     * 图片
     */
    private ImageEntity imageEntity;
    
}

3)ReceiveLinkMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.LinkEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 9:46
 **/
@Data
public class ReceiveLinkMsg extends BaseWeChatMsg {
    
    /**
     * 链接
     */
    private LinkEntity linkEntity;
    
}

4)ReceiveLocationMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.LocationEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 地理位置信息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 17:05
 **/
@Data
public class ReceiveLocationMsg extends BaseWeChatMsg {
   
    /**
     * 位置
     */
    private LocationEntity locationEntity;
    
}

5)ReceiveTextMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.TextEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 文本消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:06
 **/
@Data
public class ReceiveTextMsg extends BaseWeChatMsg {
   
    /**
     * 文本
     */
    private TextEntity textEntity;
    
}

6)ReceiveVideoMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.VideoEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 视频类消息(包括小视频)
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 17:00
 **/
@Data
public class ReceiveVideoMsg extends BaseWeChatMsg {
   
    /**
     * 视频
     */
    private VideoEntity videoEntity;
    
}

7)ReceiveVoiceMsg

package com.zlc.wechat.message.receive;

import com.zlc.wechat.entity.BaseEntity;
import com.zlc.wechat.entity.VoiceEntity;
import lombok.Data;

/**
 * 语音消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/23 16:47
 **/
@Data
public class ReceiveVoiceMsg extends BaseEntity {
    
    /**
     * 语音
     */
    private VoiceEntity voiceEntity;
    
}

四、被动回复用户消息类
1)ReplyArticleMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.ArticleEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

import java.util.List;

/**
 * 被动回复用户图文消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 10:05
 **/
@Data
public class ReplyArticleMsg extends BaseWeChatMsg {
    
    /**
     * 图文消息总条数
     */
    private int articleCount;
    /**
     * 图文消息集合
     */
    private List<ArticleEntity> articles;
    
}

2)ReplyImageMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.ImageEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 被动回复图片信息,可以是多图
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 9:56
 **/
@Data
public class ReplyImageMsg extends BaseWeChatMsg {
    
    /**
     * 图片
     */
    private ImageEntity imageEntity;
    
}    

3)ReplyMusicMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.MusicEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 被动回复用户乐音消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 10:02
 **/
@Data
public class ReplyMusicMsg extends BaseWeChatMsg {
  
    /**
     * 音乐
     */
    private MusicEntity musicEntity;
    
}

4)ReplyTextMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.TextEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 被动回复用户文本消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 9:53
 **/
@Data
public class ReplyTextMsg extends BaseWeChatMsg {
    
    /**
     * 文本
     */
    private TextEntity textEntity;
    
}

5)ReplyVideoMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.VideoEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 被动回复用户视频消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 10:00
 **/
@Data
public class ReplyVideoMsg extends BaseWeChatMsg {
   
    /**
     * 视频
     */    
    private VideoEntity videoEntity;
    
}

6)ReplyVoiceMsg

package com.zlc.wechat.message.reply;

import com.zlc.wechat.entity.VoiceEntity;
import com.zlc.wechat.message.BaseWeChatMsg;
import lombok.Data;

/**
 * 被动回复用户语音消息
 * @author : 追到乌云的尽头找太阳-(Jacob)
 * @date : 2019/10/24 9:58
 **/
@Data
public class ReplyVoiceMsg extends BaseWeChatMsg {
   
    /**
     * 语音
     */
    private VoiceEntity voiceEntity;
    
}

微信开发记录

阅读数 573

没有更多推荐了,返回首页