public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null) { RequestMessageBase requestMessageBase = null; try { RequestMsgType requestMsgType = MsgTypeHelper.GetRequestMsgType(doc); switch (requestMsgType) { case RequestMsgType.Text: requestMessageBase = new RequestMessageText(); break; default: throw new UnknownRequestMsgTypeException($"MsgType:{requestMsgType} 在RequestMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException()); case RequestMsgType.Event: break; } requestMessageBase.FillEntityWithXml(doc); } catch (ArgumentException inner) { throw new WeixinException($"RequestMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", inner); } return(requestMessageBase); }
public ActionResult Test() { string sMsg = @"<xml><ToUserName><![CDATA[wx42c6025ff9bb2576]]></ToUserName> <FromUserName><![CDATA[15021311065]]></FromUserName> <CreateTime>1478775431</CreateTime> <MsgType><![CDATA[event]]></MsgType> <AgentID>0</AgentID> <Event><![CDATA[unsubscribe]]></Event> <EventKey><![CDATA[]]></EventKey> </xml>"; XDocument doc = XmlHelper.LoadXML(sMsg); LogService.Fatal("msgType: " + JsonHelper.SerializeObject(doc)); RequestMsgType msgType = MsgTypeHelper.GetRequestMsgType(doc); switch (msgType) { case RequestMsgType.Event: RequestEventMessage message = (RequestEventMessage)XmlHelper.Deserialize <RequestEventMessage>(sMsg); //成员关注、取消关注企业号的事件 if (message.Event == "subscribe" || message.Event == "unsubscribe") { var userId = message.FromUserName; //关注状态: 1=已关注,2=已冻结,4=未关注 int status = message.Event == "subscribe" ? 1 : 4; int rows = EmployeeService.UpdateEmpStatus(userId, (byte)status); LogService.Fatal("修改结果: " + rows); } break; } return(Content(sMsg)); }
/// <summary> /// 解析服务器接收到的微信服务器推送过来的消息。 /// </summary> /// <param name="message">服务器接收到的请求消息。</param> /// <returns>接收请求消息对象。</returns> public static IRequestMessage Parse(string message) { #region 参数校验 if (string.IsNullOrEmpty(message)) { throw new StringNullOrEmptyException(nameof(message)); } #endregion #region 获取消息类型 dynamic xmlMsgObj = new DynamicXml(message); string msgTypeText = xmlMsgObj.MsgType.Value; RequestMsgType msgType = EnumExtension.GetEnumItemByDescription <RequestMsgType>(msgTypeText); #endregion //如果不是 事件推送 则, if (msgType != RequestMsgType.Event) { return(GetRequestMessageByMsgType(msgType, message)); } else { string eventTypeText = xmlMsgObj.Event.Value; RequestMsgEventType eventType = EnumExtension.GetEnumItemByDescription <RequestMsgEventType>(eventTypeText); return(GetRequestEventMessageByEventType(eventType, message)); } }
/// <summary> /// 初始化消息 /// </summary> /// <param name="msgType">消息类型</param> /// <param name="doc">XML消息</param> public RequestMsgBase(RequestMsgType msgType, XDocument doc) { MsgType = msgType; ToUserName = doc.Root.Element("ToUserName").Value; FromUserName = doc.Root.Element("FromUserName").Value; CreateTime = DateTimeHelper.GetDateTimeFromXml(doc.Root.Element("CreateTime").Value); }
public override RequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { RequestMessageBase requestMessage; switch (requestMsgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); //借用MP的对象,也可以在单元测试中新建类 break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "SUBSCRIBE": //订阅(关注) requestMessage = new RequestMessageEvent_Subscribe(); break; default: requestMessage = new RequestMessageUnknownType(); break; } break; default: throw new Exception("未定义此类型:" + requestMsgType); } return(requestMessage); }
/// <summary> /// 获取请求消息和实体之间的映射结果 /// </summary> /// <param name="requestMsgType"></param> /// <returns></returns> public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { RequestMessageBase requestMessage; switch (requestMsgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.MiniProgramPage: //小程序页面 requestMessage = new RequestMessageMiniProgramPage(); break; case RequestMsgType.NeuChar: requestMessage = new RequestMessageNeuChar(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "USER_ENTER_TEMPSESSION": //进入客服会话 requestMessage = new RequestMessageEvent_UserEnterTempSession(); break; case "WEAPP_AUDIT_SUCCESS": //小程序审核成功 requestMessage = new RequestMessageEvent_WeAppAuditSuccess(); break; case "WEAPP_AUDIT_FAIL": //小程序审核失败 requestMessage = new RequestMessageEvent_WeAppAuditFail(); break; case "WEAPP_AUDIT_DELAY": //小程序审核延后 requestMessage = new RequestMessageEvent_WeAppAuditDelay(); break; case "WXA_NICKNAME_AUDIT": //名称审核结果 requestMessage = new RequestMessageEvent_NicknameAudit(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException()); //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } return(requestMessage); }
/// <summary> /// 微信回调消息处理 /// </summary> /// <param name="doc"></param> /// <returns></returns> public static string CommandWXCallback(XDocument doc, PostModel postModel) { if (doc == null) return "success"; RequestMessageBase requestMessage = new RequestMessageBase(); try { if (doc.Root.Element("MsgType") == null && doc.Root.Element("InfoType") == null) { return "success"; } RequestMsgType msgType = RequestMsgType.EVENT; if (doc.Root.Element("MsgType") != null) { msgType = (RequestMsgType)System.Enum.Parse(typeof(RequestMsgType), doc.Root.Element("MsgType").Value.ToUpper()); } switch (msgType) { case RequestMsgType.TEXT: RequestMessageText requestMessageTest = EntityHelper.FillEntityWithXml(new RequestMessageText(), doc); return OnTextRequest(requestMessageTest, postModel); case RequestMsgType.EVENT: if (doc.Root.Element("InfoType") == null) break; RequestInfoType infoType = (RequestInfoType)System.Enum.Parse(typeof(RequestInfoType), doc.Root.Element("InfoType").Value, true); switch (infoType) { case RequestInfoType.component_verify_ticket: RequestMessageComponentVerifyTicket tempModel = EntityHelper.FillEntityWithXml(new RequestMessageComponentVerifyTicket(), doc); OpenPlatConfigBLL.SingleModel.ComponentVerifyTicket(tempModel.AppId, tempModel.ComponentVerifyTicket, tempModel.CreateTime); break; case RequestInfoType.unauthorized: break; case RequestInfoType.weapp_audit_success: case RequestInfoType.weapp_audit_fail: //小程序代码审核成功回调 CommandXCXPublish(infoType.ToString(), doc); break; default: break; } break; } } catch (Exception ex) { log4net.LogHelper.WriteError(typeof(WXRequestCommandBLL), ex); } return "success"; }
public override RequestMessageNeuChar GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { if (requestMsgType != RequestMsgType.NeuChar) { throw new MessageHandlerException("仅支持 NeuChar 类型请求"); } var requestMessage = new RequestMessageNeuChar(); return(requestMessage); }
private bool NewWXHandler(HttpRequest Request, out XDocument wxDocumentTarget) { NameValueCollection param = new NameValueCollection { Request.Form, Request.QueryString }; bool result = false; wxDocumentTarget = null; try { wxDocumentTarget = Senparc.Weixin.MP.RequestMessageFactory.GetRequestEntityDocument(Request.InputStream); RequestMessageBase requestMessageBase = null; RequestMsgType requestMsgType = Senparc.Weixin.MP.Helpers.MsgTypeHelper.GetRequestMsgType(wxDocumentTarget); RequestMsgType requestMsgType2 = requestMsgType; if (requestMsgType2 == RequestMsgType.Event) { string a = wxDocumentTarget.Root.Element("Event").Value.ToUpper(); if (a == "POI_CHECK_NOTIFY") { requestMessageBase = new RequestMessageEvent_Poi_Check_Notify(); result = true; } } requestMessageBase.FillEntityWithXml(wxDocumentTarget); if (requestMessageBase != null) { IDictionary <string, string> dictionary = new Dictionary <string, string>(); dictionary.Add("msgType", requestMsgType.ToNullString()); dictionary.Add("wxDocumentTarget", wxDocumentTarget.ToNullString()); dictionary.Add("MsgId", requestMessageBase.MsgId.ToNullString()); dictionary.Add("MsgType", requestMessageBase.MsgType.ToNullString()); dictionary.Add("FromUserName", requestMessageBase.FromUserName.ToNullString()); dictionary.Add("ToUserName", requestMessageBase.ToUserName.ToNullString()); Globals.AppendLog(dictionary, "微信菜单点击", "", "", "NewWXHandler"); } RequestMsgType requestMsgType3 = requestMsgType; if (requestMsgType3 == RequestMsgType.Event) { string a2 = wxDocumentTarget.Root.Element("Event").Value.ToUpper(); if (a2 == "POI_CHECK_NOTIFY") { StoresHelper.UpdateStoreFromWX(requestMessageBase); } } } catch (ArgumentException ex) { Globals.WriteExceptionLog_Page(ex, param, "WXAPI"); } return(result); }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString()); return(Content(responseMessageXml)); } }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType, bool testConcurrence, int testConcurrenceCount) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString()); if (string.IsNullOrEmpty(responseMessageXml)) { responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。"; } try { DateTime dt1 = DateTime.Now; if (testConcurrence) { testConcurrenceCount = testConcurrenceCount > 30 ? 30 : testConcurrenceCount;//设定最高限额 //模拟并发请求 List <Task <string> > taskList = new List <Task <string> >(); for (int i = 0; i < testConcurrenceCount; i++) { var task = Task.Factory.StartNew(() => TestAsyncTask(url, token, requestMessaageDoc)); taskList.Add(task); } Task.WaitAll(taskList.ToArray(), 1000 * 10); } DateTime dt2 = DateTime.Now; var data = new { Success = true, LoadTime = (dt2 - dt1).TotalMilliseconds.ToString("##.####"), Result = responseMessageXml }; return(Json(data, new JsonSerializerSettings() { ContractResolver = new DefaultContractResolver() })); } catch (Exception ex) { var msg = string.Format("{0}\r\n{1}\r\n{2}", ex.Message, null, ex.InnerException != null ? ex.InnerException.Message : null); return(Json(new { Success = false, Result = msg }, new JsonSerializerSettings() { ContractResolver = new DefaultContractResolver() })); } } }
/// <summary> /// 从 Xml 转换 RequestMessage 对象的处理(只是创建实例,不填充数据) /// </summary> /// <param name="requestMsgType"></param> /// <param name="doc"></param> /// <returns></returns> public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc) { var res = doc.ToString(); IRequestMessageBase reqBase = new RequestMessageBase { ToUserName = XmlHelper.GetXmlNode(res, "ToUserName").Trim(), FromUserName = XmlHelper.GetXmlNode(res, "FromUserName").Trim(), Encrypt = XmlHelper.GetXmlNode(res, "Encrypt").Trim(), MsgId = Int64.Parse(XmlHelper.GetXmlNode(res, "MsgId")), MsgType = requestMsgType, CreateTime = TimeStampHelper.GetDateTime(int.Parse(XmlHelper.GetXmlNode(res, "CreateTime").Trim())) }; //ApiLoghelper.Info("reqBase", JsonHelper.ObjectToJSON(reqBase)); return(reqBase); }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString()); if (string.IsNullOrEmpty(responseMessageXml)) { responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。"; } return(Content(responseMessageXml)); } }
//<?xml version="1.0" encoding="utf-8"?> //<xml> // <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> // <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> // <CreateTime>1357986928</CreateTime> // <MsgType><![CDATA[text]]></MsgType> // <Content><![CDATA[中文]]></Content> // <MsgId>5832509444155992350</MsgId> //</xml> /// <summary> /// 获取XDocument转换后的IRequestMessageBase实例。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null) { RequestMessageBase requestMessage = null; RequestMsgType msgType = RequestMsgType.Text; try { msgType = MsgTypeHelper.GetRequestMsgType(doc); switch (msgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "USER_ENTER_TEMPSESSION": //进入客服会话 requestMessage = new RequestMessageEvent_UserEnterTempSession(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException()); //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } EntityHelper.FillEntityWithXml(requestMessage, doc); } catch (ArgumentException ex) { throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); } return(requestMessage); }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event? eventType, bool testConcurrence, int testConcurrenceCount) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString()); if (string.IsNullOrEmpty(responseMessageXml)) { responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。"; } try { DateTime dt1 = DateTime.Now; if (testConcurrence) { testConcurrenceCount = testConcurrenceCount > 30 ? 30 : testConcurrenceCount;//设定最高限额 //模拟并发请求 List<Task<string>> taskList = new List<Task<string>>(); for (int i = 0; i < testConcurrenceCount; i++) { var task = Task.Factory.StartNew(() => TestAsyncTask(url, token, requestMessaageDoc)); taskList.Add(task); } Task.WaitAll(taskList.ToArray(), 1000 * 10); } DateTime dt2 = DateTime.Now; return Json(new { Success = true, LoadTime = (dt2 - dt1).TotalMilliseconds.ToString("##.####"), Result = responseMessageXml }); } catch (Exception ex) { var msg = string.Format("{0}\r\n{1}\r\n{2}", ex.Message, null, ex.InnerException != null ? ex.InnerException.Message : null); return Json(new { Success = false, Result = msg }); } } }
//<?xml version="1.0" encoding="utf-8"?> //<xml> // <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> // <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> // <CreateTime>1357986928</CreateTime> // <MsgType><![CDATA[text]]></MsgType> // <Content><![CDATA[中文]]></Content> // <MsgId>5832509444155992350</MsgId> //</xml> /// <summary> /// 获取XDocument转换后的IRequestMessageBase实例。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IRequestMessageBase GetRequestEntity <TMC>(TMC messageContext, XDocument doc, PostModel postModel = null) where TMC : class, IMessageContext <IRequestMessageBase, IResponseMessageBase>, new() { RequestMessageBase requestMessage = null; RequestMsgType msgType = RequestMsgType.Text; try { msgType = MsgTypeHelper.GetRequestMsgType(doc); requestMessage = messageContext.GetRequestEntityMappingResult(msgType, doc) as RequestMessageBase; Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc); } catch (ArgumentException ex) { throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); } return(requestMessage); }
public ActionResult Index(string msg_signature, string timestamp, string nonce) { string sReqData = StreamHelper.Read(Request.InputStream); WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(); string sMsg = ""; int ret = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, sReqData, ref sMsg); if (ret != 0) { LogService.Fatal("ERR: VerifyURL fail, ret: " + ret); } //LogService.Fatal("解密后的数据: " + sMsg); XDocument doc = XmlHelper.LoadXML(sMsg); RequestMsgType msgType = MsgTypeHelper.GetRequestMsgType(doc); switch (msgType) { case RequestMsgType.Event: RequestEventMessage message = (RequestEventMessage)XmlHelper.Deserialize <RequestEventMessage>(sMsg); //成员关注、取消关注企业号的事件 if (message != null && message.Event == "subscribe" || message.Event == "unsubscribe") { var userId = message.FromUserName; //关注状态: 1=已关注,2=已冻结,4=未关注 int status = message.Event == "subscribe" ? 1 : 4; int rows = EmployeeService.UpdateEmpStatus(userId, (byte)status); //LogService.Fatal("修改结果: " + rows); } break; } return(Content(sMsg)); }
/// <summary> /// 获取请求消息和实体之间的映射结果 /// </summary> /// <param name="requestMsgType"></param> /// <returns></returns> public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { RequestMessageBase requestMessage; switch (requestMsgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.NeuChar: requestMessage = new RequestMessageNeuChar(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "USER_ENTER_TEMPSESSION": //进入客服会话 requestMessage = new RequestMessageEvent_UserEnterTempSession(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException()); //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } return(requestMessage); }
/// <summary> /// 根据消息类型获取 <see cref="IRequestMessage"/> 。 /// </summary> /// <param name="msgType">消息类型。</param> /// <param name="message">XML 消息字符串。</param> /// <returns>请求消息对象。</returns> private static IRequestMessage GetRequestMessageByMsgType(RequestMsgType msgType, string message) { #region 参数校验 if (msgType == RequestMsgType.Event) { throw new Exception("不能用该方法处理事件消息类型。"); } #endregion bool isExist = WeixinApp.MessageProcessConfig.MessageList.Any(m => m.MsgType == msgType); //如果在配置里面不存在则不处理。 if (!isExist) { return(null); } //如果响应消息类型集合中不存在则将类型放到字典中缓存, string typeName = $"Wlitsoft.Framework.WeixinSDK.Message.Request.Request{msgType}Message,Wlitsoft.Framework.WeixinSDK"; Type type = Type.GetType(typeName, true, true); return((IRequestMessage)message.ToXmlObject(_requestMessageTypesCache.GetOrAdd(msgType, type))); }
public ActionResult GetRequestMessageXml(string url, string token, RequestMsgType requestType, Event? eventType) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); return Content(requestMessaageDoc.ToString()); }
/// <summary> /// 获取请求XML /// </summary> /// <returns></returns> private XDocument GetrequestMessaageDoc(string url, string token, RequestMsgType requestType, Event? eventType) { RequestMessageBase requestMessaage = null; switch (requestType) { case RequestMsgType.Text: requestMessaage = new RequestMessageText() { Content = Request.Form["Content"], }; break; case RequestMsgType.Location: requestMessaage = new RequestMessageLocation() { Label = Request.Form["Label"], Location_X = double.Parse(Request.Form["Location_X"]), Location_Y = double.Parse(Request.Form["Location_Y"]), Scale = int.Parse(Request.Form["Scale"]) }; break; case RequestMsgType.Image: requestMessaage = new RequestMessageImage() { PicUrl = Request.Form["PicUrl"], }; break; case RequestMsgType.Voice: requestMessaage = new RequestMessageVoice() { Format = Request.Form["Format"], Recognition = Request.Form["Recognition"], }; break; case RequestMsgType.Video: requestMessaage = new RequestMessageVideo() { MsgId = long.Parse(Request.Form["MsgId"]), ThumbMediaId = Request.Form["ThumbMediaId"], }; break; //case RequestMsgType.Link: // break; case RequestMsgType.Event: if (eventType.HasValue) { RequestMessageEventBase requestMessageEvent = null; switch (eventType.Value) { //case Event.ENTER: // break; case Event.LOCATION: requestMessageEvent = new RequestMessageEvent_Location() { Latitude = long.Parse(Request.Form["Event.Latitude"]), Longitude = long.Parse(Request.Form["Event.Longitude"]), Precision = double.Parse(Request.Form["Event.Precision"]) }; break; case Event.subscribe: requestMessageEvent = new RequestMessageEvent_Subscribe() { EventKey = Request.Form["Event.EventKey"], Ticket = Request.Form["Event.Ticket"] }; break; case Event.unsubscribe: requestMessageEvent = new RequestMessageEvent_Unsubscribe(); break; case Event.CLICK: requestMessageEvent = new RequestMessageEvent_Click() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.scan: requestMessageEvent = new RequestMessageEvent_Scan() { EventKey = Request.Form["Event.EventKey"], Ticket = Request.Form["Event.Ticket"] }; break; case Event.VIEW: requestMessageEvent = new RequestMessageEvent_View() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.MASSSENDJOBFINISH: requestMessageEvent = new RequestMessageEvent_MassSendJobFinish() { FromUserName = "******",//系统指定 ErrorCount = int.Parse(Request.Form["Event.ErrorCount"]), FilterCount = int.Parse(Request.Form["Event.FilterCount"]), SentCount = int.Parse(Request.Form["Event.SentCount"]), Status = Request.Form["Event.Status"], TotalCount = int.Parse(Request.Form["Event.TotalCount"]) }; break; case Event.TEMPLATESENDJOBFINISH: requestMessageEvent = new RequestMessageEvent_TemplateSendJobFinish() { FromUserName = "******",//系统指定 MsgID = long.Parse(Request.Form["Event.MsgID"]), Status = Request.Form["Event.Status"], }; break; case Event.scancode_push: requestMessageEvent = new RequestMessageEvent_Scancode_Push() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], ScanCodeInfo = new ScanCodeInfo() { ScanResult = Request.Form["Event.ScanResult"], ScanType = Request.Form["Event.ScanType"], } }; break; case Event.scancode_waitmsg: requestMessageEvent = new RequestMessageEvent_Scancode_Waitmsg() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], ScanCodeInfo = new ScanCodeInfo() { ScanResult = Request.Form["Event.ScanResult"], ScanType = Request.Form["Event.ScanType"], } }; break; case Event.pic_sysphoto: var sysphotoPicMd5Sum = Request.Form["Event.PicMd5Sum"]; PicItem sysphotoPicItem = new PicItem() { item = new Md5Sum() { PicMd5Sum = sysphotoPicMd5Sum } }; List<PicItem> sysphotoPicItems = new List<PicItem>(); sysphotoPicItems.Add(sysphotoPicItem); requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], SendPicsInfo = new SendPicsInfo() { Count = Request.Form["Event.Count"], PicList = sysphotoPicItems } }; break; case Event.pic_photo_or_album: var photoOrAlbumPicMd5Sum = Request.Form["Event.PicMd5Sum"]; PicItem photoOrAlbumPicItem = new PicItem() { item = new Md5Sum() { PicMd5Sum = photoOrAlbumPicMd5Sum } }; List<PicItem> photoOrAlbumPicItems = new List<PicItem>(); photoOrAlbumPicItems.Add(photoOrAlbumPicItem); requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], SendPicsInfo = new SendPicsInfo() { Count = Request.Form["Event.Count"], PicList = photoOrAlbumPicItems } }; break; case Event.pic_weixin: var weixinPicMd5Sum = Request.Form["Event.PicMd5Sum"]; PicItem weixinPicItem = new PicItem() { item = new Md5Sum() { PicMd5Sum = weixinPicMd5Sum } }; List<PicItem> weixinPicItems = new List<PicItem>(); weixinPicItems.Add(weixinPicItem); requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], SendPicsInfo = new SendPicsInfo() { Count = Request.Form["Event.Count"], PicList = weixinPicItems } }; break; case Event.location_select: requestMessageEvent = new RequestMessageEvent_Location_Select() { FromUserName = "******",//系统指定 EventKey = Request.Form["Event.EventKey"], SendLocationInfo = new SendLocationInfo() { Label = Request.Form["Event.Label"], Location_X = Request.Form["Event.Location_X"], Location_Y = Request.Form["Event.Location_Y"], Poiname = Request.Form["Event.Poiname"], Scale = Request.Form["Event.Scale"], } }; break; default: throw new ArgumentOutOfRangeException("eventType"); } requestMessaage = requestMessageEvent; } else { throw new ArgumentOutOfRangeException("eventType"); } break; default: throw new ArgumentOutOfRangeException("requestType"); } requestMessaage.MsgId = long.Parse(Request.Form["MsgId"]); requestMessaage.CreateTime = DateTime.Now; requestMessaage.FromUserName = requestMessaage.FromUserName ?? "FromUserName(OpenId)";//用于区别不同的请求用户 requestMessaage.ToUserName = "******"; return requestMessaage.ConvertEntityToXml(); }
/// <summary> /// 从 Xml 转换 RequestMessage 对象的处理(只是创建实例,不填充数据) /// </summary> /// <param name="requestMsgType">RequestMsgType</param> /// <param name="doc">RequestMessage 的明文 XML</param> /// <returns></returns> public abstract TRequest GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc);
public static AbstractRequest GetRequestEntity(XDocument doc) { RequestMsgType msgType = MsgTypeHelper.GetMsgType(doc); AbstractRequest textRequest = null; switch (msgType) { case RequestMsgType.Text: { textRequest = new TextRequest(); break; } case RequestMsgType.Image: { textRequest = new ImageRequest(); break; } case RequestMsgType.Voice: { textRequest = new VoiceRequest(); break; } case RequestMsgType.Video: { textRequest = new VideoRequest(); break; } case RequestMsgType.Location: { textRequest = new LocationRequest(); break; } case RequestMsgType.Link: { textRequest = new LinkRequest(); break; } case RequestMsgType.Event: { switch (EventTypeHelper.GetEventType(doc)) { case RequestEventType.Subscribe: { textRequest = new SubscribeEventRequest(); break; } case RequestEventType.UnSubscribe: { textRequest = new UnSubscribeEventRequest(); break; } case RequestEventType.Scan: { textRequest = new ScanEventRequest(); break; } case RequestEventType.Location: { textRequest = new LocationEventRequest(); break; } case RequestEventType.Click: { textRequest = new ClickEventRequest(); break; } default: { throw new ArgumentOutOfRangeException(); } } break; } default: { throw new ArgumentOutOfRangeException(); } } EntityHelper.FillEntityWithXml <AbstractRequest>(textRequest, doc); return(textRequest); throw new ArgumentOutOfRangeException(); }
/// <summary> /// 获取请求XML /// </summary> /// <returns></returns> private XDocument GetrequestMessaageDoc(string url, string token, RequestMsgType requestType, Event?eventType) { RequestMessageBase requestMessaage = null; switch (requestType) { case RequestMsgType.Text: requestMessaage = new RequestMessageText() { Content = Request.Form["Content"], }; break; case RequestMsgType.Location: requestMessaage = new RequestMessageLocation() { Label = Request.Form["Label"], Location_X = double.Parse(Request.Form["Location_X"]), Location_Y = double.Parse(Request.Form["Location_Y"]), Scale = int.Parse(Request.Form["Scale"]) }; break; case RequestMsgType.Image: requestMessaage = new RequestMessageImage() { PicUrl = Request.Form["PicUrl"], }; break; case RequestMsgType.Voice: requestMessaage = new RequestMessageVoice() { Format = Request.Form["Format"], Recognition = Request.Form["Recognition"], }; break; case RequestMsgType.Video: requestMessaage = new RequestMessageVideo() { MsgId = long.Parse(Request.Form["MsgId"]), ThumbMediaId = Request.Form["ThumbMediaId"], }; break; //case RequestMsgType.Link: // break; case RequestMsgType.Event: if (eventType.HasValue) { RequestMessageEventBase requestMessageEvent = null; switch (eventType.Value) { //case Event.ENTER: // break; case Event.LOCATION: requestMessageEvent = new RequestMessageEvent_Location() { Latitude = long.Parse(Request.Form["Event.Latitude"]), Longitude = long.Parse(Request.Form["Event.Longitude"]), Precision = double.Parse(Request.Form["Event.Precision"]) }; break; case Event.subscribe: requestMessageEvent = new RequestMessageEvent_Subscribe() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.unsubscribe: requestMessageEvent = new RequestMessageEvent_Unsubscribe(); break; case Event.CLICK: requestMessageEvent = new RequestMessageEvent_Click() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.scan: requestMessageEvent = new RequestMessageEvent_Scan() { EventKey = Request.Form["Event.EventKey"], Ticket = Request.Form["Event.Ticket"] }; break; case Event.VIEW: requestMessageEvent = new RequestMessageEvent_View() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.MASSSENDJOBFINISH: requestMessageEvent = new RequestMessageEvent_MassSendJobFinish() { FromUserName = "******", //系统指定 ErrorCount = int.Parse(Request.Form["Event.ErrorCount"]), FilterCount = int.Parse(Request.Form["Event.FilterCount"]), SendCount = int.Parse(Request.Form["Event.SendCount"]), Status = Request.Form["Event.Status"], TotalCount = int.Parse(Request.Form["Event.TotalCount"]) }; break; default: throw new ArgumentOutOfRangeException("eventType"); } requestMessaage = requestMessageEvent; } else { throw new ArgumentOutOfRangeException("eventType"); } break; default: throw new ArgumentOutOfRangeException("requestType"); } requestMessaage.CreateTime = DateTime.Now; requestMessaage.FromUserName = requestMessaage.FromUserName ?? "FromUserName(OpenId)";//用于区别不同的请求用户 requestMessaage.ToUserName = "******"; return(requestMessaage.ConvertEntityToXml()); }
/// <summary> /// 根据XML信息填充实实体 /// </summary> /// <typeparam name="T">MessageBase为基类的类型,Response和Request都可以</typeparam> /// <param name="entity">实体</param> /// <param name="doc">XML</param> public static void FillEntityWithXml <T>(this T entity, XDocument doc) where T : /*MessageBase*/ class, new() { entity = entity ?? new T(); var root = doc.Root; var props = entity.GetType().GetProperties(); foreach (var prop in props) { var propName = prop.Name; if (root.Element(propName) != null) { switch (prop.PropertyType.Name) { //case "String": // goto default; case "DateTime": case "Int32": case "Int64": case "Double": case "Nullable`1": //可为空对象 EntityUtility.EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value); break; case "Boolean": if (propName == "FuncFlag") { EntityUtility.EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value == "1"); } else { goto default; } break; //以下为枚举类型 case "RequestMsgType": //已设为只读 //prop.SetValue(entity, MsgTypeHelper.GetRequestMsgType(root.Element(propName).Value), null); break; case "ResponseMsgType": //Response适用 //已设为只读 //prop.SetValue(entity, MsgTypeHelper.GetResponseMsgType(root.Element(propName).Value), null); break; case "ThirdPartyInfo": //ThirdPartyInfo适用 //已设为只读 //prop.SetValue(entity, MsgTypeHelper.GetResponseMsgType(root.Element(propName).Value), null); break; case "Event": //已设为只读 //prop.SetValue(entity, EventHelper.GetEventType(root.Element(propName).Value), null); break; //以下为实体类型 case "List`1": //List<T>类型,ResponseMessageNews适用 var genericArguments = prop.PropertyType.GetGenericArguments(); if (genericArguments[0].Name == "Article") //ResponseMessageNews适用 { //文章下属节点item List <Article> articles = new List <Article>(); foreach (var item in root.Element(propName).Elements("item")) { var article = new Article(); FillEntityWithXml(article, new XDocument(item)); articles.Add(article); } prop.SetValue(entity, articles, null); } else if (genericArguments[0].Name == "MpNewsArticle") { List <MpNewsArticle> mpNewsArticles = new List <MpNewsArticle>(); foreach (var item in root.Elements(propName)) { var mpNewsArticle = new MpNewsArticle(); FillEntityWithXml(mpNewsArticle, new XDocument(item)); mpNewsArticles.Add(mpNewsArticle); } prop.SetValue(entity, mpNewsArticles, null); } else if (genericArguments[0].Name == "PicItem") { List <PicItem> picItems = new List <PicItem>(); foreach (var item in root.Elements(propName).Elements("item")) { var picItem = new PicItem(); var picMd5Sum = item.Element("PicMd5Sum").Value; Md5Sum md5Sum = new Md5Sum() { PicMd5Sum = picMd5Sum }; picItem.item = md5Sum; picItems.Add(picItem); } prop.SetValue(entity, picItems, null); } break; case "Image": //ResponseMessageImage适用 Image image = new Image(); FillEntityWithXml(image, new XDocument(root.Element(propName))); prop.SetValue(entity, image, null); break; case "Voice": //ResponseMessageVoice适用 Voice voice = new Voice(); FillEntityWithXml(voice, new XDocument(root.Element(propName))); prop.SetValue(entity, voice, null); break; case "Video": //ResponseMessageVideo适用 Video video = new Video(); FillEntityWithXml(video, new XDocument(root.Element(propName))); prop.SetValue(entity, video, null); break; case "ScanCodeInfo": //扫码事件中的ScanCodeInfo适用 ScanCodeInfo scanCodeInfo = new ScanCodeInfo(); FillEntityWithXml(scanCodeInfo, new XDocument(root.Element(propName))); prop.SetValue(entity, scanCodeInfo, null); break; case "SendLocationInfo": //弹出地理位置选择器的事件推送中的SendLocationInfo适用 SendLocationInfo sendLocationInfo = new SendLocationInfo(); FillEntityWithXml(sendLocationInfo, new XDocument(root.Element(propName))); prop.SetValue(entity, sendLocationInfo, null); break; case "SendPicsInfo": //系统拍照发图中的SendPicsInfo适用 SendPicsInfo sendPicsInfo = new SendPicsInfo(); FillEntityWithXml(sendPicsInfo, new XDocument(root.Element(propName))); prop.SetValue(entity, sendPicsInfo, null); break; case "BatchJobInfo": //异步任务完成事件推送BatchJob BatchJobInfo batchJobInfo = new BatchJobInfo(); FillEntityWithXml(batchJobInfo, new XDocument(root.Element(propName))); prop.SetValue(entity, batchJobInfo, null); break; case "AgentType": { AgentType tp; #if NET35 try { tp = (AgentType)Enum.Parse(typeof(AgentType), root.Element(propName).Value, true); prop.SetValue(entity, tp, null); } catch { } #else if (Enum.TryParse(root.Element(propName).Value, out tp)) { prop.SetValue(entity, tp, null); } #endif break; } case "Receiver": { Receiver receiver = new Receiver(); FillEntityWithXml(receiver, new XDocument(root.Element(propName))); prop.SetValue(entity, receiver, null); break; } default: prop.SetValue(entity, root.Element(propName).Value, null); break; } } else if (prop.PropertyType.Name == "List`1")//客服回调特殊处理 { var genericArguments = prop.PropertyType.GetGenericArguments(); if (genericArguments[0].Name == "RequestBase") { List <RequestBase> items = new List <RequestBase>(); foreach (var item in root.Elements("Item")) { RequestBase reqItem = null; var msgTypeEle = item.Element("MsgType"); if (msgTypeEle != null) { RequestMsgType type = RequestMsgType.DEFAULT; var parseSuccess = false; #if NET35 try { type = (RequestMsgType)Enum.Parse(typeof(RequestMsgType), msgTypeEle.Value, true); parseSuccess = true; } catch { } #else parseSuccess = Enum.TryParse(msgTypeEle.Value, true, out type); #endif if (parseSuccess) { switch (type) { case RequestMsgType.Event: { reqItem = new RequestEvent(); break; } case RequestMsgType.File: { reqItem = new RequestMessageFile(); break; } case RequestMsgType.Image: { reqItem = new Entities.Request.KF.RequestMessageImage(); break; } case RequestMsgType.Link: { reqItem = new Entities.Request.KF.RequestMessageLink(); break; } case RequestMsgType.Location: { reqItem = new Entities.Request.KF.RequestMessageLocation(); break; } case RequestMsgType.Text: { reqItem = new Entities.Request.KF.RequestMessageText(); break; } case RequestMsgType.Voice: { reqItem = new Entities.Request.KF.RequestMessageVoice(); break; } } } } if (reqItem != null) { FillEntityWithXml(reqItem, new XDocument(item)); items.Add(reqItem); } } prop.SetValue(entity, items, null); } } } }
public static RequestMsgType GetMsgType(XDocument doc) { RequestMsgType msgType = MsgTypeHelper.GetMsgType(doc.Root.Element("MsgType").Value); return(msgType); }
/// <summary> /// 获取请求消息和实体之间的映射结果 /// </summary> /// <param name="requestMsgType"></param> /// <returns></returns> public override IWorkRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { IWorkRequestMessageBase requestMessage; switch (requestMsgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Location: requestMessage = new RequestMessageLocation(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.Voice: requestMessage = new RequestMessageVoice(); break; case RequestMsgType.Video: requestMessage = new RequestMessageVideo(); break; case RequestMsgType.ShortVideo: requestMessage = new RequestMessageShortVideo(); break; case RequestMsgType.File: requestMessage = new RequestMessageFile(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "CLICK": //菜单点击 requestMessage = new RequestMessageEvent_Click(); break; case "VIEW": //URL跳转 requestMessage = new RequestMessageEvent_View(); break; case "SUBSCRIBE": //订阅(关注) requestMessage = new RequestMessageEvent_Subscribe(); break; case "UNSUBSCRIBE": //取消订阅(关注) requestMessage = new RequestMessageEvent_UnSubscribe(); break; case "SCANCODE_PUSH": //扫码推事件(scancode_push) requestMessage = new RequestMessageEvent_Scancode_Push(); break; case "SCANCODE_WAITMSG": //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg) requestMessage = new RequestMessageEvent_Scancode_Waitmsg(); break; case "PIC_SYSPHOTO": //弹出系统拍照发图(pic_sysphoto) requestMessage = new RequestMessageEvent_Pic_Sysphoto(); break; case "PIC_PHOTO_OR_ALBUM": //弹出拍照或者相册发图(pic_photo_or_album) requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album(); break; case "PIC_WEIXIN": //弹出微信相册发图器(pic_weixin) requestMessage = new RequestMessageEvent_Pic_Weixin(); break; case "LOCATION_SELECT": //弹出地理位置选择器(location_select) requestMessage = new RequestMessageEvent_Location_Select(); break; case "LOCATION": //上报地理位置事件(location) requestMessage = new RequestMessageEvent_Location(); break; case "ENTER_AGENT": //用户进入应用的事件推送(enter_agent) requestMessage = new RequestMessageEvent_Enter_Agent(); break; case "BATCH_JOB_RESULT": //异步任务完成事件推送(batch_job_result) requestMessage = new RequestMessageEvent_Batch_Job_Result(); break; case "CHANGE_CONTACT": //通讯录更改推送(change_contact) switch (doc.Root.Element("ChangeType").Value.ToUpper()) { case "CREATE_USER": requestMessage = new RequestMessageEvent_Change_Contact_User_Create(); break; case "UPDATE_USER": requestMessage = new RequestMessageEvent_Change_Contact_User_Update(); break; case "DELETE_USER": requestMessage = new RequestMessageEvent_Change_Contact_User_Base(); break; case "CREATE_PARTY": requestMessage = new RequestMessageEvent_Change_Contact_Party_Create(); break; case "UPDATE_PARTY": requestMessage = new RequestMessageEvent_Change_Contact_Party_Update(); break; case "DELETE_PARTY": requestMessage = new RequestMessageEvent_Change_Contact_Party_Base(); break; case "UPDATE_TAG": requestMessage = new RequestMessageEvent_Change_Contact_Tag_Update(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; case "CHANGE_EXTERNAL_CONTACT": //客户变更回调 switch (doc.Root.Element("ChangeType").Value.ToUpper()) { case "ADD_EXTERNAL_CONTACT": requestMessage = new RequestMessageEvent_Change_ExternalContact_Add(); break; case "ADD_HALF_EXTERNAL_CONTACT": requestMessage = new RequestMessageEvent_Change_ExternalContact_Add_Half(); break; case "EDIT_EXTERNAL_CONTACT": requestMessage = new RequestMessageEvent_Change_ExternalContact_Modified(); break; case "DEL_EXTERNAL_CONTACT": requestMessage = new RequestMessageEvent_Change_ExternalContact_Del(); break; case "DEL_FOLLOW_USER": requestMessage = new RequestMessageEvent_Change_ExternalContact_Del_FollowUser(); break; case "MSG_AUDIT_APPROVED": requestMessage = new RequestMessageEvent_Change_ExternalContact_MsgAudit(); break; default: requestMessage = new RequestMessageEventBase(); break; } break; case "CHANGE_EXTERNAL_CHAT": //客户群变更事件推送 switch (doc.Root.Element("ChangeType").Value.ToUpper()) { case "CREATE": requestMessage = new RequestMessageEvent_Change_External_Chat_Create(); break; case "UPDATE": requestMessage = new RequestMessageEvent_Change_External_Chat_Update(doc.Root.Element("UpdateDetail").Value); break; case "DISMISS": requestMessage = new RequestMessageEvent_Change_External_Chat_Dismiss(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; case "LIVING_STATUS_CHANGE": //直播回调事件(living_status_change) requestMessage = new RequestMessageEvent_Living_Status_Change_Base(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException()); //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } return(requestMessage); }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType, bool testConcurrence, int testConcurrenceCount, bool testEncrypt, string encodingAESKey, string appId) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(/*url, token,*/ requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); string msgSigature = null; var timeStamp = SystemTime.NowTicks.ToString(); var nonce = (SystemTime.NowTicks * 2).ToString(); string encryptTypeAll = null; string openIdAll = null; //对请求消息进行加密 if (testEncrypt) { try { var openId = requestMessaageDoc.Root.Element("FromUserName").Value; var toUserName = requestMessaageDoc.Root.Element("ToUserName").Value; WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(token, encodingAESKey, appId); string finalResponseXml = null; var ret = msgCrype.EncryptRequestMsg(requestMessaageDoc.ToString(), timeStamp, nonce, toUserName, ref finalResponseXml, ref msgSigature); if (ret == 0) { requestMessaageDoc = XDocument.Parse(finalResponseXml);//赋值最新的加密信息 openIdAll = $"openid={openId}"; encryptTypeAll = "&encrypt_type=aes"; } } catch (Exception ex) { var data = new { Success = false, LoadTime = "N/A", Result = "发生错误:" + ex.ToString() }; return(Json(data, new JsonSerializerSettings() { ContractResolver = new DefaultContractResolver() })); throw; } //Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("模拟测试-加密消息:", requestMessaageDoc?.ToString()); } var sigature = CheckSignature.GetSignature(timeStamp, nonce, token); url += url.Contains("?") ? "&" : "?"; url += $"signature={sigature}&timeStamp={timeStamp}&nonce={nonce}&msg_signature={msgSigature}{encryptTypeAll}{openIdAll}"; //参数如:signature=330ed3b64e363dc876f35e54a79e59b48739f567×tamp=1570075722&nonce=863153744&openid=olPjZjsXuQPJoV0HlruZkNzKc91E&encrypt_type=aes&msg_signature=71dc359205a4660bc3b3046b643452c994b5897d var dt1 = SystemTime.Now; try { dt1 = SystemTime.Now; if (testConcurrence) { //异步方法 testConcurrenceCount = testConcurrenceCount > 30 ? 30 : testConcurrenceCount;//设定最高限额 //模拟并发请求 List <Task <string> > taskList = new List <Task <string> >(); for (int i = 0; i < testConcurrenceCount; i++) { var task = TestAsyncTask(url, token, requestMessaageDoc, autoFillUrlParameters: false, index: i, sleepMillionSeconds: 0); taskList.Add(task); } Task.WaitAll(taskList.ToArray(), 1500 * 10); } else { //同步方法,立即发送 _responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString(), autoFillUrlParameters: false); } if (string.IsNullOrEmpty(_responseMessageXml)) { _responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。"; } var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var data = new { Success = true, LoadTime = SystemTime.DiffTotalMS(dt1, "f4"), Result = _responseMessageXml, CacheType = cache.GetType().Name, ConcurrenceCount = testConcurrenceCount }; return(Json(data, new JsonSerializerSettings() { ContractResolver = new DefaultContractResolver() })); } catch (Exception ex) { var msg = string.Format("{0}\r\n{1}\r\n{2}", ex.Message, null, ex.InnerException != null ? ex.InnerException.Message : null); return(Json(new { Success = false, Result = msg }, new JsonSerializerSettings() { ContractResolver = new DefaultContractResolver() })); } } }
/// <summary> /// 获取请求XML /// </summary> /// <returns></returns> private XDocument GetrequestMessaageDoc(string url, string token, RequestMsgType requestType, Event? eventType) { RequestMessageBase requestMessaage = null; switch (requestType) { case RequestMsgType.Text: requestMessaage = new RequestMessageText() { Content = Request.Form["Content"], }; break; case RequestMsgType.Location: requestMessaage = new RequestMessageLocation() { Label = Request.Form["Label"], Location_X = double.Parse(Request.Form["Location_X"]), Location_Y = double.Parse(Request.Form["Location_Y"]), Scale = int.Parse(Request.Form["Scale"]) }; break; case RequestMsgType.Image: requestMessaage = new RequestMessageImage() { PicUrl = Request.Form["PicUrl"], }; break; case RequestMsgType.Voice: requestMessaage = new RequestMessageVoice() { Format = Request.Form["Format"], Recognition = Request.Form["Recognition"], }; break; case RequestMsgType.Video: requestMessaage = new RequestMessageVideo() { MsgId = long.Parse(Request.Form["MsgId"]), ThumbMediaId = Request.Form["ThumbMediaId"], }; break; //case RequestMsgType.Link: // break; case RequestMsgType.Event: if (eventType.HasValue) { RequestMessageEventBase requestMessageEvent = null; switch (eventType.Value) { //case Event.ENTER: // break; case Event.LOCATION: requestMessageEvent = new RequestMessageEvent_Location() { Latitude = long.Parse(Request.Form["Event.Latitude"]), Longitude = long.Parse(Request.Form["Event.Longitude"]), Precision = double.Parse(Request.Form["Event.Precision"]) }; break; case Event.subscribe: requestMessageEvent = new RequestMessageEvent_Subscribe() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.unsubscribe: requestMessageEvent = new RequestMessageEvent_Unsubscribe(); break; case Event.CLICK: requestMessageEvent = new RequestMessageEvent_Click() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.scan: requestMessageEvent = new RequestMessageEvent_Scan() { EventKey = Request.Form["Event.EventKey"], Ticket = Request.Form["Event.Ticket"] }; break; case Event.VIEW: requestMessageEvent = new RequestMessageEvent_View() { EventKey = Request.Form["Event.EventKey"] }; break; case Event.MASSSENDJOBFINISH: requestMessageEvent = new RequestMessageEvent_MassSendJobFinish() { FromUserName = "******",//系统指定 ErrorCount = int.Parse(Request.Form["Event.ErrorCount"]), FilterCount = int.Parse(Request.Form["Event.FilterCount"]), SendCount = int.Parse(Request.Form["Event.SendCount"]), Status = Request.Form["Event.Status"], TotalCount = int.Parse(Request.Form["Event.TotalCount"]) }; break; default: throw new ArgumentOutOfRangeException("eventType"); } requestMessaage = requestMessageEvent; } else { throw new ArgumentOutOfRangeException("eventType"); } break; default: throw new ArgumentOutOfRangeException("requestType"); } requestMessaage.CreateTime = DateTime.Now; requestMessaage.FromUserName = requestMessaage.FromUserName ?? "FromUserName(OpenId)";//用于区别不同的请求用户 requestMessaage.ToUserName = "******"; return requestMessaage.ConvertEntityToXml(); }
public ActionResult Index(string url, string token, RequestMsgType requestType, Event? eventType) { using (MemoryStream ms = new MemoryStream()) { var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType); requestMessaageDoc.Save(ms); ms.Seek(0, SeekOrigin.Begin); var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString()); return Content(responseMessageXml); } }
public static AbstractRequest GetRequestEntity(XDocument doc) { RequestMsgType msgType = MsgTypeHelper.GetMsgType(doc); AbstractRequest entity = null; switch (msgType) { case RequestMsgType.Text: entity = new TextRequest(); break; case RequestMsgType.Image: entity = new ImageRequest(); break; case RequestMsgType.Voice: entity = new VoiceRequest(); break; case RequestMsgType.Video: entity = new VideoRequest(); break; case RequestMsgType.Location: entity = new LocationRequest(); break; case RequestMsgType.Link: entity = new LinkRequest(); break; case RequestMsgType.Event: switch (EventTypeHelper.GetEventType(doc)) { case RequestEventType.Subscribe: entity = new SubscribeEventRequest(); goto Label_00D7; case RequestEventType.UnSubscribe: entity = new UnSubscribeEventRequest(); goto Label_00D7; case RequestEventType.Scan: entity = new ScanEventRequest(); goto Label_00D7; case RequestEventType.Location: entity = new LocationEventRequest(); goto Label_00D7; case RequestEventType.Click: entity = new ClickEventRequest(); goto Label_00D7; case RequestEventType.MASSSENDJOBFINISH: entity = new MassendJobFinishEventRequest(); goto Label_00D7; } throw new ArgumentOutOfRangeException(); default: throw new ArgumentOutOfRangeException(); } Label_00D7: EntityHelper.FillEntityWithXml <AbstractRequest>(entity, doc); Regex regex = new Regex(@"<MsgID>(?<url>\d+)</MsgID>"); if (entity.MsgId == 0L) { Match match = Regex.Match(doc.Root.ToString(), @"<MsgID>(?<msgid>\d+)</MsgID>", RegexOptions.IgnoreCase); if (match.Success) { entity.MsgId = long.Parse(match.Groups["msgid"].Value); entity.CreateTime = DateTime.Now; } } return(entity); }
public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { throw new NotImplementedException(); }
/// <summary> /// 获取请求消息和实体之间的映射结果 /// </summary> /// <param name="requestMsgType"></param> /// <returns></returns> public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null) { RequestMessageBase requestMessage; switch (requestMsgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Location: requestMessage = new RequestMessageLocation(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.Voice: requestMessage = new RequestMessageVoice(); break; case RequestMsgType.Video: requestMessage = new RequestMessageVideo(); break; case RequestMsgType.Link: requestMessage = new RequestMessageLink(); break; case RequestMsgType.ShortVideo: requestMessage = new RequestMessageShortVideo(); break; case RequestMsgType.File: requestMessage = new RequestMessageFile(); break; case RequestMsgType.NeuChar: requestMessage = new RequestMessageNeuChar(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "ENTER": //进入会话 requestMessage = new RequestMessageEvent_Enter(); break; case "LOCATION": //地理位置 requestMessage = new RequestMessageEvent_Location(); break; case "SUBSCRIBE": //订阅(关注) requestMessage = new RequestMessageEvent_Subscribe(); break; case "UNSUBSCRIBE": //取消订阅(关注) requestMessage = new RequestMessageEvent_Unsubscribe(); break; case "CLICK": //菜单点击 requestMessage = new RequestMessageEvent_Click(); break; case "SCAN": //二维码扫描 requestMessage = new RequestMessageEvent_Scan(); break; case "VIEW": //URL跳转 requestMessage = new RequestMessageEvent_View(); break; case "MASSSENDJOBFINISH": requestMessage = new RequestMessageEvent_MassSendJobFinish(); break; case "TEMPLATESENDJOBFINISH": //模板信息 requestMessage = new RequestMessageEvent_TemplateSendJobFinish(); break; case "SCANCODE_PUSH": //扫码推事件(scancode_push) requestMessage = new RequestMessageEvent_Scancode_Push(); break; case "SCANCODE_WAITMSG": //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg) requestMessage = new RequestMessageEvent_Scancode_Waitmsg(); break; case "PIC_SYSPHOTO": //弹出系统拍照发图(pic_sysphoto) requestMessage = new RequestMessageEvent_Pic_Sysphoto(); break; case "PIC_PHOTO_OR_ALBUM": //弹出拍照或者相册发图(pic_photo_or_album) requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album(); break; case "PIC_WEIXIN": //弹出微信相册发图器(pic_weixin) requestMessage = new RequestMessageEvent_Pic_Weixin(); break; case "LOCATION_SELECT": //弹出地理位置选择器(location_select) requestMessage = new RequestMessageEvent_Location_Select(); break; case "CARD_PASS_CHECK": //卡券通过审核 requestMessage = new RequestMessageEvent_Card_Pass_Check(); break; case "CARD_NOT_PASS_CHECK": //卡券未通过审核 requestMessage = new RequestMessageEvent_Card_Not_Pass_Check(); break; case "USER_GET_CARD": //领取卡券 requestMessage = new RequestMessageEvent_User_Get_Card(); break; case "USER_DEL_CARD": //删除卡券 requestMessage = new RequestMessageEvent_User_Del_Card(); break; case "KF_CREATE_SESSION": //多客服接入会话 requestMessage = new RequestMessageEvent_Kf_Create_Session(); break; case "KF_CLOSE_SESSION": //多客服关闭会话 requestMessage = new RequestMessageEvent_Kf_Close_Session(); break; case "KF_SWITCH_SESSION": //多客服转接会话 requestMessage = new RequestMessageEvent_Kf_Switch_Session(); break; case "POI_CHECK_NOTIFY": //审核结果事件推送 requestMessage = new RequestMessageEvent_Poi_Check_Notify(); break; case "WIFICONNECTED": //Wi-Fi连网成功事件 requestMessage = new RequestMessageEvent_WifiConnected(); break; case "USER_CONSUME_CARD": //卡券核销 requestMessage = new RequestMessageEvent_User_Consume_Card(); break; case "USER_ENTER_SESSION_FROM_CARD": //从卡券进入公众号会话 requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card(); break; case "USER_VIEW_CARD": //进入会员卡 requestMessage = new RequestMessageEvent_User_View_Card(); break; case "MERCHANT_ORDER": //微小店订单付款通知 requestMessage = new RequestMessageEvent_Merchant_Order(); break; case "SUBMIT_MEMBERCARD_USER_INFO": //接收会员信息事件通知 requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info(); break; case "SHAKEAROUNDUSERSHAKE": //摇一摇事件通知 requestMessage = new RequestMessageEvent_ShakearoundUserShake(); break; case "USER_GIFTING_CARD": //卡券转赠事件推送 requestMessage = new RequestMessageEvent_User_Gifting_Card(); break; case "USER_PAY_FROM_PAY_CELL": // 微信买单完成 requestMessage = new RequestMessageEvent_User_Pay_From_Pay_Cell(); break; case "UPDATE_MEMBER_CARD": // 会员卡内容更新事件:会员卡积分余额发生变动时 requestMessage = new RequestMessageEvent_Update_Member_Card(); break; case "CARD_SKU_REMIND": //卡券库存报警事件:当某个card_id的初始库存数大于200且当前库存小于等于100时 requestMessage = new RequestMessageEvent_Card_Sku_Remind(); break; case "CARD_PAY_ORDER": //券点流水详情事件:当商户朋友的券券点发生变动时 requestMessage = new RequestMessageEvent_Card_Pay_Order(); break; case "APPLY_MERCHANT_AUDIT_INFO": //创建门店小程序审核事件 requestMessage = new RequestMessageEvent_ApplyMerchantAuditInfo(); break; case "CREATE_MAP_POI_AUDIT_INFO": //从腾讯地图中创建门店审核事件 requestMessage = new RequestMessageEvent_CreateMapPoiAuditInfo(); break; case "ADD_STORE_AUDIT_INFO": //门店小程序中创建门店审核事件 requestMessage = new RequestMessageEvent_AddStoreAuditInfo(); break; case "MODIFY_STORE_AUDIT_INFO": //修改门店图片审核事件 requestMessage = new RequestMessageEvent_ModifyStoreAuditInfo(); break; case "VIEW_MINIPROGRAM": //微信点击菜单跳转小程序的事件推送的事件 requestMessage = new RequestMessageEvent_View_Miniprogram(); break; #region 卡券回调 case "GIFTCARD_PAY_DONE": //券点流水详情事件:当商户朋友的券券点发生变动时 requestMessage = new RequestMessageEvent_GiftCard_Pay_Done(); break; case "GIFTCARD_SEND_TO_FRIEND": //券点流水详情事件:当商户朋友的券券点发生变动时 requestMessage = new RequestMessageEvent_GiftCard_Send_To_Friend(); break; case "GIFTCARD_USER_ACCEPT": //券点流水详情事件:当商户朋友的券券点发生变动时 requestMessage = new RequestMessageEvent_GiftCard_User_Accept(); break; #endregion #region 微信认证事件推送 case "QUALIFICATION_VERIFY_SUCCESS": //资质认证成功(此时立即获得接口权限) requestMessage = new RequestMessageEvent_QualificationVerifySuccess(); break; case "QUALIFICATION_VERIFY_FAIL": //资质认证失败 requestMessage = new RequestMessageEvent_QualificationVerifyFail(); break; case "NAMING_VERIFY_SUCCESS": //名称认证成功(即命名成功) requestMessage = new RequestMessageEvent_NamingVerifySuccess(); break; case "NAMING_VERIFY_FAIL": //名称认证失败(这时虽然客户端不打勾,但仍有接口权限) requestMessage = new RequestMessageEvent_NamingVerifyFail(); break; case "ANNUAL_RENEW": //年审通知 requestMessage = new RequestMessageEvent_AnnualRenew(); break; case "VERIFY_EXPIRED": //认证过期失效通知 requestMessage = new RequestMessageEvent_VerifyExpired(); break; #endregion #region 小程序审核事件推送 //该事件已移动到Senparc.Weixin.WxOpen //case "WEAPP_AUDIT_SUCCESS": //小程序审核成功 // requestMessage = new RequestMessageEvent_WeAppAuditSuccess(); // break; //case "WEAPP_AUDIT_FAIL": //小程序审核失败 // requestMessage = new RequestMessageEvent_WeAppAuditFail(); // break; #endregion default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: { requestMessage = new RequestMessageUnknownType() { RequestDocument = doc }; ; #region v14.8.3 之前的方案,直接在这里抛出异常 /* * throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 */ #endregion break; } } return(requestMessage); }