04.–>接收用户消息
首先根据消息类型构建实体类:
根据微信接口地址
将相同的字段建在一个公共类里面。
在根据不同的消息添加实体类和字段。如下图:
MSGContent:
枚举类:
消息类型
///
/// 消息类型
///
public enum MsgType
{
///
///文本类型
///
TEXT,
///
/// 图片类型
///
IMAGE,
///
/// 语音类型
///
VOICE,
///
/// 视频类型
///
VIDEO,
///
/// 小视频类型
///
SHORTVIDEO,
///
/// 地理位置类型
///
LOCATION,
///
/// 链接类型
///
LINK,
///
/// 事件类型
///
EVENT
}
///
/// 事件
///
public enum EvenType
{
///
/// 关注事件
///
SUBSCRIBE,
///
/// 取消关注事件
///
UNSUBSCRIBE,
}
public class MSGContent
{
/// <summary>
/// 开发者微信号
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 发送方帐号(一个OpenID)
/// </summary>
public string FromUserName { get; set; }
/// <summary>
/// 消息创建时间 (整型)
/// </summary>
public int CreateTime { get; set; }
/// <summary>
/// 消息id,64位整型
/// </summary>
public long MsgId { get; set; }
/// <summary>
/// 类型
/// </summary>
public MsgType MsgType { get; set; }
/// <summary>
/// 事件
/// </summary>
public EvenType Event { get; set; }
}
实体类搭建好之后进行下一步操作:
根据上一讲验证微信开发者身份的基础上编写:
public ActionResult GetSignature()
{
string value = "";
//HttpContext context = new HttpContext("");
//身份验证请求方式:GET
if (HttpContext.Request.HttpMethod == "GET")
{
WeChatHelp.GetSigntrue(Token);
}
else
{
//获取接收到的消息
//var data = WeChatHelp.GetRequestData();
//var xml = XElement.Parse(data);
//var type = xml.Element("MsgType").Value;
//if (type == "text")
//{
// TextModel model = new TextModel();
// model.Content = xml.Element("Content").Value;
// model.ToUserName = xml.Element("ToUserName").Value;
// model.FromUserName = xml.Element("FromUserName").Value;
// model.CreateTime = Convert.ToInt32(xml.Element("CreateTime").Value);
// model.MsgId = Convert.ToInt64(xml.Element("MsgId").Value);
// model.MsgType = MsgType.TEXT.ToString();
//}
//考虑到消息的类型有很多种,进行封装
var msg = MSGFactory.LoadMsg();
}
return Json(value);
}
/// <summary>
/// 获取普通消息
/// </summary>
/// <returns></returns>
public static string GetRequestData()
{
string result = "";
var reader = new StreamReader(HttpContext.Current.Request.InputStream);
result = reader.ReadToEnd();
return result;
}
新建基类:MSGFactory
public class MSGFactory
{
public static MSGContent LoadMsg()
{
var data = WeChatHelp.GetRequestData();//获取接收的消息
var xml = XElement.Parse(data);//进行XML序列化
var MSGType = (MsgType)Enum.Parse(typeof(MsgType), xml.Element("MsgType").Value.ToUpper());//获取消息类型
switch (MSGType)
{
case MsgType.TEXT://文本
return WeChatHelp.ConvertObject<TextModel>(data);//根据类型返回实体数据所封装的方法
case MsgType.IMAGE://图片
return WeChatHelp.ConvertObject<ImageModel>(data);
case MsgType.VOICE://语音
return WeChatHelp.ConvertObject<VoiceModel>(data);
case MsgType.VIDEO://视频
return WeChatHelp.ConvertObject<VideoModel>(data);
case MsgType.LOCATION://地理位置
return WeChatHelp.ConvertObject<LocationModel>(data);
case MsgType.LINK://链接
return WeChatHelp.ConvertObject<LinkModel>(data);
case MsgType.SHORTVIDEO://小饰品
return WeChatHelp.ConvertObject<VideoModel>(data);
case MsgType.EVENT://事件
{
var Event = (EvenType)Enum.Parse(typeof(EvenType), xml.Element("Event").Value.ToUpper());
switch (Event)
{
case EvenType.SUBSCRIBE:
return WeChatHelp.ConvertObject<EventModel>(data);
case EvenType.UNSUBSCRIBE:
return WeChatHelp.ConvertObject<EventModel>(data);
default:
break;
}
};
return null;
default:
return WeChatHelp.ConvertObject<MSGContent>(data);
}
}
}
/// <summary>
/// 公用获取发送普通消息
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="xmldata">XML数据</param>
/// <returns></returns>
public static T ConvertObject<T>(string xmldata)
{
try
{
var xml = XElement.Parse(xmldata);
var type = typeof(T);
var t = Activator.CreateInstance<T>();
var tousername = type.GetProperty("ToUserName");
tousername.SetValue(t, Convert.ChangeType(xml.Element("ToUserName").Value, tousername.PropertyType), null);
xml.Element("ToUserName").Remove();
var FromUserName = type.GetProperty("FromUserName");
FromUserName.SetValue(t, Convert.ChangeType(xml.Element("FromUserName").Value, FromUserName.PropertyType), null);
xml.Element("FromUserName").Remove();
var CreateTime = type.GetProperty("CreateTime");
CreateTime.SetValue(t, Convert.ChangeType(xml.Element("CreateTime").Value, CreateTime.PropertyType), null);
xml.Element("CreateTime").Remove();
var MsgId = type.GetProperty("MsgId");
MsgId.SetValue(t, Convert.ChangeType(xml.Element("MsgId").Value, MsgId.PropertyType), null);
xml.Element("MsgId").Remove();
var Msg = type.GetProperty("MsgType");
var msg = xml.Element("MsgType").Value.ToUpper();
Msg.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), msg), null);
xml.Element("MsgType").Remove();
//判断是否为事件类型
if (msg == "EVENT")
{
var Event = type.GetProperty("Event");
var even = xml.Element("Event").Value.ToUpper();
Msg.SetValue(t, (EvenType)Enum.Parse(typeof(EvenType), even), null);
xml.Element("Event").Remove();
}
foreach (var item in xml.Elements())
{
var content = type.GetProperty(item.Name.ToString());
content.SetValue(t, Convert.ChangeType(item.Value, content.PropertyType), null);
}
return t;
}
catch (Exception ex)
{
throw;
}
return default(T);
}