这篇文章将为大家详细讲解有关asp.net微信开发消息应答方法的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创新互联的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括网站设计、网站制作、电商网站开发、微信营销、系统平台开发。
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
请注意:
1、关于重试的消息排重,推荐使用msgid排重。 2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。 3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。
各消息类型的推送XML数据包结构如下:
1348831860 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
1348831860 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | image |
PicUrl | 图片链接 |
MediaId | 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
MsgId | 消息id,64位整型 |
1357290913 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 语音为voice |
MediaId | 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
Format | 语音格式,如amr,speex等 |
MsgID | 消息id,64位整型 |
请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段 (注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启 语音识别后的语音XML数据包如下:
1357290913 1234567890123456
多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。
1357290913 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 视频为video |
MediaId | 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 |
MsgId | 消息id,64位整型 |
1357290913 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 小视频为shortvideo |
MediaId | 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 |
MsgId | 消息id,64位整型 |
1351776360 23.134521 113.358803 20 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | location |
Location_X | 地理位置维度 |
Location_Y | 地理位置经度 |
Scale | 地图缩放大小 |
Label | 地理位置信息 |
MsgId | 消息id,64位整型 |
1351776360 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 接收方微信号 |
FromUserName | 发送方微信号,若为普通用户,则是一个OpenID |
CreateTime | 消息创建时间 |
MsgType | 消息类型,link |
Title | 消息标题 |
Description | 消息描述 |
Url | 消息链接 |
MsgId | 消息id,64位整型 |
接上篇,看ResponseXML(postString);方法如下
///
/// 获取用户发送的消息
///
///
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是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:
///
/// 接收消息的实体类
///
public class RequestXML
{
private String toUserName = String.Empty;
///
/// 本公众号
///
public String ToUserName{get;set;}
///
/// 用户微信号
///
public String FromUserName{get;set;}
///
/// 创建时间
///
public String CreateTime{get;set;}
///
/// 信息类型
///
public String MsgType{get;set;}
///
/// 信息内容
///
public String Content{get;set;}
/*以下为事件类型的消息特有的属性*/
///
/// 事件名称
///
public String EventName{get;set;}
///
/// 事件值
///
public string EventKey { get; set; }
/*以下为图文类型的消息特有的属性*/
///
/// 图文消息的个数
///
public int ArticleCount { get; set; }
///
/// 图文消息的标题
///
public string Title { get; set; }
///
/// 图文消息的简介
///
public string Description { get; set; }
///
/// 图文消息图片的链接地址
///
public string PicUrl { get; set; }
///
/// 图文消息详情链接地址
///
public string Url { get; set; }
///
/// 图文消息集合
///
public List
/*以下为地理位置类型的消息特有的属性*/
///
/// 地理位置纬度
///
public String Location_X { get; set; }
///
/// 地理位置经度
///
public String Location_Y { get; set; }
///
/// 地图缩放比例
///
public String Scale { get; set; }
///
/// 地图位置说明
///
public String Label { get; set; }
///
/// 语音消息特有字段
///
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);//发送文本消息
///
/// 发送文本
///
///
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方法制定格式
///
/// 返回格式化的Xml格式内容
///
/// 公众号
/// 用户号
/// 回复内容
///
private string FormatTextXML(string p1, string p2, string p3)
{
return "
}
这样就能实现消息的应答,如果用户点击的按钮,如下代码:
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;
///
/// 发送响应事件消息
///
///
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);//关注时返回的图文消息
///
/// 发送关注时的图文消息
///
///
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是图文消息格式化
///
/// 返回图文消息主体
///
public static string Message_News_Main
{
get
{
return @"
{4}
}
}
///
/// 返回图文消息项
///
public static string Message_News_Item
{
get
{
return @"
}
}
///
/// 发送响应语音识别结果
///
///
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();
}
点击查看全文,直接跳转至自己写的网页,关于网页图片自适应的问题,把图片的宽度设置为100%,即可,如果让网页在屏幕中自适应,记得在网页中一定要添加
关于“asp.net微信开发消息应答方法的示例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。