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);
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        /// <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));
            }
        }
Exemple #4
0
 /// <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);
 }
Exemple #5
0
        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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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";
        }
Exemple #8
0
        public override RequestMessageNeuChar GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null)
        {
            if (requestMsgType != RequestMsgType.NeuChar)
            {
                throw new MessageHandlerException("仅支持 NeuChar 类型请求");
            }

            var requestMessage = new RequestMessageNeuChar();

            return(requestMessage);
        }
Exemple #9
0
        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()
                    }));
                }
            }
        }
Exemple #12
0
        /// <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);
        }
Exemple #13
0
        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));
            }
        }
Exemple #14
0
        //<?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 });

                }
            }
        }
Exemple #16
0
        //<?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);
        }
Exemple #17
0
        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);
        }
Exemple #19
0
        /// <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)));
        }
Exemple #20
0
 public ActionResult GetRequestMessageXml(string url, string token, RequestMsgType requestType, Event? eventType)
 {
     var requestMessaageDoc = GetrequestMessaageDoc(url, token, requestType, eventType);
     return Content(requestMessaageDoc.ToString());
 }
Exemple #21
0
        /// <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();
        }
Exemple #22
0
 /// <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);
                    }
                }
            }
        }
        /// <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();
        }
Exemple #27
0
        public static RequestMsgType GetMsgType(XDocument doc)
        {
            RequestMsgType msgType = MsgTypeHelper.GetMsgType(doc.Root.Element("MsgType").Value);

            return(msgType);
        }
Exemple #28
0
        /// <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&timestamp=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()
                    }));
                }
            }
        }
 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"]
                                };
                                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);
            }
        }
Exemple #33
0
        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);
        }