Exemple #1
0
 ///
 /// 处理连网后下发消息
 ///
 public bool ProcessWifiConnectedEvent(WifiConnectedEventMessage msg, params object[] args)
 {
     return(true);
 }
        /// <summary>
        /// 将公众平台POST过来的数据转化成实体对象
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static ReceiveMessageBase ConvertMsgToObject(string token)
        {
            //if (!CheckSignature(token))
            //{
            //    return null;
            //}
            try
            {
                string msgBody = string.Empty;
                Stream s       = System.Web.HttpContext.Current.Request.InputStream;
                byte[] b       = new byte[s.Length];
                s.Read(b, 0, (int)s.Length);
                msgBody = Encoding.UTF8.GetString(b);
                //Utility.LogHelper.WriteDebug("Foresight.Winxin_消息内容", msgBody);
                if (WebUtils.IsNullOrWhiteSpace(msgBody))
                {
                    return(null);
                }
                XmlDocument        doc       = null;
                MsgType            msgType   = MsgType.UnKnown;
                EventType          eventType = EventType.UnKnown;
                ReceiveMessageBase msg       = new ReceiveMessageBase();
                msg.MsgType     = msgType;
                msg.MessageBody = msgBody;
                XmlNode node    = null;
                XmlNode tmpNode = null;
                try
                {
                    doc = new XmlDocument();
                    doc.LoadXml(msgBody);                                             //读取XML字符串
                    XmlElement rootElement = doc.DocumentElement;
                    XmlNode    msgTypeNode = rootElement.SelectSingleNode("MsgType"); //获取字符串中的消息类型
                    node = rootElement.SelectSingleNode("FromUserName");
                    if (node != null)
                    {
                        msg.FromUserName = node.InnerText;
                    }
                    node = rootElement.SelectSingleNode("ToUserName");
                    if (node != null)
                    {
                        msg.ToUserName = node.InnerText;
                    }
                    node = rootElement.SelectSingleNode("CreateTime");
                    if (node != null)
                    {
                        msg.CreateTime = Convert.ToInt64(node.InnerText);
                    }
                    #region 获取具体的消息对象
                    string strMsgType = msgTypeNode.InnerText;
                    string msgId      = string.Empty;
                    string content    = string.Empty;
                    tmpNode = rootElement.SelectSingleNode("MsgId");
                    if (tmpNode != null)
                    {
                        msgId = tmpNode.InnerText.Trim();
                    }
                    switch (strMsgType)
                    {
                    case "text":
                        msgType = MsgType.Text;

                        tmpNode = rootElement.SelectSingleNode("Content");
                        if (tmpNode != null)
                        {
                            content = tmpNode.InnerText.Trim();
                        }
                        TextReceiveMessage txtMsg = new TextReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            FromUserName = msg.FromUserName,
                            MessageBody  = msg.MessageBody,
                            MsgType      = msgType,
                            ToUserName   = msg.ToUserName,
                            MsgId        = Convert.ToInt64(msgId),
                            Content      = content
                        };

                        return(txtMsg);

                    case "image":
                        msgType = MsgType.Image;

                        ImageReceiveMessage imgMsg = new ImageReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            FromUserName = msg.FromUserName,
                            MessageBody  = msg.MessageBody,
                            MsgId        = Convert.ToInt64(msgId),
                            MsgType      = msgType,
                            ToUserName   = msg.ToUserName,
                            MediaId      = rootElement.SelectSingleNode("MediaId").InnerText,
                            PicUrl       = rootElement.SelectSingleNode("PicUrl").InnerText
                        };

                        return(imgMsg);

                    case "voice":
                        msgType = MsgType.Voice;
                        XmlNode node1 = rootElement.SelectSingleNode("Recognition");
                        if (node1 != null)
                        {
                            msgType = MsgType.VoiceResult;
                        }

                        VoiceReceiveMessage voiceMsg = new VoiceReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            FromUserName = msg.FromUserName,
                            ToUserName   = msg.ToUserName,
                            MessageBody  = msg.MessageBody,
                            MsgId        = Convert.ToInt64(msgId),
                            MsgType      = msgType,
                            Recognition  = node1 == null ? string.Empty : node1.InnerText.Trim(),
                            Format       = rootElement.SelectSingleNode("Format").InnerText,
                            MediaId      = rootElement.SelectSingleNode("MediaId").InnerText
                        };

                        return(voiceMsg);

                    case "video":
                        msgType = MsgType.Video;

                        VideoReceiveMessage videoMsg = new VideoReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            FromUserName = msg.FromUserName,
                            MediaId      = rootElement.SelectSingleNode("MediaId").InnerText,
                            MessageBody  = msg.MessageBody,
                            MsgId        = Convert.ToInt64(msgId),
                            MsgType      = msgType,
                            ToUserName   = msg.ToUserName,
                            ThumbMediaId = rootElement.SelectSingleNode("ThumbMediaId").InnerText
                        };

                        return(videoMsg);

                    case "location":
                        msgType = MsgType.Location;

                        LocationReceiveMessage locationMsg = new LocationReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            FromUserName = msg.FromUserName,
                            MessageBody  = msg.MessageBody,
                            MsgId        = Convert.ToInt64(msgId),
                            MsgType      = msgType,
                            ToUserName   = msg.ToUserName,
                            Label        = rootElement.SelectSingleNode("Label").InnerText,
                            Location_X   = rootElement.SelectSingleNode("Location_X").InnerText,
                            Location_Y   = rootElement.SelectSingleNode("Location_Y ").InnerText,
                            Scale        = rootElement.SelectSingleNode("Scale").InnerText
                        };

                        return(locationMsg);

                    case "link":
                        msgType = MsgType.Link;

                        LinkReceiveMessage linkMsg = new LinkReceiveMessage()
                        {
                            CreateTime   = msg.CreateTime,
                            Description  = rootElement.SelectSingleNode("Description").InnerText,
                            FromUserName = msg.FromUserName,
                            MessageBody  = msg.MessageBody,
                            MsgId        = Convert.ToInt64(msgId),
                            MsgType      = msgType,
                            Title        = rootElement.SelectSingleNode("Title").InnerText,
                            ToUserName   = msg.ToUserName,
                            Url          = rootElement.SelectSingleNode("Url ").InnerText
                        };

                        return(linkMsg);

                    case "event":
                        msgType     = MsgType.Event;
                        eventType   = EventType.UnKnown;
                        msg.MsgType = msgType;

                        XmlNode eventNode = rootElement.SelectSingleNode("Event");
                        if (eventNode != null)
                        {
                            switch (eventNode.InnerText.ToLower())
                            {
                            case "subscribe":
                            {
                                eventType = EventType.Subscribe;
                                var node_EventKey = rootElement.SelectSingleNode("EventKey");
                                var node_Ticket   = rootElement.SelectSingleNode("Ticket");
                                //普通关注事件
                                SubscribeEventMessage subEvt = new SubscribeEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventType    = EventType.Subscribe,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    ToUserName   = msg.ToUserName,
                                    EventKey     = (node_EventKey != null && !string.IsNullOrEmpty(node_EventKey.InnerText) && node_EventKey.InnerText.StartsWith("qrscene_")) ? node_EventKey.InnerText : null,
                                    Ticket       = (node_Ticket != null && !string.IsNullOrEmpty(node_Ticket.InnerText) && node_Ticket.InnerText.StartsWith("qrscene_")) ? node_Ticket.InnerText : null,
                                };
                                return(subEvt);
                            }

                            case "unsubscribe":
                            {
                                eventType = EventType.UnSubscribe;

                                UnSubscribeEventMessage unSubEvt = new UnSubscribeEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventType    = eventType,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    ToUserName   = msg.ToUserName
                                };

                                return(unSubEvt);
                            }

                            case "scan":
                            {
                                eventType = EventType.Scan;
                                var node_Ticket = rootElement.SelectSingleNode("Ticket");

                                ScanEventMessage scanEvt = new ScanEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventKey     = rootElement.SelectSingleNode("EventKey").InnerText,
                                    EventType    = eventType,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    Ticket       = (node_Ticket != null && !string.IsNullOrEmpty(node_Ticket.InnerText) && node_Ticket.InnerText.StartsWith("qrscene_")) ? node_Ticket.InnerText : null,
                                    ToUserName   = msg.ToUserName
                                };
                                return(scanEvt);
                            }

                            case "location":
                            {
                                eventType = EventType.Location;

                                UploadLocationEventMessage locationEvt = new UploadLocationEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventType    = eventType,
                                    FromUserName = msg.FromUserName,
                                    Latitude     = rootElement.SelectSingleNode("Latitude").InnerText,
                                    Longitude    = rootElement.SelectSingleNode("Longitude").InnerText,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    Precision    = rootElement.SelectSingleNode("Precision").InnerText,
                                    ToUserName   = msg.ToUserName
                                };

                                return(locationEvt);
                            }

                            case "click":
                            {
                                eventType = EventType.Click;

                                MenuEventMessage menuEvt = new MenuEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventKey     = rootElement.SelectSingleNode("EventKey").InnerText,
                                    EventType    = eventType,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    ToUserName   = msg.ToUserName
                                };

                                return(menuEvt);
                            }

                            case "wificonnected":
                            {
                                eventType = EventType.WifiConnected;

                                WifiConnectedEventMessage menuEvt = new WifiConnectedEventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventType    = eventType,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = msgType,
                                    ToUserName   = msg.ToUserName,
                                    ConnectTime  = Convert.ToInt32(rootElement.SelectSingleNode("ConnectTime").InnerText),
                                    ExpireTime   = Convert.ToInt32(rootElement.SelectSingleNode("ExpireTime").InnerText),
                                    VendorId     = rootElement.SelectSingleNode("VendorId").InnerText,
                                    ShopId       = rootElement.SelectSingleNode("ShopId").InnerText,
                                    DeviceNo     = rootElement.SelectSingleNode("DeviceNo").InnerText,
                                };

                                return(menuEvt);
                            }

                            default:
                            {
                                EventMessage evtMsg = new EventMessage()
                                {
                                    CreateTime   = msg.CreateTime,
                                    EventType    = EventType.UnKnown,
                                    FromUserName = msg.FromUserName,
                                    MessageBody  = msg.MessageBody,
                                    MsgType      = MsgType.Event,
                                    ToUserName   = msg.ToUserName
                                };
                                return(evtMsg);
                            }
                            }
                        }

                        break;
                    }
                    msg.MsgType = msgType;
                    #endregion
                }
                finally
                {
                    if (doc != null)
                    {
                        doc = null;
                    }
                }
                msg.MsgType = msgType;
                return(msg);
            }
            catch (Exception ex)
            {
                Utility.LogHelper.WriteError("Foresight.Winxin", "转化消息出错", ex);
                return(null);
            }
        }