public void GetRequestEntityTest() { var dt = DateTimeHelper.BaseTime.AddTicks(((long)1413192605 + 8 * 60 * 60) * 10000000); { //component_verify_ticket var doc = XDocument.Parse(component_verify_ticketText); var result = RequestMessageFactory.GetRequestEntity(doc); Assert.IsInstanceOfType(result, typeof(RequestMessageComponentVerifyTicket)); Assert.AreEqual("1", result.AppId); Assert.AreEqual(dt, result.CreateTime); Assert.AreEqual("ChainClouds", (result as RequestMessageComponentVerifyTicket).ComponentVerifyTicket); Console.WriteLine(doc); } { //unauthorized var doc = XDocument.Parse(unauthorizedText); var result = RequestMessageFactory.GetRequestEntity(doc); Assert.IsInstanceOfType(result, typeof(RequestMessageUnauthorized)); Assert.AreEqual("1", result.AppId); Assert.AreEqual(dt, result.CreateTime); Assert.AreEqual("211", (result as RequestMessageUnauthorized).AuthorizerAppid); Console.WriteLine(doc); } }
public void ConvertEntityToXml_MusicTest() { var voiceTest = @"<?xml version=""1.0"" encoding=""utf-8""?> <xml> <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> <CreateTime>1361430302</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[X1yfgB2XI-faU6R2jmKz0X1JZmPCxIvM-9ktt4K92BB9577SCi41S-qMl60q5DJo]]></MediaId> <Format><![CDATA[amr]]></Format> <MsgId>5847298622973403529</MsgId> </xml>"; var doc = XDocument.Parse(voiceTest); var requestEntity = RequestMessageFactory.GetRequestEntity(doc) as RequestMessageVoice; Assert.IsNotNull(requestEntity); var responseMusic = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageMusic>(requestEntity); Assert.IsNotNull(responseMusic); responseMusic.Music.Title = "测试Music"; responseMusic.Music.Description = "测试Music的说明"; responseMusic.Music.MusicUrl = "http://zs.sasu.edu.cn/Content/music1.mp3"; responseMusic.Music.HQMusicUrl = "http://zs.sasu.edu.cn/Content/music2.mp3"; var responseDoc = EntityHelper.ConvertEntityToXml(responseMusic); Console.WriteLine(responseDoc.ToString()); Assert.AreEqual(responseMusic.Music.Title, responseDoc.Root.Element("Music").Element("Title").Value); Assert.AreEqual(responseMusic.Music.Description, responseDoc.Root.Element("Music").Element("Description").Value); Assert.AreEqual(responseMusic.Music.MusicUrl, responseDoc.Root.Element("Music").Element("MusicUrl").Value); Assert.AreEqual(responseMusic.Music.HQMusicUrl, responseDoc.Root.Element("Music").Element("HQMusicUrl").Value); }
public async Task <ActionResult> WXMSG(string signature, string timestamp, string nonce, string echostr) { if (!CheckSignature.Check(signature, timestamp, nonce, Commons.WXToken)) { return(Content("参数错误!")); } try { XDocument requestDoc = null; requestDoc = XDocument.Load(Request.Body); var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc); // 关注 取消 事件 if (requestMessage.MsgType == RequestMsgType.Event) { RequestMessageEventBase msg = (RequestMessageEventBase)requestMessage; if (msg.Event == Event.subscribe) { await FocusOn(requestDoc); //关注 } if (msg.Event == Event.unsubscribe) { await UnFocusOn(requestDoc); //取消关注 } } else { await AcceptWechar(requestDoc);// 发送的消息 } return(Content("success")); } catch (Exception ex) { return(Content(ex.ToString())); } }
public XDocument Init(IEncryptPostModel postModel) { _postModel = postModel as PostModel ?? new PostModel(); //解密XML信息 var postDataStr = EcryptRequestDocument.ToString(); WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExecute = true; return(null); } RequestDocument = XDocument.Parse(msgXml);//完成解密 RequestMessage = RequestMessageFactory.GetRequestEntity(RequestDocument); //((RequestMessageBase)RequestMessage).FillEntityWithXml(RequestDocument); return(RequestDocument); }
public void ConvertEntityToXml_ImageTest() { { var imageRequestXML = @"<?xml version=""1.0"" encoding=""utf-8""?> <xml> <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> <CreateTime>1357996976</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmsns.qpic.cn/mmsns/ZxBXNzgHyUqazGkXUvujSOOHruk6XP5P9984HOCSATlW1orZDlpdCA/0]]></PicUrl> <MsgId>5832552599987382826</MsgId> <MediaId><![CDATA[Mj0WUTZeeG9yuBKhGP7iR5n1xUJO9IpTjGNC4buMuswfEOmk6QSIRb_i98do5nwo]]></MediaId> </xml>"; var doc = XDocument.Parse(imageRequestXML); var requestEntity = RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as RequestMessageImage; Assert.IsNotNull(requestEntity); //var responseNews = // ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as // ResponseMessageNews; //Assert.IsNotNull(responseNews); //responseNews.Articles.Add(new Article() //{ // Description = "测试说明", // Title = "测试标题", // Url = "http://www.senparc.com", // PicUrl = requestEntity.PicUrl //}); //Assert.AreEqual(1, responseNews.ArticleCount); //var responseDoc = EntityHelper.ConvertEntityToXml(responseNews); //Console.WriteLine(responseDoc.ToString()); //Assert.AreEqual(requestEntity.PicUrl, responseDoc.Root.Element("Articles").Elements("item").First().Element("PicUrl").Value); //返回图片信息 var responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageImage>(requestEntity); responseMessage.Image.MediaId = requestEntity.MediaId; var responseDoc = EntityHelper.ConvertEntityToXml(responseMessage); Assert.IsNotNull(responseDoc); } // { // var imageResponseXML = @"<?xml version=""1.0"" encoding=""utf-8""?> //<xml> // <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> //<FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> //<CreateTime>1392354263</CreateTime> //<MsgType><![CDATA[image]]></MsgType> //<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/ZxBXNzgHyUqDOeR0nSWZ4ibeF49C2yBbUB9tltJaFLqvjvDOUkt1tgp3q2cr1KZMLRsHHA2380sAggSPRuRMjicQ/0]]></PicUrl> //<MsgId>5980116024231210973</MsgId> //<MediaId><![CDATA[Mj0WUTZeeG9yuBKhGP7iR5n1xUJO9IpTjGNC4buMuswfEOmk6QSIRb_i98do5nwo]]></MediaId> //</xml>"; // } }
public void FillEntityWithXmlTest() { var doc = XDocument.Parse(xml); var entity = RequestMessageFactory.GetRequestEntity(doc); EntityHelper.FillEntityWithXml(entity as RequestMessageBase, doc); Assert.AreEqual("gh_a96a4a619366", entity.ToUserName); Assert.AreEqual(RequestMsgType.Text, entity.MsgType); }
public override XDocument Init(XDocument postDataDocument, object postData = null) { //进行加密判断并处理 _postModel = postData as PostModel; var postDataStr = postDataDocument.ToString(); AfterDecryptData(postDataStr, _postModel); XDocument decryptDoc = postDataDocument; XElement AppID = postDataDocument.Root.Element("ToUserName"); AfterGetData(AppID == null ? "" : AppID.Value, _postModel); if (_postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value)) { //使用了加密 UsingEcryptMessage = true; EcryptRequestDocument = postDataDocument; WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return(null); } if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value)) { //TODO:使用了兼容模式,进行验证即可 UsingCompatibilityModelEcryptMessage = true; } decryptDoc = XDocument.Parse(msgXml);//完成解密 } RequestMessage = RequestMessageFactory.GetRequestEntity(decryptDoc); if (UsingEcryptMessage) { RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value; } //记录上下文 if (WeixinContextGlobal.UseWeixinContext) { WeixinContext.InsertMessage(RequestMessage); } return(decryptDoc); }
public RequestMessageFactoryTests() { _request = new Request { Method = "GET", Url = "/users/123", Body = new byte[] { 123 } }; _underTest = new RequestMessageFactory(); }
public override async Task <InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (encoding == null) { throw new ArgumentNullException(nameof(encoding)); } if (context.ModelType == typeof(RequestMessage)) { var request = context.HttpContext.Request; if (!request.Body.CanSeek) { BufferingHelper.EnableRewind(request); Debug.Assert(request.Body.CanSeek); await request.Body.DrainAsync(CancellationToken.None); request.Body.Seek(0L, SeekOrigin.Begin); } using (var xmlReader = CreateXmlReader(new NonDisposableStream(request.Body), encoding)) { var inputRequestMessage = RequestMessageFactory.CreateRequestMessage(xmlReader); if ((_messageMode == MessageMode.Cipher || _messageMode == MessageMode.Compatible) && inputRequestMessage is RequestEncryptMessage) { var encryptMessage = inputRequestMessage as RequestEncryptMessage; var plainMessage = String.Empty; var sMsgSignature = context.HttpContext.Request.Query["msg_signature"]; var sTimeStamp = context.HttpContext.Request.Query["timestamp"]; var sNonce = context.HttpContext.Request.Query["nonce"]; var ret = _crypt.DecryptMsg(sMsgSignature, sTimeStamp, sNonce, encryptMessage.EncryptMessage, ref plainMessage); if (ret == 0) { using (var stringStream = new MemoryStream(encoding.GetBytes(plainMessage))) using (var stringReader = CreateXmlReader(stringStream, encoding)) { inputRequestMessage = RequestMessageFactory.CreateRequestMessage(stringReader); } } } return(InputFormatterResult.Success(inputRequestMessage)); } } return(await base.ReadRequestBodyAsync(context, encoding)); }
private void Init(XDocument requestDocument) { RequestDocument = requestDocument; RequestMessage = RequestMessageFactory.GetRequestEntity(RequestDocument); //记录上下文 if (WeixinContextGlobal.UseWeixinContext) { //WeixinContext.InsertMessage(RequestMessage); } }
public override XDocument Init(XDocument postDataDocument, object postData = null) { RequestMessage = RequestMessageFactory.GetRequestEntity(postDataDocument); //记录上下文 if (WeixinContextGlobal.UseWeixinContext) { WeixinContext.InsertMessage(RequestMessage); } return(postDataDocument); }
public IActionResult Post([FromServices] IOptions <AppSetting> appSettings, WechatPostRequestModel model) { if (!CheckSignature.Check(model.signature, model.timestamp, model.nonce, appSettings.Value.Token)) { return(Content("参数错误!")); } var doc = XDocument.Load(Request.Body); var requestMessage = RequestMessageFactory.GetRequestEntity(doc); try { var baseMessage = ResponseMessageBase.CreateFromRequestMessage <IResponseMessageBase>(requestMessage); var responseDoc = Senparc.NeuChar.Helpers.EntityHelper.ConvertEntityToXml(baseMessage); var responseStr = responseDoc.ToString(); switch (requestMessage.MsgType) { case RequestMsgType.Text: break; case RequestMsgType.Location: break; case RequestMsgType.Image: break; case RequestMsgType.Voice: break; case RequestMsgType.Video: break; case RequestMsgType.Link: break; case RequestMsgType.ShortVideo: break; case RequestMsgType.Event: //responseStr = await wechatEvent.HandleAsync(doc); break; default: break; } return(Content(responseStr)); } catch (Exception ex) { ex.ToExceptionless(); //LogManager.GetCurrentClassLogger().Error($"Exception:{ex}\n,Doc:{doc}"); return(Content(model.echostr)); } }
public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel) { _postModel = postModel as PostModel ?? new PostModel(); var postDataStr = postDataDocument.ToString(); //Work中消息默认都是强制加密的,但通知似乎没有加密 UsingEncryptMessage = postDataDocument.Root.Element("Encrypt") != null; EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr); XDocument requestDocument; //2、解密:获得明文字符串 if (UsingEncryptMessage) { string msgXml = null; WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId); var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); /* msgXml * <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName> * <FromUserName><![CDATA[001]]></FromUserName> * <CreateTime>1412585107</CreateTime> * <MsgType><![CDATA[text]]></MsgType> * <Content><![CDATA[你好]]></Content> * <MsgId>4299263624800632834</MsgId> * <AgentID>2</AgentID> * </xml> */ //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExecute = true; return(null); } requestDocument = XDocument.Parse(msgXml); } else { requestDocument = postDataDocument;//TODO:深拷贝 } RequestMessage = RequestMessageFactory.GetRequestEntity <TMC>(new TMC(), doc: requestDocument); return(requestDocument); //消息上下文记录将在 base.CommonInitialize() 中根据去重等条件判断后进行添加 }
private async Task <Response> SendAsync(Request request, TimeSpan?connectionTimeout, CancellationToken token) { try { using (var state = new DisposableState()) { state.Request = RequestMessageFactory.Create(request, token, log); if (state.Request.Content is GenericContent content && socketTuner.CanTune) { state.Request.Content = new SocketTuningContent(content, socketTuner, log); } var handler = handlerProvider.Obtain(connectionTimeout); state.Response = await SocketsHandlerInvoker.Invoke(handler, state.Request, token).ConfigureAwait(false); var responseCode = (ResponseCode)(int)state.Response.StatusCode; var responseHeaders = ResponseHeadersConverter.Convert(state.Response); if (request.Method == RequestMethods.Head) { return(new Response(responseCode, headers: responseHeaders)); } var bodyReadResult = await bodyReader.ReadAsync(state.Response, token).ConfigureAwait(false); if (bodyReadResult.ErrorCode.HasValue) { return(new Response(bodyReadResult.ErrorCode.Value)); } if (bodyReadResult.Stream == null) { return(new Response(responseCode, bodyReadResult.Content, responseHeaders)); } state.PreventNextDispose(); return(new Response(responseCode, null, responseHeaders, new DisposableBodyStream(bodyReadResult.Stream, state))); } } catch (Exception error) { var errorResponse = errorHandler.TryHandle(request, error, token, connectionTimeout); if (errorResponse == null) { throw; } return(errorResponse); } }
/// <summary> /// 初始化数据 /// </summary> /// <param name="postDataDocument"></param> /// <param name="postModel"></param> /// <returns></returns> public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel) { //进行加密判断并处理 _postModel = postModel as PostModel ?? new PostModel(); var postDataStr = postDataDocument.ToString(); XDocument decryptDoc = postDataDocument; if (_postModel != null && !_postModel.Token.IsNullOrWhiteSpace() && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value)) { //使用了加密 UsingEcryptMessage = true; EcryptRequestDocument = postDataDocument; WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return(null); } if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value)) { //TODO:使用了兼容模式,进行验证即可 UsingCompatibilityModelEcryptMessage = true; } decryptDoc = XDocument.Parse(msgXml);//完成解密 } RequestMessage = RequestMessageFactory.GetRequestEntity(new TMC(), decryptDoc); if (UsingEcryptMessage) { RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value; } //记录上下文 if (MessageContextGlobalConfig.UseMessageContext) { GlobalMessageContext.InsertMessage(RequestMessage); } return(decryptDoc); }
public void GetEncryptPostDataTest() { var xml = @"<xml> <ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName> <Encrypt><![CDATA[P/xe9JLq4RJd3AFnjwRsttpyBrTVAGZ49JspjVI65EL7ra73u5TNn3EXHngx1TQ1gnfuFpbRovJdVZ8WrqZ4y0PI9ncA9GR95TboQWK/RGbDpW/Rkq0il1lpw+c/NTk1abwH1C/2siKATSJTbGQ4mWSyhOME7vINBHeW7EjmGEZSaPxC60z1qcLYgMYAiEL/xrU484V6X6BG/jV2uF76+C7HWGMLVmu4DOHVW+UfqQo9SnpAqZx0KRcvT/8XxGUsGwgNWhYyuzUHxu1VuZK16IiHS494tjWrXs08dKQzcpwyID7dthqQDTdIVe0tiOwPAlXvv7jQ5iMtYoQlT32HOjNTn5o/hz9wFZNnC6TFi2Y0ocEWxEMNwDHsyK85ytryTZzL+OmZ7heB72ABNhx9uGhrLoA5M68/ZXwlmfJVx8M=]]></Encrypt> <AgentID><![CDATA[2]]></AgentID> </xml>"; var encryptPostData = RequestMessageFactory.GetEncryptPostData(xml); Assert.IsNotNull(encryptPostData); Assert.AreEqual("wx7618c0a6d9358622", encryptPostData.ToUserName); Assert.AreEqual("P/xe9JLq4RJd3AFnjwRsttpyBrTVAGZ49JspjVI65EL7ra73u5TNn3EXHngx1TQ1gnfuFpbRovJdVZ8WrqZ4y0PI9ncA9GR95TboQWK/RGbDpW/Rkq0il1lpw+c/NTk1abwH1C/2siKATSJTbGQ4mWSyhOME7vINBHeW7EjmGEZSaPxC60z1qcLYgMYAiEL/xrU484V6X6BG/jV2uF76+C7HWGMLVmu4DOHVW+UfqQo9SnpAqZx0KRcvT/8XxGUsGwgNWhYyuzUHxu1VuZK16IiHS494tjWrXs08dKQzcpwyID7dthqQDTdIVe0tiOwPAlXvv7jQ5iMtYoQlT32HOjNTn5o/hz9wFZNnC6TFi2Y0ocEWxEMNwDHsyK85ytryTZzL+OmZ7heB72ABNhx9uGhrLoA5M68/ZXwlmfJVx8M=", encryptPostData.Encrypt); Assert.AreEqual(2, encryptPostData.AgentID); }
public override XDocument Init(XDocument postDataDocument, object postData) { _postModel = postData as PostModel; var postDataStr = postDataDocument.ToString(); AfterDecryptData(postDataStr, _postModel); EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr); AfterGetData(EncryptPostData, _postModel); //解密:获得明文字符串 WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); /* msgXml * <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName> * <FromUserName><![CDATA[001]]></FromUserName> * <CreateTime>1412585107</CreateTime> * <MsgType><![CDATA[text]]></MsgType> * <Content><![CDATA[你好]]></Content> * <MsgId>4299263624800632834</MsgId> * <AgentID>2</AgentID> * </xml> */ //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return(null); } AfterDecryptData(msgXml, _postModel); var requestDocument = XDocument.Parse(msgXml); RequestMessage = RequestMessageFactory.GetRequestEntity(requestDocument); //记录上下文,Chat还是不记录吧,太多了 if (WeixinContextGlobal.UseWeixinContext && !(RequestMessage is RequestMessageChat)) { WeixinContext.InsertMessage(RequestMessage); } return(requestDocument); }
protected virtual void DecryptMsg() { if (this.SignModel != null && !string.IsNullOrEmpty(this.SignModel.msg_signature)) { MsgCryptUtility mc = new MsgCryptUtility(WeiXinContext.Config.Token, WeiXinContext.Config.EncodingAESKey, WeiXinContext.Config.AppID); var requestXml = this.RequestXml; var ret = mc.DecryptMsg(this.SignModel.msg_signature, this.SignModel.timestamp, this.SignModel.nonce, requestXml, ref requestXml); if (ret != 0) { throw new Exception("消息解密失败"); } this.RequestXml = requestXml; } this.RequestMessage = RequestMessageFactory.GetRequestEntity(this.RequestXml); }
public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel) { _postModel = postModel as PostModel ?? new PostModel(); UsingEcryptMessage = true;//Work中消息都是强制加密的 var postDataStr = postDataDocument.ToString(); EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr); //2、解密:获得明文字符串 WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); /* msgXml * <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName> * <FromUserName><![CDATA[001]]></FromUserName> * <CreateTime>1412585107</CreateTime> * <MsgType><![CDATA[text]]></MsgType> * <Content><![CDATA[你好]]></Content> * <MsgId>4299263624800632834</MsgId> * <AgentID>2</AgentID> * </xml> */ //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return(null); } var requestDocument = XDocument.Parse(msgXml); RequestMessage = RequestMessageFactory.GetRequestEntity(requestDocument); //记录上下文 if (RequestMessage.MsgType != RequestMsgType.Unknown && MessageContextGlobalConfig.UseMessageContext) { GlobalMessageContext.InsertMessage(RequestMessage); } return(requestDocument); }
public void FillEntityWithEmbedXmlTest() { var doc = XDocument.Parse(embedXml); var entity = RequestMessageFactory.GetRequestEntity(doc); EntityHelper.FillEntityWithXml(entity as RequestMessageBase, doc); Assert.AreEqual("gh_4d00ed8d6399", entity.ToUserName); Assert.AreEqual(RequestMsgType.Event, entity.MsgType); var strongEntity = entity as RequestMessageEvent_MassSendJobFinish; Assert.IsNotNull(strongEntity); Assert.AreEqual(2, strongEntity.CopyrightCheckResult.Count); Assert.AreEqual("Url_1", strongEntity.CopyrightCheckResult.ResultList[0].item.OriginalArticleUrl); Assert.AreEqual("Url_2", strongEntity.CopyrightCheckResult.ResultList[1].item.OriginalArticleUrl); }
public void ConvertEntityToXml_subscribe_msg_sent_eventTest() { var xml = @"<xml> <ToUserName><![CDATA[gh_123456789abc]]></ToUserName> <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName> <CreateTime>1610969468</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe_msg_sent_event]]></Event> <SubscribeMsgSentEvent> <List> <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId> <MsgID>1700827132819554304</MsgID> <ErrorCode>0</ErrorCode> <ErrorStatus><![CDATA[success]]></ErrorStatus> </List> </SubscribeMsgSentEvent> </xml>"; var doc = XDocument.Parse(xml); var requestEntity = RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as RequestMessageEvent_Subscribe_Msg_Sent; Assert.IsNotNull(requestEntity); Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_sent_event"); Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4"); Assert.IsTrue(requestEntity.SubscribeMsgSentEvent.Count == 1); Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].TemplateId == "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].MsgID == "1700827132819554304"); Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].ErrorCode == 0); Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].ErrorStatus == "success"); }
public override XDocument Init(XDocument requestDocument, IEncryptPostModel postModel) { XDocument decryptDoc = requestDocument; var messageContext = new Weixin.MP.MessageContexts.DefaultMpMessageContext();// new CustomMessageContext(); //base.GetCurrentMessageContext().GetAwaiter().GetResult(); RequestMessage = RequestMessageFactory.GetRequestEntity(messageContext, decryptDoc) as RequestMessageBase; base.SpecialDeduplicationAction = (lastMessage, messageHandler) => { //判断特殊事件 if (!messageHandler.MessageIsRepeated && lastMessage is RequestMessageEventBase && messageHandler.RequestMessage is RequestMessageEventBase && (lastMessage as RequestMessageEventBase).Event == (messageHandler.RequestMessage as RequestMessageEventBase).Event ) { var lastEventMessage = lastMessage as RequestMessageEventBase; var currentEventMessage = messageHandler.RequestMessage as RequestMessageEventBase; switch (lastEventMessage.Event) { case Event.user_get_card: //领取事件推送 //文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025274 //问题反馈:https://github.com/JeffreySu/WeiXinMPSDK/issues/1106 var lastGetUserCardMessage = lastMessage as RequestMessageEvent_User_Get_Card; var currentGetUserCardMessage = messageHandler.RequestMessage as RequestMessageEvent_User_Get_Card; if (lastGetUserCardMessage.UserCardCode == currentGetUserCardMessage.UserCardCode && lastGetUserCardMessage.CardId == currentGetUserCardMessage.CardId) { return(true); } break; default: break; } } return(false); }; //消息去重的基本方法已经在基类 CommonInitialize() 中实现 return(decryptDoc); }
/// <summary> /// 分析微信POST到本服务器的XML数据 /// </summary> /// <param name="xmlStream"></param> /// <returns></returns> private string AnalyzeXmlFromWeiXin(HttpContext context) { try { var xmlMsg = RequestMessageFactory.GetRequestEntity(context.Request.InputStream); switch (xmlMsg.MsgType) { case RequestMsgType.Event: //如果是事件 return(OnAttention((RequestMessageEventBase)xmlMsg)); default: return(""); } } catch (Exception ex) { return("分析微信POST到本服务器的XML数据 出错"); } }
public void ConvertEntityToXml_subscribe_msg_popup_eventTest() { var xml = @"<xml> <ToUserName><![CDATA[gh_123456789abc]]></ToUserName> <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName> <CreateTime>1610969440</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe_msg_popup_event]]></Event> <SubscribeMsgPopupEvent> <List> <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId> <SubscribeStatusString><![CDATA[accept]]></SubscribeStatusString> <PopupScene>2</PopupScene> </List> <List> <TemplateId><![CDATA[9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI]]></TemplateId> <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString> <PopupScene>2</PopupScene> </List> </SubscribeMsgPopupEvent> </xml>"; var doc = XDocument.Parse(xml); var requestEntity = RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as RequestMessageEvent_Subscribe_Msg_Popup; Assert.IsNotNull(requestEntity); Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_popup_event"); Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4"); Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent.Count == 2); Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].TemplateId == "9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI"); Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].SubscribeStatusString == "reject"); Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].PopupScene == 2); }
public void ConvertEntityToXmlTest() { var doc = XDocument.Parse(xml); var requestEntity = RequestMessageFactory.GetRequestEntity(doc); { //Text var responseText = ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.Text) as ResponseMessageText; Assert.IsNotNull(responseText); responseText.Content = "新内容"; var responseDoc = EntityHelper.ConvertEntityToXml(responseText); Console.WriteLine(responseDoc.ToString()); Assert.AreEqual("新内容", responseDoc.Root.Element("Content").Value); } { //News var responseNews = ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as ResponseMessageNews; Assert.IsNotNull(responseNews); responseNews.Articles.Add(new Article() { Description = "测试说明", Title = "测试标题", Url = "http://www.senparc.com", PicUrl = "http://img.senparc.com/images/v2/logo.jpg'" }); Assert.AreEqual(1, responseNews.ArticleCount); var responseDoc = EntityHelper.ConvertEntityToXml(responseNews); Console.WriteLine(responseDoc.ToString()); } }
public void ConvertEntityToXml_subscribe_msg_change_eventTest() { var xml = @"<xml> <ToUserName><![CDATA[gh_123456789abc]]></ToUserName> <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName> <CreateTime>1610969440</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe_msg_change_event]]></Event> <SubscribeMsgChangeEvent> <List> <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId> <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString> </List> </SubscribeMsgChangeEvent> </xml>"; var doc = XDocument.Parse(xml); var requestEntity = RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as RequestMessageEvent_Subscribe_Msg_Change; Assert.IsNotNull(requestEntity); Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_change_event"); Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4"); Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent.Count == 1); Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent[0].TemplateId == "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent[0].SubscribeStatusString == "reject"); }
public void ConvertEntityToXml_ImageTest() { var imageXML = @"<?xml version=""1.0"" encoding=""utf-8""?> <xml> <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> <CreateTime>1357996976</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmsns.qpic.cn/mmsns/ZxBXNzgHyUqazGkXUvujSOOHruk6XP5P9984HOCSATlW1orZDlpdCA/0]]></PicUrl> <MsgId>5832552599987382826</MsgId> </xml>"; var doc = XDocument.Parse(imageXML); var requestEntity = RequestMessageFactory.GetRequestEntity(doc) as RequestMessageImage; Assert.IsNotNull(requestEntity); var responseNews = ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as ResponseMessageNews; Assert.IsNotNull(responseNews); responseNews.Articles.Add(new Article() { Description = "测试说明", Title = "测试标题", Url = "http://www.senparc.com", PicUrl = requestEntity.PicUrl }); Assert.AreEqual(1, responseNews.ArticleCount); var responseDoc = EntityHelper.ConvertEntityToXml(responseNews); Console.WriteLine(responseDoc.ToString()); Assert.AreEqual(requestEntity.PicUrl, responseDoc.Root.Element("Articles").Elements("item").First().Element("PicUrl").Value); }
private void Init(XDocument requestDocument) { this.RequestDocument = requestDocument; this.RequestMessage = RequestMessageFactory.GetRequestEntity(this.RequestDocument); }
/// <summary> /// 初始化 /// </summary> /// <param name="postDataDocument"></param> /// <param name="postData"></param> /// <returns></returns> public override XDocument Init(XDocument postDataDocument, object postData = null) { //进行加密判断并处理 _postModel = postData as PostModel; var postDataStr = postDataDocument.ToString(); XDocument decryptDoc = postDataDocument; if (_postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value)) { //使用了加密 UsingEcryptMessage = true; EcryptRequestDocument = postDataDocument; WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return(null); } if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value)) { //TODO:使用了兼容模式,进行验证即可 UsingCompatibilityModelEcryptMessage = true; } decryptDoc = XDocument.Parse(msgXml);//完成解密 } RequestMessage = RequestMessageFactory.GetRequestEntity(decryptDoc); if (UsingEcryptMessage) { RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value; } //TODO:分布式系统中本地的上下文会有同步问题,需要同步使用远程的储存 if (MessageContextGlobalConfig.UseMessageContext) { var omit = OmitRepeatedMessageFunc == null || OmitRepeatedMessageFunc(RequestMessage); lock (MessageContextGlobalConfig.OmitRepeatLock)//TODO:使用分布式锁 { #region 消息去重 if (omit && OmitRepeatedMessage && CurrentMessageContext.RequestMessages.Count > 0 //&& !(RequestMessage is RequestMessageEvent_Merchant_Order)批量订单的MsgId可能会相同 ) { //lastMessage必定有值(除非极端小的过期时间条件下,几乎不可能发生) var lastMessage = CurrentMessageContext.RequestMessages[CurrentMessageContext.RequestMessages.Count - 1]; if ( //使用MsgId去重 (lastMessage.MsgId != 0 && lastMessage.MsgId == RequestMessage.MsgId) || //使用CreateTime去重(OpenId对象已经是同一个) (lastMessage.MsgId == RequestMessage.MsgId && lastMessage.CreateTime == RequestMessage.CreateTime && lastMessage.MsgType == RequestMessage.MsgType) ) { MarkRepeatedMessage();//标记为已重复 } //判断特殊事件 if (!MessageIsRepeated && lastMessage is RequestMessageEventBase && RequestMessage is RequestMessageEventBase && (lastMessage as RequestMessageEventBase).Event == (RequestMessage as RequestMessageEventBase).Event ) { var lastEventMessage = lastMessage as RequestMessageEventBase; var currentEventMessage = RequestMessage as RequestMessageEventBase; switch (lastEventMessage.Event) { case Event.user_get_card: //领取事件推送 //文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025274 //问题反馈:https://github.com/JeffreySu/WeiXinMPSDK/issues/1106 var lastGetUserCardMessage = lastMessage as RequestMessageEvent_User_Get_Card; var currentGetUserCardMessage = RequestMessage as RequestMessageEvent_User_Get_Card; if (lastGetUserCardMessage.UserCardCode == currentGetUserCardMessage.UserCardCode && lastGetUserCardMessage.CardId == currentGetUserCardMessage.CardId) { MarkRepeatedMessage(); //标记为已重复 } break; default: break; } } } #endregion //在消息没有被去重的情况下记录上下文 if (!MessageIsRepeated) { GlobalMessageContext.InsertMessage(RequestMessage); } } } return(decryptDoc); }
public ActionResult OldPost(string signature, string timestamp, string nonce, string echostr) { LocationService locationService = new LocationService(); EventService eventService = new EventService(); if (!CheckSignature.Check(signature, timestamp, nonce, Token)) { return(Content("参数错误!")); } XDocument requestDoc = null; try { requestDoc = XDocument.Load(Request.InputStream); var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc); //如果不需要记录requestDoc,只需要: //var requestMessage = RequestMessageFactory.GetRequestEntity(Request.InputStream); requestDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + requestMessage.FromUserName + ".txt"));//测试时可开启,帮助跟踪数据 ResponseMessageBase responseMessage = null; switch (requestMessage.MsgType) { case RequestMsgType.Text: //文字 { //TODO:交给Service处理具体信息,参考/Service/EventSercice.cs 及 /Service/LocationSercice.cs var strongRequestMessage = requestMessage as RequestMessageText; var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as ResponseMessageText; strongresponseMessage.Content = string.Format( "您刚才发送了文字信息:{0}\r\n您还可以发送【位置】【图片】【语音】等类型的信息,查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com", strongRequestMessage.Content); responseMessage = strongresponseMessage; break; } case RequestMsgType.Location: //位置 { responseMessage = locationService.GetResponseMessage(requestMessage as RequestMessageLocation); break; } case RequestMsgType.Image: //图片 { //TODO:交给Service处理具体信息 var strongRequestMessage = requestMessage as RequestMessageImage; var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.News) as ResponseMessageNews; strongresponseMessage.Articles.Add(new Article() { Title = "您刚才发送了图片信息", Description = "您发送的图片将会显示在边上", PicUrl = strongRequestMessage.PicUrl, Url = "http://weixin.senparc.com" }); strongresponseMessage.Articles.Add(new Article() { Title = "第二条", Description = "第二条带连接的内容", PicUrl = strongRequestMessage.PicUrl, Url = "http://weixin.senparc.com" }); responseMessage = strongresponseMessage; break; } case RequestMsgType.Voice: //语音 { //TODO:交给Service处理具体信息 var strongRequestMessage = requestMessage as RequestMessageVoice; var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Music) as ResponseMessageMusic; strongresponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; responseMessage = strongresponseMessage; break; } case RequestMsgType.Event: //事件 { responseMessage = eventService.GetResponseMessage(requestMessage as RequestMessageEventBase); break; } default: throw new ArgumentOutOfRangeException(); } var responseDoc = MP.Helpers.EntityHelper.ConvertEntityToXml(responseMessage); responseDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + responseMessage.ToUserName + ".txt"));//测试时可开启,帮助跟踪数据 return(Content(responseDoc.ToString())); //如果不需要记录responseDoc,只需要: //return Content(responseMessage.ConvertEntityToXmlString()); } catch (Exception ex) { using ( TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt"))) { tw.WriteLine(ex.Message); tw.WriteLine(ex.InnerException.Message); if (requestDoc != null) { tw.WriteLine(requestDoc.ToString()); } tw.Flush(); tw.Close(); } return(Content("")); } }