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("");
            //身份验证请求方式: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);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值