本文主要是介绍04.接收用户消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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("");//身份验证请求方式:GETif (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);}
这篇关于04.接收用户消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!