asp.net微信开发消息应答方法的示例

发布时间:2021-01-30 09:57:09 作者:小新
来源:亿速云 阅读:186

这篇文章将为大家详细讲解有关asp.net微信开发消息应答方法的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

当普通微信用户向公众账号发消息时,微信服务器将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消息创建时间 (整型)
MsgTypetext
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消息创建时间 (整型)
MsgTypeimage
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消息创建时间 (整型)
MsgTypelocation
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位整型

asp.net微信开发消息应答方法的示例

接上篇,看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);

}

语音识别功能开启如下:

asp.net微信开发消息应答方法的示例

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 List<RequestXML> 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微信开发消息应答方法的示例

点击查看全文,直接跳转至自己写的网页,关于网页图片自适应的问题,把图片的宽度设置为100%,即可,如果让网页在屏幕中自适应,记得在网页中一定要添加

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"/>

关于“asp.net微信开发消息应答方法的示例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

推荐阅读:
  1. C#中如何实现文本消息和图文消息应答
  2. 微信开发asp.net接入方法的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

asp.net

上一篇:ASP.NET代码如何实现微信抢红包

下一篇:ASP.NET怎样实现QQ、微信、新浪微博OAuth2.0授权登录

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》