• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    asp.net微信开发(消息应答)

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

    各消息类型的推送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>
     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>
    

     

    语音消息

    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>
    

     请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息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>
    

     

    小视频消息

    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>
    

     地理位置消息

    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> 
    

     

    链接消息

    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> 
    

     

    接上篇,看ResponseXML(postString);方法如下

     /// summary>
     /// 获取用户发送的消息
     /// /summary>
     /// param name="postString">/param>
     private void ResponseXML(string postString)
     {
     //使用XMLDocument加载信息结构  
     XmlDocument xmlDoc = new XmlDocument();
     xmlDoc.LoadXml(postString);
    
     XmlElement rootElement = xmlDoc.DocumentElement;//获取文档的根
    
     XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //获取消息的文本类型
    
     RequestXML requestXML = new RequestXML();//声明实例,获取各个属性并赋值
     requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//公众号
     requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//用户
     requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//创建时间
     requestXML.MsgType = MsgType.InnerText;//消息类型
    
     
    
       
     ///对消息的不同类型进行赋值
     if (requestXML.MsgType == "text")
     {
     //赋值文本信息内容
     requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
    
     }
     if (requestXML.MsgType.Trim() == "location")
     {
     ///赋值地理位置纬度,经度,地图缩放比例,地理位置说明
     requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
     requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
     requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
     requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
     }
     if (requestXML.MsgType.Trim().ToLower() == "event")
     {
     ///赋值事件名称和事件key值
     requestXML.EventName = rootElement.SelectSingleNode("Event").InnerText;
     requestXML.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
    
     }
    
          if (requestXML.MsgType.Trim().ToLower() == "voice")
     {
     ///赋值语音识别结果,赋值之前一定要记得在开发者模式下,把语音识别功能开启,否则获取不到
     requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText;
    
     }
     ResponseMsg(requestXML);
    
    }
    
    

    语音识别功能开启如下:

     

    requestXML是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:

     /// summary>
     /// 接收消息的实体类
     /// /summary>
     public class RequestXML
     {
     private String toUserName = String.Empty;
    
     /// summary>
     /// 本公众号
     /// /summary>
     public String ToUserName{get;set;}
    
     /// summary>
     /// 用户微信号
     /// /summary>
     public String FromUserName{get;set;}
    
     /// summary>
     /// 创建时间
     /// /summary>
     public String CreateTime{get;set;}
    
     /// summary>
     /// 信息类型 
     /// /summary>
     public String MsgType{get;set;}
    
     /// summary>
     /// 信息内容
     /// /summary>
     public String Content{get;set;}
    
     
    
     /*以下为事件类型的消息特有的属性*/
     /// summary>
     /// 事件名称
     /// /summary>
     public String EventName{get;set;}
     /// summary>
     /// 事件值
     /// /summary>
     public string EventKey { get; set; }
    
     
    
    
     /*以下为图文类型的消息特有的属性*/
     /// summary>
     /// 图文消息的个数
     /// /summary>
     public int ArticleCount { get; set; }
     /// summary>
     /// 图文消息的标题
     /// /summary>
     public string Title { get; set; }
     /// summary>
     /// 图文消息的简介
     /// /summary>
     public string Description { get; set; }
     /// summary>
     /// 图文消息图片的链接地址
     /// /summary>
     public string PicUrl { get; set; }
     /// summary>
     /// 图文消息详情链接地址
     /// /summary>
     public string Url { get; set; }
     /// summary>
     /// 图文消息集合
     /// /summary>
     public ListRequestXML> Articles { get; set;}
    
     
    
     /*以下为地理位置类型的消息特有的属性*/
     /// summary>
     /// 地理位置纬度
     /// /summary>
     public String Location_X { get; set; }
    
     /// summary>
     /// 地理位置经度
     /// /summary>
     public String Location_Y { get; set; }
    
     /// summary>
     /// 地图缩放比例
     /// /summary>
     public String Scale { get; set; }
    
     /// summary>
     /// 地图位置说明
     /// /summary>
     public String Label { get; set; }
    
       /// summary>
     /// 语音消息特有字段
     /// /summary>
     public String Recognition { get; set; }
    
    
     
     }
    
    

    继续关注  ResponseMsg(requestXML);方法如下

     private void ResponseMsg(RequestXML requestXML)
     {
     string MsgType = requestXML.MsgType;
    
     try
     {
     //根据消息类型判断发送何种类型消息
     switch (MsgType)
     {
      case "text":
      SendTextCase(requestXML);//发送文本消息
      break;
      case "event"://发送事件消息
      if (!string.IsNullOrWhiteSpace(requestXML.EventName)  requestXML.EventName.ToString().Trim().Equals("subscribe"))
      {
      SendWelComeMsg(requestXML);//关注时返回的图文消息
      }
      else if (!string.IsNullOrWhiteSpace(requestXML.EventName)  requestXML.EventName.ToString().Trim().Equals("CLICK"))
      {
      SendEventMsg(requestXML);//发送事件消息
      }
      break;
    
             case "voice":
      SendVoiceMsg(requestXML);//发送语音消息
      break;
      case "location"://发送位置消息
      SendMapMsg(requestXML);
      break;
      default:
      break;
    
     }
     }
     catch (Exception ex)
     {
     HttpContext.Current.Response.Write(ex.ToString());
     }
     }
    

    先来关注发送文本消息,SendTextCase(requestXML);//发送文本消息

     /// summary>
     /// 发送文本
     /// /summary>
     /// param name="requestXML">/param>
     private void SendTextCase(RequestXML requestXML)
     {
      string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, requestXML.Content);
    
      HttpContext.Current.Response.ContentType = "text/xml";
      HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
      HttpContext.Current.Response.Write(responseContent);
      HttpContext.Current.Response.End();
     }
    
    

     FormatTextXML方法制定格式

     

     /// summary>
     /// 返回格式化的Xml格式内容
     /// /summary>
     /// param name="p1">公众号/param>
     /// param name="p2">用户号/param>
     /// param name="p3">回复内容/param>
     /// returns>/returns>
     private string FormatTextXML(string p1, string p2, string p3)
     {
     return "xml>ToUserName>![CDATA[" + p1 + "]]>/ToUserName>FromUserName>![CDATA[" + p2 + "]]>/FromUserName>CreateTime>" + DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "/CreateTime>MsgType>![CDATA[text]]>/MsgType>Content>![CDATA[" + p3 + "]]>/Content>FuncFlag>1/FuncFlag>/xml>";
     }
    
     
    
    

    这样就能实现消息的应答,如果用户点击的按钮,如下代码:

     case "event"://发送事件消息
      if (!string.IsNullOrWhiteSpace(requestXML.EventName)  requestXML.EventName.ToString().Trim().Equals("subscribe"))
      {
      SendWelComeMsg(requestXML);//关注时返回的图文消息
      }
      else if (!string.IsNullOrWhiteSpace(requestXML.EventName)  requestXML.EventName.ToString().Trim().Equals("CLICK"))
      {
      SendEventMsg(requestXML);//发送事件消息
      }
      break;
    
     /// summary>
     /// 发送响应事件消息
     /// /summary>
     /// param name="requestXML">/param>
     private void SendEventMsg(RequestXML requestXML)
     {
     string keyStr = requestXML.EventKey.ToString();
    
     switch (keyStr)
     {
     case "mypay":
      SendPayDetails(requestXML);//发送薪资账单
      break;
     case "tianqiyubao":
      SendWeaterMessage(requestXML);//发送天气预报
      break;
     case "kaixinyixiao":
      SendKaiXinMessage(requestXML);//发送开心一笑结果集
      break;
     case "updateMessage":
      SendUpdateMessage(requestXML);//发送修改信息链接
      break;
     case "yuangonghuodong":
      SendYuanGongHuoDong(requestXML);//发送学生活动
      break;
     case "yuangongtongzhi":
      SendYuanGongTongZhi(requestXML);//发送员工通知
      break;
     case "youwenbida":
      SendWenti(requestXML);//发送员工提交问题链接
      break;
     case "mywen":
      SendWentiList(requestXML);//发送问题列表链接
      break;
     case "PhoneSerices":
      SendKeFuMessage(requestXML);//接入客服
      break;
     default:
      String responseContent = String.Empty;
      responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName,"此功能暂未开放!敬请期待!");
      HttpContext.Current.Response.ContentType = "text/xml";
      HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
      HttpContext.Current.Response.Write(responseContent);
      HttpContext.Current.Response.End();
      break;
     }
     }
    
    

     SendWelComeMsg(requestXML);//关注时返回的图文消息

     /// summary>
     /// 发送关注时的图文消息
     /// /summary>
     /// param name="requestXML">/param>
     private void SendWelComeMsg(RequestXML requestXML)
     {
     String responseContent = String.Empty;
    
     string newdate = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString();
    
    
     string PUrlfileName = "http://www.deqiaohr.com.cn/weixin/welcome.jpg";
    
     responseContent = string.Format(Message_News_Main, requestXML.FromUserName, requestXML.ToUserName, newdate, "1",
     string.Format(Message_News_Item, "欢迎关注德桥员工服务中心", "苏州德桥人力资源创立于2002年...", PUrlfileName, "http://www.deqiaohr.com.cn/weixin/WxGsjianjie.aspx"));
    
    
     HttpContext.Current.Response.ContentType = "text/xml";
     HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
     HttpContext.Current.Response.Write(responseContent);
     HttpContext.Current.Response.End();
     }
    
    

     Message_News_Main 和Message_News_Item是图文消息格式化

     /// summary>
     /// 返回图文消息主体
     /// /summary>
     public static string Message_News_Main
     {
     get
     {
     return @"xml>
      ToUserName>![CDATA[{0}]]>/ToUserName>
      FromUserName>![CDATA[{1}]]>/FromUserName>
      CreateTime>{2}/CreateTime>
      MsgType>![CDATA[news]]>/MsgType>
      ArticleCount>{3}/ArticleCount>
      Articles>
      {4}
      /Articles>
      /xml> ";
     }
     }
     /// summary>
     /// 返回图文消息项
     /// /summary>
     public static string Message_News_Item
     {
     get
     {
     return @"item>
      Title>![CDATA[{0}]]>/Title> 
      Description>![CDATA[{1}]]>/Description>
      PicUrl>![CDATA[{2}]]>/PicUrl>
      Url>![CDATA[{3}]]>/Url>
      /item>";
     }
     }
    
     /// summary>
     /// 发送响应语音识别结果
     /// /summary>
     /// param name="requestXML">/param>
     private void SendVoiceMsg(RequestXML requestXML)
     {
     string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您刚才说的语音消息识别结果为:" + requestXML.Recognition.ToString());
     HttpContext.Current.Response.ContentType = "text/xml";
     HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
     HttpContext.Current.Response.Write(responseContent);
     HttpContext.Current.Response.End();
     }

    精彩专题分享:ASP.NET微信开发教程汇总,欢迎大家学习。

    以上就是关于asp.net微信开发的第二篇,针对消息应答进行学习,之后会有更新更多关于asp.net微信开发的文章,希望大家持续关注。

    您可能感兴趣的文章:
    • .NET微信公众号 用户分组管理
    • asp.net微信开发(用户分组管理)
    • 微信开发(一) asp.net接入
    • asp.net微信开发(永久素材管理)
    • asp.net微信开发(高级群发图文)
    • asp.net微信开发(高级群发文本)
    • asp.net微信开发(已关注用户管理)
    • asp.net微信开发(开发者接入)
    • asp.net开发微信公众平台之获取用户消息并处理
    • ASP.NET微信公众号之用户分组管理web页面
    上一篇:ASP.NET连接数据库并获取数据方法总结
    下一篇:asp.net微信开发(自定义会话管理)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    asp.net微信开发(消息应答) asp.net,微信,开发,消息,应答,