2017-04-23 15:43:18 aojiancc2 阅读数 2011
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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


            

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


           

           

                   微信普通消息分为:

            

   

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

             

          注意在接收用户普通消息的时候,推送的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();
        }
    }
             

           效果如下

            

           

           




          

2017-04-22 10:18:33 hq0556 阅读数 219
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

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

本篇根据开发者文档-接收普通消息编写。请对照查看,一些传入与返回参数就不过多介绍。地址为:https://mp.weixin.qq.com/wiki/14/f79bdec63116f376113937e173652ba2.html


当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。请注意:

  • 关于重试的消息排重,推荐使用msgid排重。
  • 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
  • 为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。

消息类型有:

  public static final String REQ_MESSAGE_TYPE_TEXT            = "text";                   //请求消息类型:文本
    public static final String REQ_MESSAGE_TYPE_IMAGE           = "image";              //请求消息类型:图片
    public static final String REQ_MESSAGE_TYPE_VOICE           = "voice";              //请求消息类型:语音
    public static final String REQ_MESSAGE_TYPE_VIDEO           = "video";              //请求消息类型:视频
    public static final String REQ_MESSAGE_TYPE_SHORTVIDEO      = "shortvideo"; //请求消息类型:小视频
    public static final String REQ_MESSAGE_TYPE_LINK            = "link";                   //请求消息类型:链接
    public static final String REQ_MESSAGE_TYPE_LOCATION        = "location";           //请求消息类型:地理位置
    public static final String REQ_MESSAGE_TYPE_EVENT           = "event";              //请求消息类型:推送
/*
 * 接收普通消息
 * http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
 */
@XmlRootElement
public class BaseReqMsg {

    @XmlElement(name = "ToUserName")  
    private String ToUserName;          // 开发者微信号

    @XmlElement(name = "FromUserName")  
    private String FromUserName;        // 发送方帐号(一个OpenID)

    @XmlElement(name = "CreateTime")  
    private long CreateTime;            // 消息创建时间 (整型)

    @XmlElement(name = "MsgType")  
    private String MsgType;             // 消息类型(text/image/location/link)

    @XmlElement(name = "MsgId")  
    private long MsgId;                 // 消息id,64位整型
}

文本消息

/*
 * MsgType--->
 * text:文本消息
 */
@XmlRootElement
public class TextReqMsg extends BaseReqMsg {

    @XmlElement(name = "Content") 
    private String Content;     //文本消息内容

    public String getContent() {
        return Content;
    }
    public void setContent(String content) {
        Content = content;
    }

    /*
     * 接收到的文本示例
     * <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>
     */
    public static TextReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "textReqMsg");
        JAXBContext context = JAXBContext.newInstance(TextReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (TextReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

图片消息

/*
 * MsgType--->
 * image:图片消息
 */
@XmlRootElement
public class ImageReqMsg extends BaseReqMsg {

    @XmlElement(name = "PicUrl")  
    private String PicUrl ;     //图片链接(由系统生成)

    @XmlElement(name = "MediaId")  
    private String MediaId ;    //  图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

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

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

    /*
     * 接收到的文本示例
     * <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>
     */
    public static ImageReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "imageReqMsg");
        JAXBContext context = JAXBContext.newInstance(ImageReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (ImageReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

语音消息

/*
 * MsgType--->
 * voice:语音消息
 */
@XmlRootElement
public class VoiceReqMsg extends BaseReqMsg {

    @XmlElement(name = "MediaId")
    private String MediaId;     //语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体

    @XmlElement(name = "Format")
    private String Format;      //  语音格式:amr

    @XmlElement(name = "Recognition")
    private String Recognition; //  语音识别结果,UTF8编码.需开通开通语音识别

    public String getMediaID() {
        return MediaId;
    }
    public void setMediaID(String mediaID) {
        MediaId = mediaID;
    }

    public String getFormat() {
        return Format;
    }
    public void setFormat(String format) {
        Format = format;
    }

    public String getRecognition() {
        return Recognition;
    }
    public void setRecognition(String recognition) {
        Recognition = recognition;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[fromUser]]></FromUserName>
     *  <CreateTime>1357290913</CreateTime>
     *  <MsgType><![CDATA[voice]]></MsgType>
     *  <MediaId><![CDATA[media_id]]></MediaId>
     *  <Format><![CDATA[Format]]></Format>
     *  <Recognition><![CDATA[腾讯微信团队]]></Recognition>
     *  <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static VoiceReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "voiceReqMsg");
        JAXBContext context = JAXBContext.newInstance(VoiceReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (VoiceReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

视频消息/小视频消息

/*
 * MsgType--->
 * shortvideo:小视频消息
 * video:视频消息
 */
@XmlRootElement
public class VideoReqMsg extends BaseReqMsg {

    @XmlElement(name = "MediaId") 
    private String MediaId;     //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。

    @XmlElement(name = "ThumbMediaId") 
    private String ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

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

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

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[fromUser]]></FromUserName>
     *  <CreateTime>1357290913</CreateTime>
     *  <MsgType><![CDATA[video|shortvideo ]]></MsgType>
     *  <MediaId><![CDATA[media_id]]></MediaId>
     *  <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
     *  <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static VideoReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "videoReqMsg");
        JAXBContext context = JAXBContext.newInstance(VideoReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (VideoReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

地理位置消息

/*
 * MsgType--->
 * location:地理位置消息
 */
@XmlRootElement
public class LocationReqMsg extends BaseReqMsg {

    @XmlElement(name = "Location_X") 
    private float Location_X;       //地理位置维度

    @XmlElement(name = "Location_Y") 
    private float Location_Y;       //地理位置经度

    @XmlElement(name = "Scale") 
    private float Scale;            //地图缩放大小

    @XmlElement(name = "Label") 
    private String Label;           //地理位置信息

    public float getLocation_X() {
        return Location_X;
    }
    public void setLocation_X(float location_X) {
        Location_X = location_X;
    }

    public float getLocation_Y() {
        return Location_Y;
    }
    public void setLocation_Y(float location_Y) {
        Location_Y = location_Y;
    }

    public float getScale() {
        return Scale;
    }
    public void setScale(float scale) {
        Scale = scale;
    }

    public String getLabel() {
        return Label;
    }
    public void setLabel(String label) {
        Label = label;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[fromUser]]></FromUserName>
     *  <CreateTime>1351776360</CreateTime>
     *  <MsgType><![CDATA[location]]></MsgType>
     *  <Location_X>23.134521</Location_X>
     *  <Location_Y>113.358803</Location_Y>
     *  <Scale>20</Scale>
     *  <Label><![CDATA[位置信息]]></Label>
     *  <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static LocationReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "locationReqMsg");
        JAXBContext context = JAXBContext.newInstance(LocationReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (LocationReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

链接消息

/*
 * MsgType--->
 * link:链接消息
 */
@XmlRootElement
public class LinkReqMsg extends BaseReqMsg {

    @XmlElement(name = "Title") 
    private String Title;       //消息标题

    @XmlElement(name = "Description") 
    private String Description; //消息描述

    @XmlElement(name = "Url") 
    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 getUrl() {
        return Url;
    }
    public void setUrl(String url) {
        Url = url;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[fromUser]]></FromUserName>
     *  <CreateTime>1351776360</CreateTime>
     *  <MsgType><![CDATA[link]]></MsgType>
     *  <Title><![CDATA[公众平台官网链接]]></Title>
     *  <Description><![CDATA[公众平台官网链接]]></Description>
     *  <Url><![CDATA[url]]></Url>
     *  <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static LinkReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "linkReqMsg");
        JAXBContext context = JAXBContext.newInstance(LinkReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (LinkReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}
2016-10-03 11:16:52 qiandublog 阅读数 2049
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

微信开发之接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

请注意:

1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。

各消息类型的推送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>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType text
Content 文本消息内容
MsgId 消息id,64位整型

使用网页调试工具调试该接口

图片消息

 <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>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType image
PicUrl 图片链接
MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId 消息id,64位整型

使用网页调试工具调试该接口

语音消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 语音为voice
MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
Format 语音格式,如amr,speex等
MsgID 消息id,64位整型

使用网页调试工具调试该接口

请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>

多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。

视频消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 视频为video
MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId 消息id,64位整型

使用网页调试工具调试该接口

小视频消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 小视频为shortvideo
MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId 消息id,64位整型

使用网页调试工具调试该接口

地理位置消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml> 
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType location
Location_X 地理位置维度
Location_Y 地理位置经度
Scale 地图缩放大小
Label 地理位置信息
MsgId 消息id,64位整型

使用网页调试工具调试该接口

链接消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml> 
参数 描述
ToUserName 接收方微信号
FromUserName 发送方微信号,若为普通用户,则是一个OpenID
CreateTime 消息创建时间
MsgType 消息类型,link
Title 消息标题
Description 消息描述
Url 消息链接
MsgId 消息id,64位整型

使用网页调试工具调试该接口


2014-08-01 23:08:00 weixin_30840253 阅读数 7
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

微信开发回复消息收不到的最大罪魁祸首,微信公众账号为什么回复消息不成功的原因解决办法

上一篇文章讲到如何配置微信开发,以及.NET平台使用MVC做一个小DEMO的流程,还有常见收不到消息的问题,本篇文章讲的是一个很容易让人忽略但又是很重要的问题导致用户收不到响应的消息原因。

上一篇文章链接:[C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题]

(如果你是通过搜索引擎进来的建议你看下上篇文章,说不定就解决你的问题了)

这个问题出在代码

首先我们的C#代码是这么写的:

 1 //接收/回复 消息接口
 2         [HttpPost]
 3         public ActionResult WeiXin()
 4         {
 5             Request.ContentEncoding = Encoding.UTF8;
 6             var msg = XmlHelper.ToObject<WxTextMessage.Accept>(Request.InputStream);
 7             if (msg == null)
 8                 return Content("");
 9             WxTextMessage.Send smsg = new WxTextMessage.Send() { Content = "ccc", CreateTime = msg.CreateTime, FromUserName = msg.FromUserName, ToUserName = msg.ToUserName };
10             var str = XmlHelper.ToXml(smsg);
11             return Content(str,"text/xml",Encoding.UTF8);
12         }

第5~8行:将XML数据转换为对象

第9~11行:实例化回复消息对象、转换为XML、返回结果

 

看出什么问题了吗?(反正我是看了几个小时才发现的)

其实这样写犯了个巨大的错误:

在第9行的地方:响应的消息中:

FromUserName = msg.FromUserName, ToUserName = msg.ToUserName

错误的原因就在为:msg为接收到的消息,而我们实例化的是返回的消息,在接收时:FromUser=用户 ToUser=我 ,然而在返回消息时From和To是反过来的,FromUser=我 ToUser=用户,如果直接这样写就变成了给自己发送消息,因此要反过来写变成:

FromUserName = msg.ToUserName, ToUserName = msg.FromUserName

这样一改,用户立即能收到回复的消息,如此简单的细节居然浪费俺一晚上的时间,真的是不甘心啊!

写篇文章帮助更多遇到这个问题的人……

 

转载于:https://www.cnblogs.com/yzeng/p/3885981.html

2017-07-29 21:17:14 phil_jing 阅读数 2288
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

一定要先看下官方文档

微信消息管理分为接收普通消息、接收事件推送、发送消息(被动回复)、客服消息、群发消息、模板消息这几部分

一、接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

关于MsgId,官方给出解释,相当于每个消息ID,关于重试的消息排重,推荐使用msgid排重。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

比如文本消息的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>
其他的消息去官方文档查看,简单封装如下

消息抽象基类AbstractMsg.java

package com.phil.wechat.msg.model.req;

import java.io.Serializable;

/**
 * 基础消息类
 * 
 * @author phil
 * 
 */
public abstract class AbstractMsg implements Serializable {
	
	private static final long serialVersionUID = -6244277633057415731L;
	private String ToUserName; // 开发者微信号
	private String FromUserName; // 发送方帐号(一个OpenID)
	private String MsgType = SetMsgType(); // 消息类型 例如 /text/image
	private long CreateTime; // 消息创建时间 (整型)
	private long MsgId; // 消息id,64位整型
	/**
	 * 消息类型
	 * 
	 * @return
	 */
	public abstract String SetMsgType();
}

文本消息TextMsg.java

package com.phil.wechat.msg.model.req;

/**
 * 文本消息
 * @author phil
 * @date  2017年6月30日
 *
 */
public class TextMsg extends AbstractMsg {

	private static final long serialVersionUID = -1764016801417503409L;
	private String Content; // 文本消息
	@Override
	public String SetMsgType() {
		return "text";
	}
}

其他的依样画葫芦......

二、被动回复用户消息

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

如果出现“该公众号暂时无法提供服务,请稍后再试”,原因有两个

  • 开发者在5秒内未回复任何内容
  • 开发者回复了异常数据
比如回复的文本消息Xml示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
简单封装下
回复消息抽象基类RespAbstractMsg.java
package com.phil.wechat.msg.model.resp;

import java.io.Serializable;

/**
 * 消息基类(公众帐号 -> 普通用户)
 * 
 * @author phil
 *
 */
public abstract class RespAbstractMsg{
	// 接收方帐号(收到的OpenID)
	private String ToUserName;
	// 开发者微信号
	private String FromUserName;
	// 消息创建时间 (整型)
	private long CreateTime;
	// 消息类型(text/music/news)
	private String MsgType = setMsgType(); // 消息类型
	public abstract String setMsgType();
}
回复文本消息RespTextMsg.java
package com.phil.wechat.msg.model.resp;

/**
 * 回复图片消息
 * 
 * @author phil
 * @data 2017年3月26日
 *
 */
public class RespImageMsg extends RespAbstractMsg {
	private Image Image;
	@Override
	public String setMsgType() {
		return "image";
	}

	/**
	 * 
	 * @author phil
	 * @date 2017年7月19日
	 *
	 */
	public class Image {

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

		public String getMediaId() {
			return MediaId;
		}

		public void setMediaId(String mediaId) {
			MediaId = mediaId;
		}
	}
}
其他消息类型依样画葫芦......

三、消息的处理

掌握xml解析

package com.phil.wechat.msg.controller;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.dom4j.DocumentException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.phil.modules.config.WechatConfig;
import com.phil.modules.util.MsgUtil;
import com.phil.modules.util.SignatureUtil;
import com.phil.modules.util.XmlUtil;
import com.phil.wechat.base.controller.BaseController;
import com.phil.wechat.base.result.WechatResult;
import com.phil.wechat.msg.model.req.BasicMsg;
import com.phil.wechat.msg.model.resp.RespAbstractMsg;
import com.phil.wechat.msg.model.resp.RespNewsMsg;
import com.phil.wechat.msg.service.WechatMsgService;

/**
 * @author phil
 * @date  2017年9月19日
 *
 */
@Controller
@RequestMapping("/wechat")
public class WechatMsgController extends BaseController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private WechatMsgService wechatMsgService;
	
	/**
	 * 校验信息是否是从微信服务器发出,处理消息
	 * @param out
	 * @throws IOException
	 */
	@RequestMapping(value = "/handler", method = { RequestMethod.GET, RequestMethod.POST })
	public void processPost() throws Exception {
		this.getRequest().setCharacterEncoding("UTF-8");
		this.getResponse().setCharacterEncoding("UTF-8");
		boolean ispost = Objects.equals("POST", this.getRequest().getMethod().toUpperCase());
		if (ispost) {
			logger.debug("接入成功,正在处理逻辑");
			String respXml = defaultMsgDisPose(this.getRequest().getInputStream());//processRequest(request, response);
			if (StringUtils.isNotBlank(respXml)) {
				this.getResponse().getWriter().write(respXml);
			}
		} else {
			String signature = this.getRequest().getParameter("signature");
			// 时间戳
			String timestamp = this.getRequest().getParameter("timestamp");
			// 随机数
			String nonce = this.getRequest().getParameter("nonce");
			// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
			if (SignatureUtil.checkSignature(signature, timestamp, nonce)) {
				// 随机字符串
				String echostr = this.getRequest().getParameter("echostr");
				logger.debug("接入成功,echostr {}", echostr);
				this.getResponse().getWriter().write(echostr);
			}
		}
	}

	/**
	 * 默认处理方法
	 * @param input
	 * @return
	 * @throws Exception
	 * @throws DocumentException
	 */
	private String defaultMsgDisPose(InputStream inputStream) throws Exception {
		String result = null;
		if (inputStream != null) {
			Map<String, String> params = XmlUtil.parseStreamToMap(inputStream);
			if (params != null && params.size() > 0) {
				BasicMsg msgInfo = new BasicMsg();
				String createTime = params.get("CreateTime");
				String msgId = params.get("MsgId");
				msgInfo.setCreateTime((createTime != null && !"".equals(createTime)) ? Integer.parseInt(createTime) : 0);
				msgInfo.setFromUserName(params.get("FromUserName"));
				msgInfo.setMsgId((msgId != null && !"".equals(msgId)) ? Long.parseLong(msgId) : 0);
				msgInfo.setToUserName(params.get("ToUserName"));
				WechatResult resultObj = coreHandler(msgInfo, params);
				if(resultObj == null){ //
					return null;
				}
				boolean success = resultObj.isSuccess();  //如果 为true,则表示返回xml文件, 直接转换即可,否则按类型
				if (success) {
					result = resultObj.getObject().toString();
				} else {
					int type = resultObj.getType(); // 这里规定 1 图文消息 否则直接转换
					if (type == WechatResult.NEWSMSG) {
						RespNewsMsg newsMsg = (RespNewsMsg) resultObj.getObject();
						result = MsgUtil.newsMsgToXml(newsMsg);
					} else {
						RespAbstractMsg basicMsg = (RespAbstractMsg) resultObj.getObject();
						result = MsgUtil.msgToXml(basicMsg);
					}
				}
			} else {
				result = "msg is wrong";
			}
		}
		return result;
	}
	
	/**
	 * 核心处理
	 * 
	 * @param msg
	 *            消息基类
	 * @param params
	 *            xml 解析出来的 数据
	 * @return
	 */
	private WechatResult coreHandler(BasicMsg msg, Map<String, String> params) {
		WechatResult result = null;
		String msgType = params.get("MsgType");
		if (StringUtils.isNotEmpty(msgType)) {
			switch (msgType) {
			case WechatConfig.REQ_MESSAGE_TYPE_TEXT: // 文本消息
				result = wechatMsgService.textMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_IMAGE: // 图片消息
				result = wechatMsgService.imageMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_LINK: // 链接消息
				result = wechatMsgService.linkMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_LOCATION: // 地理位置
				result = wechatMsgService.locationMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_VOICE: // 音频消息
				result = wechatMsgService.voiceMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_SHORTVIDEO: // 短视频消息
				result = wechatMsgService.shortvideo(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_VIDEO: // 视频消息
				result = wechatMsgService.videoMsg(msg, params);
				break;
			case WechatConfig.REQ_MESSAGE_TYPE_EVENT: // 事件消息
				String eventType = params.get("Event"); //
				if (eventType != null && !"".equals(eventType)) {
					switch (eventType) {
					case WechatConfig.EVENT_TYPE_SUBSCRIBE:
						result = wechatMsgService.subscribe(msg, params);
						break;
					case WechatConfig.EVENT_TYPE_UNSUBSCRIBE:
						result = wechatMsgService.unsubscribe(msg, params);
						break;
					case WechatConfig.EVENT_TYPE_SCAN:
						result = wechatMsgService.scan(msg, params);
						break;
					case WechatConfig.EVENT_TYPE_LOCATION:
						result = wechatMsgService.eventLocation(msg, params);
						break;
					case WechatConfig.EVENT_TYPE_CLICK:
						result = wechatMsgService.eventClick(msg, params);
						break;
					case WechatConfig.EVENT_TYPE_VIEW:
						result = wechatMsgService.eventView(msg, params);
						break;
					case WechatConfig.KF_CREATE_SESSION:
						result = wechatMsgService.kfCreateSession(msg, params);
						break;
					case WechatConfig.KF_CLOSE_SESSION:
						result = wechatMsgService.kfCloseSession(msg, params);
						break;
					case WechatConfig.KF_SWITCH_SESSION:
						result = wechatMsgService.kfSwitchSession(msg, params);
						break;
					default:
						wechatMsgService.eventDefaultReply(msg, params);
						break;
					}
				}
				break;
			default:
				wechatMsgService.defaultMsg(msg, params);
			}
		}
		return result;
	}
}
只是提供个思路,如若参考代码请移步
没有更多推荐了,返回首页