接收消息代码如下(包含回复消息调用):
/// <summary>
/// 接收用户消息
/// iftrue
/// 2014-07-08
/// </summary>
public class Receive
{
public delegate Models.Send_Msg delegate_SendMsg(string msgType);
public delegate void delegate_RececiveHandler(Models.Receive_Msg model,ref string msg);
/// <summary>
/// 获取消息对象并且回复消息(需要根据MsgType强制转换成需要的实体类)
/// </summary>
/// <param name="context">上下文</param>
/// <param name="getSendMsg">获取回复消息的方法</param>
/// <param name="receiveHandler">处理接收消息的方法(如:持久化数据库)</param>
/// <param name="msg">错误信息</param>
/// <returns></returns>
public Models.Receive_Msg GetReceiveMsgAndReply(HttpContext context, delegate_SendMsg getSendMsg,delegate_RececiveHandler receiveHandler, ref string msg)
{
if (context == null)
return null;
try
{
string _xml = new HttpHelper().PostInput(context.Request);
if (string.IsNullOrEmpty(_xml))
return null;
XmlDocument doc = new XmlDocument();
doc.LoadXml(_xml);
XmlElement element = doc.DocumentElement;
Models.Receive_Msg model = GetReceiveModel(element);
//发送被动响应消息
Models.Send_Msg sendModel = getSendMsg(model.MsgType);
if (sendModel != null)
{
sendModel.ToUserName = model.FromUserName;
sendModel.FromUserName = model.ToUserName;
Send send = new Send();
string strSend = send.Send_Msg<Models.Send_Msg>(sendModel, ref msg);
if (!string.IsNullOrEmpty(strSend))
{
context.Response.Output.Write(strSend);
}
}
//调用消息处理方法
try
{
receiveHandler(model, ref msg);
}
catch (Exception ex)
{
msg = "receiveHandler异常:" + ex.Message;
}
return model;
}
catch (Exception ex)
{
msg = ex.Message;
return null;
}
}
/// <summary>
/// 获取消息对象直接回复空串(需要根据MsgType强制转换成需要的实体类)
/// </summary>
/// <param name="context">上下文</param>
/// <param name="getSendMsg">获取回复消息的方法</param>
/// <param name="receiveHandler">处理接收消息的方法(如:持久化数据库)</param>
/// <param name="msg">错误信息</param>
/// <returns></returns>
public Models.Receive_Msg GetReceiveMsg(HttpContext context, delegate_RececiveHandler receiveHandler, ref string msg)
{
if (context == null)
return null;
try
{
//直接回复空串,避免腾讯重复发送
context.Response.Output.Write("");
string _xml = new HttpHelper().PostInput(context.Request);
if (string.IsNullOrEmpty(_xml))
return null;
XmlDocument doc = new XmlDocument();
doc.LoadXml(_xml);
XmlElement element = doc.DocumentElement;
Models.Receive_Msg model = GetReceiveModel(element);
//调用消息处理方法
try
{
receiveHandler(model, ref msg);
}
catch (Exception ex)
{
msg = "receiveHandler异常:" + ex.Message;
}
return model;
}
catch (Exception ex)
{
msg = ex.Message;
return null;
}
}
/// <summary>
/// 解析XML,转换为实体
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
private Models.Receive_Msg GetReceiveModel(XmlElement element)
{
Models.Receive_Msg model = null;
string msgType = element.SelectSingleNode("MsgType").InnerText;
switch (msgType)
{
case MsgType.text: model = new Models.Receive_Text(); break;
case MsgType.image: model = new Models.Receive_Image(); break;
case MsgType.voice: model = new Models.Receive_Voice(); break;
case MsgType.video: model = new Models.Receive_Video(); break;
case MsgType.location: model = new Models.Receive_Location(); break;
case MsgType.link: model = new Models.Receive_Link(); break;
case MsgType.events: model = GetEventModel(element.SelectSingleNode("Event").InnerText, element.SelectSingleNode("EventKey") == null ? "" : element.SelectSingleNode("EventKey").InnerText); break;
}
try
{
foreach (System.Reflection.PropertyInfo p in model.GetType().GetProperties())
{
if (p.Name != "Xml")
{
p.SetValue(model, element.SelectSingleNode(p.Name).InnerText, null);
}
else
{
p.SetValue(model, element.OuterXml, null);
}
}
}
catch (Exception ex)
{
throw ex;
}
return model;
}
/// <summary>
/// 获取事件对象
/// </summary>
/// <param name="evt">事件类型</param>
/// <param name="eventKey">事件KEY值</param>
/// <returns></returns>
private Models.Receive_Msg GetEventModel(string evt, string eventKey)
{
Models.Receive_Msg model = null;
switch (evt)
{
case Event.subscribe:
if (string.IsNullOrEmpty(eventKey))
{
model = new Models.Receive_Event();
}
else
{
model = new Models.Receive_Event_Scan();
}
break;
case Event.unsubscribe:
model = new Models.Receive_Event();
break;
case Event.scan:
model = new Models.Receive_Event_Scan();
break;
case Event.location:
model = new Models.Receive_Event_Location();
break;
case Event.click:
model = new Models.Receive_Event_Click();
break;
case Event.view:
model = new Models.Receive_Event_View();
break;
}
return model;
}
}
发送消息代码:
/// <summary>
/// 发送微信
/// 2014-07-15
/// iftrue
/// </summary>
public class Send
{
public string Send_Msg<T>(T t, ref string msg)
{
if (t == null)
return "";
StringBuilder strB = new StringBuilder();
strB.Append("<xml>");
foreach (System.Reflection.PropertyInfo p in t.GetType().GetProperties())
{
strB.Append(string.Format("<{0}>{1}</{0}>", p.Name, p.GetValue(t, null).ToString()));
}
strB.Append("</xml>");
return strB.ToString();
}
}
初始化参数代码:
/// <summary>
/// 初始化参数
/// 2014-07-03
/// iftrue
/// </summary>
public class Init
{
/// <summary>
/// 微信公众平台-开发者中心-服务器配置 中的Token
/// </summary>
public static string Token;
/// <summary>
/// 静态构造
/// </summary>
static Init()
{
string _token = ConfigurationManager.AppSettings["weixin_token"];
if (!string.IsNullOrEmpty(_token))
Token = _token;
}
}
/// <summary>
/// 消息类型
/// </summary>
public class MsgType
{
public const string text="text";
public const string image = "image";
public const string voice = "voice";
public const string video = "video";
public const string location = "location";
public const string link = "link";
public const string events = "event";
}
/// <summary>
/// 事件类型
/// </summary>
public class Event
{
public const string subscribe = "subscribe";
public const string unsubscribe = "unsubscribe";
public const string scan = "SCAN";
public const string location = "LOCATION";
public const string click = "CLICK";
public const string view = "VIEW";
}
代码中还使用到实体类,为方便修改,使用了T4模板。
原码下载:微信公众平台接收(回复)消息C#版