2017-04-22 12:10:27 hq0556 阅读数 1404
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

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

本篇根据开发者文档-被动回复用户消息编写。请对照查看,一些传入与返回参数就不过多介绍。地址为: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 阅读数 2011
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒


            

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


           

           

                   微信普通消息分为:

            

   

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

             

          注意在接收用户普通消息的时候,推送的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-04-24 15:03:58 u012646273 阅读数 1113
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒
       随着微信人气的不断聚焦,越来越多的企业及机构意识到微信平台的巨大营销价值,微信将是未来几年最具影响力的新媒体,但是我们也清楚看到互联网营销培训行业鱼目混珠,互联网一夜之间冒出N多所谓的微信培训大师,让各位大佬一时蒙混了双眼,不知道做好选择
      小编今天的出现只为你分析判断,如何打胜微信营销这一仗
许多微信营销软件拥有很多共同点,这些小编不再啰嗦,主讲重点:
1.    开发商 是否拥有强大的开发团队
2.    源码是否完全开源,是否有技术支持
3.    是否拥有一支专业售后团体
4.    功能是否完善,bug能不能及时修复
      小编接触很多款微信营销软件,盗版的就不再多说,存活时间太多,不会有市场,购买只会让你打掉门牙往肚里咽。
      闲话不多说,在此只是举例说明,微信营销,重在把握时机,同时找对微信营销软件!!
      再者,如今你又晓得微信营销的哪些功能呢?我给大家略说几项它的功能:
人工客服新功能正式上线!粉丝行为分析、渠道二维码生成、二维码折扣,微菜 单,微统计,会员卡签到,微会员,刮刮卡,大转盘,优惠券,积分兑换,微官网,砸金蛋,微调研,微投票,微相册,微商城,微团购,微留言,微喜帖,商家入 驻,微门店,微餐饮,微酒店,微教育,微物业,微医疗,微信墙,微花店,微美容,微生活。微信公共账号轻松接入,无限自定义图文回复。欢迎您的加入!
  
      秋秋:2892491366


2015-10-10 15:24:51 u010592604 阅读数 2939
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

这里接上一篇:服务器配置

既然我们选用了开发者中心,那微信公众平台的自动回复就不得行了,那就自己开发吧。

这就要在服务器配置的URL里面处理了。


一、自动回复处理代码

@RequestMapping(value="/api",method=RequestMethod.POST)
	public void initPostAPI(HttpServletRequest request, HttpServletResponse response)
	{
		String Event = "";
		String MsgType = "";
		String Content = "";
		String strJson = new String();
		 // 将请求、响应的编码均设置为UTF-8(防止中文乱码)  
       try {
			request.setCharacterEncoding("UTF-8");
			response.setCharacterEncoding("UTF-8");  
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
// 调用核心业务类接收消息、处理消息
       User user = new User();

        String respMessage = "";//反馈信息
        Map<String, String> map = new HashMap<String, String>();  
        try {
			map = parseXml(request);
	} catch (Exception e) {
		e.printStackTrace();
	}
        
        Event = map.get("Event");
        MsgType = map.get("MsgType");
        Content = map.get("Content");
        
        System.out.println("Content = " + Content);
        System.out.println("MsgType = " + MsgType);
        System.out.println("Event = " + Event);
        System.out.println("EventKey = " + map.get("EventKey"));
        if(Event == null){//Event为null 则为用户输入信息被动回复
        	//自动回复用户信息
        	if(MsgType.equals("text")){
        		strJson = sendMess(map,strJson, Content);
        	}
       }
            SendUserMess.sendMess(strJson);
	}


二、这是回复信息内容的处理(文本信息,图文信息)

public String sendMess(Map map,String strJson,String Content){
		
		//根据用户输入的关键字查询对应响应
		AutoReply autoReply = new AutoReply();
		autoReply.setKeyName(Content);
		List<AutoReply> list = this.replyService.findByKeyname(autoReply);
		System.out.println("list size = "+list.size());
		
		//向用户回复消息
		if(list.size() != 0){
			autoReply = list.get(0);
			System.out.println("KeyValue-----"+autoReply.getKeyValue()+"--");
			
			if(!autoReply.getKeyValue().equals("")){
				strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
		        strJson += "\"msgtype\":\"text\",";
		        strJson += "\"text\":{";
		        strJson += "\"content\":\""+autoReply.getKeyValue()+"\"";
		        strJson += "}}";
			}else if(!autoReply.getGraphic().equals("")){
				String newsinfo = "";
				String[] strs = autoReply.getGraphic().split(",");
				strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
		        strJson += "\"msgtype\":\"news\",";
		        strJson += "\"news\":";
				String news = "{\"articles\": [";
				System.out.println(news);
				
				for(String str:strs){
					Graphic graphic = graphicService.loadByPK(Integer.valueOf(str));
					String url = graphic.getPicurl();
					//url = saveUrl + url.substring(24);
					
					newsinfo += "{\"title\":\""+graphic.getTitle()+"\"," +
										"\"description\":\""+graphic.getDescription()+"\",\"url\":\""+graphic.getUrl()+"\"," +
										"\"picurl\":\""+url+"\""+
										"},";
				}
				
				news = news + newsinfo.substring(0, (newsinfo.length()-1));
				news = news + "]}";
				strJson += news;
				strJson += "}";
				System.out.println("news-------"+news);
			}
		}else{//如果在数据库中找不到对应回复用户的信息则回复默认消息
			autoReply.setKeyName("未知");
			List<AutoReply> list_ = this.replyService.findByKeyname(autoReply);
			autoReply = list_.get(0);
			
			/*StringBuffer content = new StringBuffer();
			content.append("感谢您!").append("\n");
			content.append("再次感谢您").append("\n");
			content.append("再次再次感谢您");*/
			//拼装需要发送的消息
			strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
	        strJson += "\"msgtype\":\"text\",";
	        strJson += "\"text\":{";
	        strJson += "\"content\":\""+autoReply.getKeyValue()+"\"";
	        strJson += "}}";
		}
		return strJson;
	}

三、核心代码 SendUserMess

public class SendUserMess {
	public static void sendMess(String jsonParam){
		String openIdUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";

		String result = null;
		result = String.format(openIdUrl, urlEnodeUTF8(Const.AppId),
				urlEnodeUTF8(Const.AppSecrect));

		try {
			System.out.println("Staring");
			// 创建HttpClient实例
			DefaultHttpClient  httpClient = new DefaultHttpClient ();
			// 创建Get方法实例
			HttpGet method = new HttpGet(result);
			HttpResponse re = httpClient.execute(method);
			String resData = EntityUtils.toString(re.getEntity());
			method.releaseConnection();
			System.out.println("get weixinnumber ..." + resData);
			JSONObject obj = JSONObject.fromObject(resData);
			if (obj != null) {
				String token = obj.getString("access_token");
				System.out.println("token = " + token);
                //获取ticket
				String sendMessUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s";
				result = String.format(sendMessUrl, token);
				
				httpClient = new DefaultHttpClient();
				
				/*JSONObject jsonParam = new JSONObject();
				jsonParam.put("touser", ""+openId+"");
				jsonParam.put("msgtype", "text");
				jsonParam.put("text", "{'content': '"+respMessage+"'}");*/
				
				System.out.println(jsonParam);
				
				StringEntity entity = new StringEntity(jsonParam,"utf-8");//解决中文乱码问题    
                entity.setContentEncoding("UTF-8");    
                entity.setContentType("application/json");    
				
				// 创建Get方法实例
				HttpPost me = new HttpPost(result);
				me.setEntity(entity);
				HttpResponse hr = httpClient.execute(me);
				String data = EntityUtils.toString(hr.getEntity());
				me.releaseConnection();

				JSONObject userInfo = JSONObject.fromObject(data);
				System.out.println("get backMessage ..." + data);
				
			}
		} catch (Exception ex) {
			System.out.println("error");
			System.out.println(ex.getMessage());
		}
	}
	
	private static String urlEnodeUTF8(String str){
        String result = str;
        try {
            result = URLEncoder.encode(str,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


这里我用的不是自动回复的哪个接口, 而是用的“发送客服消息”的接口,一样可以达到效果。也可以试下哪个自动回复的接口,反正大体都一样

2018-08-24 17:52:19 luolan9611 阅读数 1302
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

2018年8月24日,沉迷于学习微信公众号开发。

本篇文章是传智播客课程“PHP微信公众平台开发”前十二节课的课程笔记。课程的视频链接http://yun.itheima.com/course/163.html ,视频可免费下载,我觉得老师讲得挺好的,采用的是百度云BAE。同时,推荐方倍工作室的博客园(微信公众平台开发入门教程),采用新浪云SAE。

本课程笔记和源码可供下载:https://download.csdn.net/download/luolan9611/10625215

本笔记目录

一,微信公众平台

1,什么是微信公众平台

2,微信与微信公众平台区别

3,微信公众平台开发

4,开发者模式原理图

二,自定义服务器(BAE)

1,登陆百度云平台

2,登陆BAE云引擎

3,单击添加部署按钮

5,管理BAE云平台

三,微信官方接口

①获取微信API接口

②下载API接口文件

解压后如下图所示:

③复制wx_sample.php文件到项目相关目录中,并更名为api.php,设置TOKEN密钥文件

④打开微信公众平台开发者中心,填写以下信息:

⑤通过微信手机端进行测试

⑥开启自动回复功能

⑦再次测试

四,微信官方接口详细分析

五,微信的6大接收接口

         1.  文本消息接口

2,图片消息接口

....其它接口大同小异

六,微信文本回复接口

七,简易号码簿

八,音乐回复接口

九,微信的图文回复接口

十,LBS开发

十一,微信LBS案例

十二,微信的机器人开发

 

一,微信公众平台

1,什么是微信公众平台

微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个网络平台,而微信公众账号的操作管理在这个平台下进行所有用户都在腾讯提供的统一微信公众平台下进行相关操作:平台地址:https://mp.weixin.qq.com/

2,微信与微信公众平台区别

微信是基于点对点关系

微信公众平台是基于一对多关系

3,微信公众平台开发

开发者模式

1)微信公众平台账号(https://mp.weixin.qq.com

订阅号:个人版用户,每天可以群发一条消息

服务号:企业版用户,每月可以群发四条消息

2)在线虚拟主机或服务器(SAE云引擎,BAE云引擎,阿里云服务器)

3)TortoiseSVN的(SVN客户端软件)

4,开发者模式原理图

解释一下这个开发者模式原理图:我们在微信手机端发送的消息,是被送入腾讯的web服务器,由腾讯的web服务器将消息转发到我们的自定义服务器中。自定义服务器中的代码就是我们写的PHP源代码,它处理接收的消息,并做出相应回应,该回应不会直接到达微信手机端,仍旧是以腾讯的web服务器为中介,进行处理转发才能到手机端。自定义服务器可以选择百度云BAE,新浪云SAE或者阿里云。本教程使用的是百度云BAE,若参考方倍工作室教程,可选择新浪云SAE。TortoiseSVN是一个代码版本库,用于将本地的代码上传或者提交更新到自定义服务器中。

 

二,自定义服务器(BAE)

1,登陆百度云平台

http://bce.baidu.com/index.html

2,登陆BAE云引擎

3,单击添加部署按钮

如图4所示,设置相关参数

单击确认即可。

单击域名,如出现如下图所示界面,代表创建成功

5,管理BAE云平台

在本地的Apache工作目录创建微信文件夹,然后使用SVN软件进行连接操作,然后输入用户名与密码(百度的账号与密码)即可下载服务端数据到本地。

 

如图6所示,可以修改的index.php文件

修改的index.php然后通过SVN软件提交到BAE云引擎,但是浏览器发现系统依然没有改变

原因:因为默认情况下,百度云引擎需要手工发布

如果不想每次都手工发布源代码,可以单击微信进入配置目录,进行发布设置

发布成功后,再次浏览器,效果如下:

 

 

三,微信官方接口

1,对接微信公众平台

①获取微信API接口

 

②下载API接口文件

解压后如下图所示:

以上文件就是我们的API文件

 

③复制wx_sample.php文件到项目相关目录中,并更名为api.php,设置TOKEN密钥文件

通过SVN软件上传api.php文件到BAE。

 

④打开微信公众平台开发者中心,填写以下信息:

确认无误后,单击提交按钮,效果如下图所示:

如果第一次提交失败,可以再次提交。

 

⑤通过微信手机端进行测试

第一次测试时,系统没有任何返回,因为api.php接口文件主要负责验证操作,并没有返回任何信息。

 

⑥开启自动回复功能

再次提交数据到BAE云引擎中。

 

⑦再次测试

如果出现以上提示代表接入成功!

 

四,微信官方接口详细分析

如图1所示,验证功能有效()

2,自定义回复功能responseMsg()

详细分析请参考api.php文件

 

五,微信的6大接收接口

1.文本消息接口

说明:如果用户发送过来的XML数据中,MSGTYPE节点为“文本”,就代表用户发送的是文本消息。

接口开发步骤:

①在接收时,接收MsgType节点

②在接收消息时对$ msgType进行相关判断

修改完成后,上传源代码到BAE引擎中

测试效果:

 

2,图片消息接口

编写代码如下:

测试结果:

 

六,微信文本回复接口

如图1所示,文本回复接口XML模板

2,文本回复开发步骤

①组装XML数据

②设置相关参数

③格式化字符串(重要)

string sprintf(string $format[,mixed $args [,mixed $... ]])

功能:返回格式化后的字符串

参数说明:

$ format:要格式的话的模板信息

$ args:要格式化的变量

%s:把变量格式化为字符串

 

④返回格式化后的XML数据到微信客户端(用户端)

 

⑤微信公众平台如何判断用户发送的关键词

 

修改完成后,通过SVN软件上传源代码到BAE云引擎中,测试结果:

 

七,简易号码簿

1,项目需求

当用户在微信公众平台中输入问号时,自动弹出如下信息

【1】特种服务号码

【2】通讯服务号码

【3】银行服务号码

您可以通过输入【】方括号的编号获取内容哦!

 

回复1

常用特种服务号码:

匪警:110

火警:119

 

回复2

常用通讯服务号码:

中移动:10086

中电信:10000

 

回复3

常用银行服务号码:

工商银行:95588

建设银行:95533

2.开发步骤

修改完成后,提交到百度BAE,测试效果:

 

八,音乐回复接口

1,音乐回复接口中的XML模板

2,音乐回复接口开发步骤

①组装XML模板

②设定回复关键词

编写完成后,通过SVN上传到BAE中,测试结果如下:

 

九,微信的图文回复接口

1,微信的图文接口XML模板

2,图文消息接口开发

①组装XML文档

 

②设置相关参数

 

③格式化字符串

 

修改完成后,通过SVN软件提交源代码到BAE云引擎中,测试结果如下:

 

十,LBS开发

1,什么是LBS

基于位置的服务:基于地理位置的服务

2,接收地理位置信息

3,LBS开发步骤:

①判断$ msgType类型为“location”类型的数据

②几个关键词

$经度经度

$ latitude纬度

③通过以上两个变量接收用户传递的经纬度信息

 

④通过文本消息返回用户的经纬度信息

⑤上传代码到BAE,测试结果:

 

十一,微信LBS案例

1,项目需求

根据用户上传的地理位置,显示客户所在详细地理位置。

说明:在LBS接口中,我们可以获取用户的经纬度信息,那么在开发过程中如果通过LBS接口获取用户的详细信息呢?

2,百度LBS接口

http://developer.baidu.com/

进入接口说明:

反地理编码接口:把经纬度转化为详细的地址信息

说明:我们单击接口示例代码,发现可以直接获取到相关数据,代表当前接口使用的是的Http中的GET请求,在实际项目开发中,可以通过的file_get_contents函数来模拟GET请求

3,调用车联网LBS案例

 

4,在微信接口中调用车联网API

5,上传源代码到BAE中,测试结果:

 

 

十二,微信的机器人开发

1,为什么需要微信机器人

当用户输入的关键词与我们设定关键词不匹配时,系统不会返回任何,这样用户体验不是很好,那么如何解决这种问题?

答:可以通过微信聊天机器人对接用户消息

2,图灵机器人

网址:http//www.tuling123.com

 

3,通过微信对接图灵机器人

接口说明:

详细代码:

上传源代码到BAE,测试结果:

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