public static bool DownloadMediaFileS(ReceiveMessageBase rmb) { if (rmb is VoiceReceiveMessage) { VoiceReceiveMessage _vrm = rmb as VoiceReceiveMessage; DownloadMediaRequest _request = new DownloadMediaRequest(); _request.AppIdInfo = new DefAppIdInfo(); _request.AccessToken = WxAccToken.AccessTokenStr; _request.MediaId = _vrm.MediaId; string fileName = AppDomain.CurrentDomain.BaseDirectory; if (!fileName.EndsWith("\\")) { fileName += "\\"; } fileName += "WxVoice\\"; _request.SaveDir = fileName; //Logger.WriteTxtLog("语音ID:" + _vrm.MediaId); IMpClient mpClient = new MpClient(); DownloadMediaResponse _response = mpClient.Execute(_request); if (_response.IsError) { return(false); } string _filename = _response.SaveFileName; _filename = _filename.Substring(_filename.LastIndexOf('\\') + 1); //Logger.WriteTxtLog("语音ID:" + _filename); SchoolData.语音记录(_filename); } return(true); }
public static void Process(HttpContext context) { string _postString = string.Empty; if (context.Request.HttpMethod.ToUpper() == "POST") { string _result = string.Empty; ReceiveMessageBase _rmb = MessageHandler.ConvertMsgToObject(WxResource.Token); if (_rmb is TextReceiveMessage) { TextReceiveMessage _trm = _rmb as TextReceiveMessage; _postString = WxFactory.WxTextFactory(_trm); if (string.IsNullOrEmpty(_postString)) { context.Response.Write("success"); return; } Logger.WriteTxtLog(_trm.ToUserName + "|" + _trm.FromUserName + "|" + _trm.Content); MessageHandler.SendTextReplyMessage(_rmb.ToUserName, _rmb.FromUserName, _postString); } else if (_rmb is VoiceReceiveMessage) //语音 { MessageHandler.DownloadMediaFileS(_rmb); } } else //获取开发者身份 { GetInterfaceRole(context); } }
public static bool DownloadMediaFileT(ReceiveMessageBase rmb) { if (rmb is VoiceReceiveMessage) { try { VoiceReceiveMessage _vrm = rmb as VoiceReceiveMessage; Logger.WriteTxtLog(_vrm.MediaId + "|" + WxAccToken.AccessTokenStr); string _url = string.Format("http://apple1302.gicp.net/WxService/FileHandler.ashx?type=voice&MediaId={0}&AccessToken={1}&FromUserName={2}", _vrm.MediaId, WxAccToken.AccessTokenStr, _vrm.FromUserName); string _val = AtWeb.Get(_url); DateTime _now = DateTime.Now; string fileName = System.AppDomain.CurrentDomain.BaseDirectory; if (!fileName.EndsWith("\\")) { fileName += "\\"; } fileName += "WxVoice\\"; string mp3 = _now.ToString("yyyyMMddHHmmss") + ".mp3"; fileName += mp3; SchoolData.语音记录(mp3); FileIO _fio = new FileIO(); _fio.OpenWriteFile(fileName); _fio.WriteLine(_val); _fio.CloseWriteFile(); } catch { } } return(true); }
/// /// 处理未定义处理方法消息 /// /// 消息对象 /// 参数(用于具体业务传递参数用) /// 是否处理成功 public bool ProcessNotHandlerMsg(ReceiveMessageBase msg, params object[] args) { LogHelper.WriteInfo("NotHandlerMsg", msg.MessageBody); //这里回应1条文本消息,也可以回应其他消息 MessageHandler.SendTextReplyMessage(msg.ToUserName, msg.FromUserName, "客户正在忙-----"); return(true); }
public bool ProcessMessage(ReceiveMessageBase msg, params object[] args) { switch (msg.MsgType) { case MsgType.Text: return(ProcessTextMessage(msg as TextReceiveMessage, args)); case MsgType.Image: return(ProcessImageMessage(msg as ImageReceiveMessage, args)); case MsgType.Link: return(ProcessLinkMessage(msg as LinkReceiveMessage, args)); case MsgType.Location: return(ProcessLocationMessage(msg as LocationReceiveMessage, args)); case MsgType.Video: return(ProcessVideoMessage(msg as VideoReceiveMessage, args)); case MsgType.Voice: return(ProcessVoiceMessage(msg as VoiceReceiveMessage, args)); case MsgType.VoiceResult: return(ProcessVoiceMessage(msg as VoiceReceiveMessage, args)); case MsgType.Event: EventMessage evtMsg = msg as EventMessage; switch (evtMsg.EventType) { case EventType.Click: return(ProcessMenuEvent(msg as MenuEventMessage, args)); case EventType.Location: return(ProcessUploadLocationEvent(msg as LocationReceiveMessage, args)); case EventType.Scan: return(ProcessScanEvent(msg as ScanEventMessage, args)); case EventType.Subscribe: return(ProcessSubscribeEvent(msg as SubscribeEventMessage, args)); case EventType.UnSubscribe: return(ProcessUnSubscribeEvent(msg as UnSubscribeEventMessage, args)); case EventType.WifiConnected: return(ProcessWifiConnectedEvent(msg as WifiConnectedEventMessage, args)); default: return(ProcessNotHandlerMsg(msg, args)); } default: return(ProcessNotHandlerMsg(msg, args)); } }
public void TextReturnMessage(ReceiveMessageBase receiveMessageBase) { IMpClient mpClient = new MpClient(); //有效性校验 var request = new AccessTokenGetRequest() { AppIdInfo = new AppIdInfo() { AppId = AppId, AppSecret = AppSecret } }; var response = mpClient.Execute(request); if (response.IsError) { HttpContext.Current.Response.Write("获取令牌环失败.."); } MpResponse send = MessageHandler.SendTextCustomMessage(response.AccessToken.AccessToken, receiveMessageBase.FromUserName, "http://wuhanallview.ticp.net"); Logger.WriteTxtLog(send.Body, "D:/Log20160802.txt"); HttpContext.Current.Response.Write(send.Body.ToString()); }
/// <summary> /// 处理消息 /// </summary> /// <param name="msg">消息对象</param> /// <param name="args">参数(用于具体业务传递参数用)</param> /// <returns>是否处理成功</returns> public bool ProcessMessage(ReceiveMessageBase msg, params object[] args) { //TextReplyMessage replyMsg = new TextReplyMessage() //{ // Content = "您好,您发送的消息类型为:" + msg.GetType().ToString(), // CreateTime = Tools.ConvertDateTimeInt(DateTime.Now), // FromUserName = msg.ToUserName, // ToUserName = msg.FromUserName //}; switch (msg.MsgType) { case MsgType.UnKnown: //return ProcessNotHandlerMsg(msg, args); case MsgType.Text: var baseMsg = msg as TextReceiveMessage; if (baseMsg.Content.StartsWith("#ly#")) { return(ProcessTextMessage(baseMsg, args)); } else if (baseMsg.Content == "weidian") { string _url = "https://open.weixin.qq.com/connect/oauth2/authorize?"; _url += "appid=" + appId; _url += "&redirect_uri=http://www.4008005216.com/WeiXin/oauth2_authorize.aspx"; _url += "&response_type=code"; _url += "&scope=snsapi_base"; _url += "&state=weidian_snsapi_base"; _url += "#wechat_redirect"; MessageHandler.SendTextReplyMessage(msg.ToUserName, msg.FromUserName, "<a href=\"" + _url + "\">进入我的微店</a>"); return(true); } else { return(NewsList(baseMsg, args)); } case MsgType.Image: //return ProcessImageMessage(msg as ImageReceiveMessage, args); case MsgType.Link: //return ProcessLinkMessage(msg as LinkReceiveMessage, args); case MsgType.Location: //return ProcessLocationMessage(msg as LocationReceiveMessage, args); case MsgType.Video: //return ProcessVideoMessage(msg as VideoReceiveMessage, args); case MsgType.Voice: //return ProcessVoiceMessage(msg as VoiceReceiveMessage, args); case MsgType.VoiceResult: //return ProcessVoiceMessage(msg as VoiceReceiveMessage, args); default: return(ProcessNotHandlerMsg(msg, args)); case MsgType.Event: EventMessage evtMsg = msg as EventMessage; switch (evtMsg.EventType) { case EventType.Click: return(ProcessMenuEvent(msg as MenuEventMessage, args)); case EventType.Location: //return ProcessUploadLocationEvent(msg as UploadLocationEventMessage, args); case EventType.Scan: //return ProcessScanEvent(msg as ScanEventMessage, args); case EventType.Subscribe: var ff = msg as ScanSubscribeEventMessage; if (ff != null) { return(ProcessScanSubscribeEvent(ff, args)); } return(ProcessSubscribeEvent(msg as SubscribeEventMessage, args)); case EventType.UnKnown: //return ProcessNotHandlerMsg(msg, args); case EventType.UnSubscribe: return(ProcessUnSubscribeEvent(msg as UnSubscribeEventMessage, args)); default: return(ProcessNotHandlerMsg(msg, args)); } } }
/// <summary> /// 处理未定义处理方法消息 /// </summary> /// <param name="msg"></param> /// <param name="args"></param> /// <returns></returns> public bool ProcessNotHandlerMsg(ReceiveMessageBase msg, params object[] args) { //这里回应1条文本消息,当然您也可以回应其他消息 //MessageHandler.SendTextReplyMessage(msg.ToUserName, msg.FromUserName, msg.MsgType.ToString() + " 类型的消息"); return(true); }
/// <summary> /// 将公众平台POST过来的数据转化成实体对象 /// </summary> /// <param name="token"></param> /// <returns></returns> public static ReceiveMessageBase ConvertMsgToObject(string token) { if (!CheckSignature(token)) { return(null); } 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); if (string.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) { case "subscribe": eventType = EventType.Subscribe; tmpNode = rootElement.SelectSingleNode("EventKey"); if (tmpNode != null) // && (!string.IsNullOrWhiteSpace(tmpNode.InnerText))) //&& tmpNode.InnerText.StartsWith("qrscene_") { //扫描二维码关注事件 ScanSubscribeEventMessage scanSubEvt = new ScanSubscribeEventMessage() { CreateTime = msg.CreateTime, EventKey = rootElement.SelectSingleNode("EventKey").InnerText, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName, Ticket = rootElement.SelectSingleNode("Ticket").InnerText }; return(scanSubEvt); } else { //普通关注事件 SubscribeEventMessage subEvt = new SubscribeEventMessage() { CreateTime = msg.CreateTime, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName }; 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; ScanEventMessage scanEvt = new ScanEventMessage() { CreateTime = msg.CreateTime, EventKey = rootElement.SelectSingleNode("EventKey").InnerText, EventType = eventType, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, Ticket = rootElement.SelectSingleNode("Ticket").InnerText, 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); 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); }
/// <summary> /// 将公众平台POST过来的数据转化成实体对象 /// </summary> /// <param name="token">用户在公众平台填写的token</param> /// <returns>消息处理的基类</returns> public static ReceiveMessageBase ConvertMsgToObject(string token) { if (!CheckSignature(token)) { return(null); } //获取传入的HTTP消息 var s = HttpContext.Current.Request.InputStream; var b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); var msgBody = Encoding.UTF8.GetString(b); if (string.IsNullOrWhiteSpace(msgBody)) { return(null); } var msgType = MsgType.UnKnown; //获取消息主体和设置消息类型枚举 var msg = new ReceiveMessageBase { MsgType = msgType, MessageBody = msgBody }; try { //读取XML字符串,返回消息为xml文档类型 var doc = new XmlDocument(); doc.LoadXml(msgBody); //获取xml根节点 var rootElement = doc.DocumentElement; if (rootElement != null) { //获取字符串中的消息类型,搜索xml消息节点信息 var msgTypeNode = rootElement.SelectSingleNode("MsgType"); var 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); } //根据获取传入的消息主体数据,判断消息类型,获取具体的消息对象 if (msgTypeNode != null) { var strMsgType = msgTypeNode.InnerText; var msgId = string.Empty; var content = string.Empty; var 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(); } var 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 = null; var selectSingleNode = rootElement.SelectSingleNode("MediaId"); if (selectSingleNode != null) { var singleNode = rootElement.SelectSingleNode("PicUrl"); if (singleNode != null) { imgMsg = new ImageReceiveMessage() { CreateTime = msg.CreateTime, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgId = Convert.ToInt64(msgId), MsgType = msgType, ToUserName = msg.ToUserName, MediaId = selectSingleNode.InnerText, PicUrl = singleNode.InnerText } } ; } return(imgMsg); case "voice": msgType = MsgType.Voice; VoiceReceiveMessage voiceMsg = null; var node1 = rootElement.SelectSingleNode("Recognition"); if (node1 != null) { msgType = MsgType.VoiceResult; } var xmlNode = rootElement.SelectSingleNode("Format"); if (xmlNode != null) { var selectSingleNode1 = rootElement.SelectSingleNode("MediaId"); if (selectSingleNode1 != null) { voiceMsg = new VoiceReceiveMessage() { CreateTime = msg.CreateTime, FromUserName = msg.FromUserName, ToUserName = msg.ToUserName, MessageBody = msg.MessageBody, MsgId = Convert.ToInt64(msgId), MsgType = msgType, Recognition = node1?.InnerText.Trim() ?? string.Empty, Format = xmlNode.InnerText, MediaId = selectSingleNode1.InnerText } } ; } return(voiceMsg); case "video": msgType = MsgType.Video; VideoReceiveMessage videoMsg = null; var singleNode1 = rootElement.SelectSingleNode("MediaId"); if (singleNode1 != null) { var singleNode = rootElement.SelectSingleNode("ThumbMediaId"); if (singleNode != null) { videoMsg = new VideoReceiveMessage() { CreateTime = msg.CreateTime, FromUserName = msg.FromUserName, MediaId = singleNode1.InnerText, MessageBody = msg.MessageBody, MsgId = Convert.ToInt64(msgId), MsgType = msgType, ToUserName = msg.ToUserName, ThumbMediaId = singleNode.InnerText }; } } return(videoMsg); case "location": msgType = MsgType.Location; LocationReceiveMessage locationMsg = null; var xmlNode1 = rootElement.SelectSingleNode("Label"); if (xmlNode1 != null) { var selectSingleNode2 = rootElement.SelectSingleNode("Location_X"); if (selectSingleNode2 == null) { return(null); } var singleNode = rootElement.SelectSingleNode("Location_Y "); if (singleNode == null) { return(null); } var selectSingleNode1 = rootElement.SelectSingleNode("Scale"); if (selectSingleNode1 != null) { locationMsg = new LocationReceiveMessage() { CreateTime = msg.CreateTime, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgId = Convert.ToInt64(msgId), MsgType = msgType, ToUserName = msg.ToUserName, Label = xmlNode1.InnerText, LocationX = selectSingleNode2.InnerText, LocationY = singleNode.InnerText, Scale = selectSingleNode1.InnerText } } ; } return(locationMsg); case "link": msgType = MsgType.Link; LinkReceiveMessage linkMsg = null; var singleNode2 = rootElement.SelectSingleNode("Description"); if (singleNode2 != null) { var xmlNode2 = rootElement.SelectSingleNode("Title"); if (xmlNode2 == null) { return((LinkReceiveMessage)null); } var singleNode = rootElement.SelectSingleNode("Url "); if (singleNode != null) { linkMsg = new LinkReceiveMessage() { CreateTime = msg.CreateTime, Description = singleNode2.InnerText, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgId = Convert.ToInt64(msgId), MsgType = msgType, Title = xmlNode2.InnerText, ToUserName = msg.ToUserName, Url = singleNode.InnerText } } ; } return(linkMsg); case "event": msgType = MsgType.Event; msg.MsgType = msgType; ScanSubscribeEventMessage scanSubEvt = null; var eventNode = rootElement.SelectSingleNode("Event"); if (eventNode != null) { EventType eventType; switch (eventNode.InnerText) { case "subscribe": tmpNode = rootElement.SelectSingleNode("EventKey"); if (tmpNode != null) // && (!string.IsNullOrWhiteSpace(tmpNode.InnerText))) //&& tmpNode.InnerText.StartsWith("qrscene_") { //扫描二维码关注事件 var singleNode = rootElement.SelectSingleNode("EventKey"); if (singleNode == null) { return(null); } var selectSingleNode1 = rootElement.SelectSingleNode("Ticket"); if (selectSingleNode1 != null) { scanSubEvt = new ScanSubscribeEventMessage() { CreateTime = msg.CreateTime, EventKey = singleNode.InnerText, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName, Ticket = selectSingleNode1.InnerText } } ; return(scanSubEvt); } else { //普通关注事件 var subEvt = new SubscribeEventMessage() { CreateTime = msg.CreateTime, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName }; return(subEvt); } case "unsubscribe": eventType = EventType.UnSubscribe; var 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; ScanEventMessage scanEvt = null; var selectSingleNode2 = rootElement.SelectSingleNode("EventKey"); if (selectSingleNode2 != null) { var xmlNode2 = rootElement.SelectSingleNode("Ticket"); if (xmlNode2 != null) { scanEvt = new ScanEventMessage() { CreateTime = msg.CreateTime, EventKey = selectSingleNode2.InnerText, EventType = eventType, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, Ticket = xmlNode2.InnerText, ToUserName = msg.ToUserName } } ; } return(scanEvt); case "LOCATION": eventType = EventType.Location; UploadLocationEventMessage locationEvt = null; var node2 = rootElement.SelectSingleNode("Latitude"); if (node2 != null) { var selectSingleNode3 = rootElement.SelectSingleNode("Longitude"); if (selectSingleNode3 == null) { return(null); } var singleNode = rootElement.SelectSingleNode("Precision"); if (singleNode != null) { locationEvt = new UploadLocationEventMessage() { CreateTime = msg.CreateTime, EventType = eventType, FromUserName = msg.FromUserName, Latitude = node2.InnerText, Longitude = selectSingleNode3.InnerText, MessageBody = msg.MessageBody, MsgType = msgType, Precision = singleNode.InnerText, ToUserName = msg.ToUserName } } ; } return(locationEvt); case "CLICK": eventType = EventType.Click; MenuEventMessage menuEvt = null; var singleNode3 = rootElement.SelectSingleNode("EventKey"); if (singleNode3 != null) { menuEvt = new MenuEventMessage() { CreateTime = msg.CreateTime, EventKey = singleNode3.InnerText, EventType = eventType, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName } } ; return(menuEvt); default: var 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; } finally { msg.MsgType = msgType; } return(msg); }
/// <summary> /// 将公众平台POST过来的数据转化成实体对象 /// </summary> /// <param name="token"></param> /// <returns></returns> public static ReceiveMessageBase ConvertMsgToObject(string token) { if (!CheckSignature(token)) { return null; } 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); if (string.IsNullOrEmpty(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) { case "subscribe": eventType = EventType.Subscribe; tmpNode = rootElement.SelectSingleNode("EventKey"); var tmp = rootElement.SelectSingleNode("Ticket"); if (tmpNode != null && !string.IsNullOrEmpty(tmpNode.InnerText)) //&& tmpNode.InnerText.StartsWith("qrscene_") { //扫描二维码关注事件 ScanSubscribeEventMessage scanSubEvt = new ScanSubscribeEventMessage() { CreateTime = msg.CreateTime, EventKey = rootElement.SelectSingleNode("EventKey").InnerText, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName, Ticket = rootElement.SelectSingleNode("Ticket").InnerText }; return scanSubEvt; } else { //普通关注事件 SubscribeEventMessage subEvt = new SubscribeEventMessage() { CreateTime = msg.CreateTime, EventType = EventType.Subscribe, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, ToUserName = msg.ToUserName }; 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; ScanEventMessage scanEvt = new ScanEventMessage() { CreateTime = msg.CreateTime, EventKey = rootElement.SelectSingleNode("EventKey").InnerText, EventType = eventType, FromUserName = msg.FromUserName, MessageBody = msg.MessageBody, MsgType = msgType, Ticket = rootElement.SelectSingleNode("Ticket").InnerText, 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; 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; }
/// <summary> /// 处理未定义处理方法消息 /// </summary> /// <param name="msg"></param> /// <param name="args"></param> /// <returns></returns> public bool ProcessNotHandlerMsg(ReceiveMessageBase msg, params object[] args) { //这里回应1条文本消息,当然您也可以回应其他消息 //MessageHandler.SendTextReplyMessage(msg.ToUserName, msg.FromUserName, msg.MsgType.ToString() + " 类型的消息"); return true; }
/// <summary> /// 处理消息 /// </summary> /// <param name="msg">消息对象</param> /// <param name="args">参数(用于具体业务传递参数用)</param> /// <returns>是否处理成功</returns> public bool ProcessMessage(ReceiveMessageBase msg, params object[] args) { //TextReplyMessage replyMsg = new TextReplyMessage() //{ // Content = "您好,您发送的消息类型为:" + msg.GetType().ToString(), // CreateTime = Tools.ConvertDateTimeInt(DateTime.Now), // FromUserName = msg.ToUserName, // ToUserName = msg.FromUserName //}; switch (msg.MsgType) { case MsgType.UnKnown: //return ProcessNotHandlerMsg(msg, args); case MsgType.Text: var baseMsg = msg as TextReceiveMessage; if (baseMsg.Content.StartsWith("#ly#")) { return ProcessTextMessage(baseMsg, args); } else if (baseMsg.Content == "weidian") { string _url = "https://open.weixin.qq.com/connect/oauth2/authorize?"; _url += "appid=" + appId; _url += "&redirect_uri=http://www.4008005216.com/WeiXin/oauth2_authorize.aspx"; _url += "&response_type=code"; _url += "&scope=snsapi_base"; _url += "&state=weidian_snsapi_base"; _url += "#wechat_redirect"; MessageHandler.SendTextReplyMessage(msg.ToUserName, msg.FromUserName, "<a href=\"" + _url + "\">进入我的微店</a>"); return true; } else { return NewsList(baseMsg, args); } case MsgType.Image: //return ProcessImageMessage(msg as ImageReceiveMessage, args); case MsgType.Link: //return ProcessLinkMessage(msg as LinkReceiveMessage, args); case MsgType.Location: //return ProcessLocationMessage(msg as LocationReceiveMessage, args); case MsgType.Video: //return ProcessVideoMessage(msg as VideoReceiveMessage, args); case MsgType.Voice: //return ProcessVoiceMessage(msg as VoiceReceiveMessage, args); case MsgType.VoiceResult: //return ProcessVoiceMessage(msg as VoiceReceiveMessage, args); default: return ProcessNotHandlerMsg(msg, args); case MsgType.Event: EventMessage evtMsg = msg as EventMessage; switch (evtMsg.EventType) { case EventType.Click: return ProcessMenuEvent(msg as MenuEventMessage, args); case EventType.Location: //return ProcessUploadLocationEvent(msg as UploadLocationEventMessage, args); case EventType.Scan: //return ProcessScanEvent(msg as ScanEventMessage, args); case EventType.Subscribe: var ff = msg as ScanSubscribeEventMessage; if (ff != null) return ProcessScanSubscribeEvent(ff, args); return ProcessSubscribeEvent(msg as SubscribeEventMessage, args); case EventType.UnKnown: //return ProcessNotHandlerMsg(msg, args); case EventType.UnSubscribe: return ProcessUnSubscribeEvent(msg as UnSubscribeEventMessage, args); default: return ProcessNotHandlerMsg(msg, args); } } }
/// <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); } }