/// <summary> /// 加载消息,并绑定各消息类型的处理程序 /// </summary> /// <param name="mheList">消息处理程序列表</param> public static void LoadMsg(EnterParam param, List <MsgHandlerEntity> mheList, Action <BaseMsg> baseCallBack = null) { //判断队列是否为空,为空则实例化。 if (_queue == null) { _queue = new List <BMsg>(); } else { //保留20秒内未响应的消息 _queue = _queue.Where(q => q.CreateTime.AddSeconds(20) > DateTime.Now).ToList(); } //获取数据包 var postStr = Utils.GetRequestData(param); Utils.WriteTxt("/debug.txt", postStr); XElement xdoc = XElement.Parse(postStr); var msgtype = xdoc.Element("MsgType").Value.ToUpper(); var FromUserName = xdoc.Element("FromUserName").Value; var CreateTime = xdoc.Element("CreateTime").Value; //获取消息类型 MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype); //如果不是是事件类型 if (type != MsgType.EVENT) { var MsgId = xdoc.Element("MsgId").Value; //判断队列中是否已经存在此消息,如果不存在,则将此消息加入队列中,否则返回null if (_queue.FirstOrDefault(m => m.MsgFlag == MsgId) == null) { _queue.Add(new BMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = MsgId }); } else { return; } } else { //判断队列中是否已经存在此消息,如果不存在,则将此消息加入队列中,否则返回null if (_queue.FirstOrDefault(m => m.MsgFlag == CreateTime && m.FromUser == FromUserName) == null) { _queue.Add(new BMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = CreateTime }); } else { return; } } //消息实体对象。 BaseMsg msg = null; //事件类型。默认为NOEVENT,即非事件类型 EventType eventtype = EventType.NOEVENT; switch (type) { //获取文本消息实体 case MsgType.TEXT: msg = Utils.ConvertObj <TextMsg>(postStr); break; //获取图片消息实体 case MsgType.IMAGE: msg = Utils.ConvertObj <ImgMsg>(postStr); break; //获取视频消息实体 case MsgType.VIDEO: msg = Utils.ConvertObj <VideoMsg>(postStr); break; //获取音频消息实体 case MsgType.VOICE: msg = Utils.ConvertObj <VoiceMsg>(postStr); break; //获取链接消息实体 case MsgType.LINK: msg = Utils.ConvertObj <LinkMsg>(postStr); break; //获取地理位置消息实体 case MsgType.LOCATION: msg = Utils.ConvertObj <LocationMsg>(postStr); break; //获取事件消息实体 case MsgType.EVENT: //事件类型 { eventtype = (EventType)Enum.Parse(typeof(EventType), xdoc.Element("Event").Value.ToUpper()); switch (eventtype) { //取消订阅事件 case EventType.UNSUBSCRIBE: //订阅事件 case EventType.SUBSCRIBE: msg = Utils.ConvertObj <SubEventMsg>(postStr); break; //上报地理位置事件 case EventType.LOCATION: msg = Utils.ConvertObj <LocationEventMsg>(postStr); break; //群发消息完成后,推送的数据包 case EventType.MASSSENDJOBFINISH: msg = Utils.ConvertObj <GroupJobEventMsg>(postStr); break; //模板消息发送成功后,推送的数据包 case EventType.TEMPLATESENDJOBFINISH: msg = Utils.ConvertObj <TemplateJobEventMsg>(postStr); break; case EventType.SCAN: //扫描带参数二维码事件 msg = Utils.ConvertObj <ScanQrEventMsg>(postStr); break; case EventType.CLICK: case EventType.VIEW: msg = Utils.ConvertObj <BaseMenuEventMsg>(postStr); break; //自定义菜单发送图片 case EventType.PIC_PHOTO_OR_ALBUM: case EventType.PIC_SYSPHOTO: case EventType.PIC_WEIXIN: msg = Utils.ConvertObj <PicMenuEventMsg>(postStr); break; //自定义菜单扫描二维码 case EventType.SCANCODE_PUSH: case EventType.SCANCODE_WAITMSG: msg = Utils.ConvertObj <ScanMenuEventMsg>(postStr); break; //客服会话控制 case EventType.KF_CLOSE_SESSION: case EventType.KF_CREATE_SESSION: case EventType.KF_SWITCH_SESSION: msg = Utils.ConvertObj <KfEventMsg>(postStr); break; //微信小店订单 case EventType.MERCHANT_ORDER: msg = Utils.ConvertObj <OrderEventMsg>(postStr); break; case EventType.POI_CHECK_NOTIFY: //门店审核结果通知 msg = Utils.ConvertObj <PoiNotifyEventMsg>(postStr); break; case EventType.CARD_NOT_PASS_CHECK: //卡券审核事件 case EventType.CARD_PASS_CHECK: msg = Utils.ConvertObj <CardCheckEventMsg>(postStr); break; case EventType.USER_GET_CARD: //领取卡券 msg = Utils.ConvertObj <GetCardEventMsg>(postStr); break; default: msg = Utils.ConvertObj <EventMsg>(postStr); break; } } break; default: msg = Utils.ConvertObj <BaseMsg>(postStr); break; } //执行基础回调 if (baseCallBack != null) { baseCallBack(msg); } //根据根据消息类型,获取回调程序 var ac = GetAction(mheList, type, eventtype); //如果回调程序存在,并且消息实体转换成功,则执行回调程序。 if (ac != null && msg != null) { ac(msg); } }