//<?xml version="1.0" encoding="utf-8"?> //<xml> // <ToUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></ToUserName> // <FromUserName><![CDATA[gh_a96a4a619366]]></FromUserName> // <CreateTime>63497820384</CreateTime> // <MsgType>text</MsgType> // <Content><![CDATA[您刚才发送了文字信息:中文 //您还可以发送【位置】【图片】【语音】信息,查看不同格式的回复。 //SDK官方地址:https://sdk.weixin.senparc.com]]></Content> // <FuncFlag>0</FuncFlag> //</xml> /// <summary> /// 获取XDocument转换后的IResponseMessageBase实例(通常在反向读取日志的时候用到)。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IResponseMessageBase GetResponseEntity(XDocument doc) { ResponseMessageBase responseMessage = null; ResponseMsgType msgType; try { msgType = MsgTypeHelper.GetResponseMsgType(doc); switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; case ResponseMsgType.Transfer_Customer_Service: responseMessage = new ResponseMessageTransfer_Customer_Service(); break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在ResponseMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException()); } Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(responseMessage, doc); } catch (ArgumentException ex) { throw new WeixinException(string.Format("ResponseMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); } return(responseMessage); }
public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage) { BaiYeMapItem mapInfo = this.service.GetMapInfoByGPS("来自用户提交的位置", Convert.ToSingle(requestMessage.Location_Y.ToString()), Convert.ToSingle(requestMessage.Location_X.ToString()), false); StringBuilder stringBuilder = new StringBuilder(); if (mapInfo != null) { return(build.GetMapItemShow(mapInfo, requestMessage)); } stringBuilder.Append("未找到地图,望见谅。建议输入关键词为详细的地名,包含门牌号或者专有地名等,会提高查询的成功率"); ResponseMessageText expr_6D = base.CreateResponseMessage <ResponseMessageText>(); expr_6D.Content = stringBuilder.ToString(); return(expr_6D); }
private ResponseMessageText WechatEventMsgHandler(RequestMessageEventBase request) { ResponseMessageText responseMessage = null; switch (request.Event) { case Event.VIEW: // var viewRequest = request as RequestMessageEvent_View; LogHelper.Logger.Debug("点击菜单跳转链接时的事件推送"); responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request); responseMessage.Content = "正在获取您的账号信息,请稍等..."; break; case Event.subscribe: responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request); var msgInfo = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "subscribe"); if (msgInfo != null) { responseMessage.Content = msgInfo.ResponseMsg; } else { responseMessage.Content = "欢迎关注彩盟网"; } break; case Event.CLICK: var request_click = request as RequestMessageEvent_Click; responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request_click); var respMsg = "欢迎关注彩盟网,我们为您提供了最准确,最齐全的彩票分析计划"; if (request_click.EventKey == WeChatConfig.MENU_SUB_CLICK_HELP) { var msgInfo1 = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "help"); if (msgInfo1 != null) { respMsg = msgInfo1.ResponseMsg; } } responseMessage.Content = respMsg; break; default: responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request); responseMessage.Content = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "default").ResponseMsg; break; } return(responseMessage); }
public override ResponseMessageBase GetResponseEntityMappingResult(ResponseMsgType responseMsgType, XDocument doc = null) { ResponseMessageBase responseMessage = null; switch (responseMsgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; default: throw new Exception("未定义此类型:" + responseMsgType); } return(responseMessage); }
/// <summary> /// 获取响应类型实例,并初始化 /// </summary> /// <param name="msgType">响应类型</param> /// <returns></returns> private static IResponseMessageBase CreateFromRequestMessage(ResponseMsgType msgType) { IResponseMessageBase result = null; try { switch (msgType) { case ResponseMsgType.Text: result = new ResponseMessageText(); break; case ResponseMsgType.News: result = new ResponseMessageNews(); break; case ResponseMsgType.Music: result = new ResponseMessageMusic(); break; case ResponseMsgType.Image: result = new ResponseMessageImage(); break; case ResponseMsgType.Voice: result = new ResponseMessageVoice(); break; case ResponseMsgType.Video: result = new ResponseMessageVideo(); break; default: if (msgType != ResponseMsgType.NoResponse) { throw new Exception(string.Format("ResponseMsgType没有为 {0} 提供对应处理程序。", msgType), new ArgumentOutOfRangeException()); } result = new ResponseMessageBase(); break; } } catch (Exception inner) { throw new Exception("ResponseMessageFactory.CreateFromRequestMessage过程发生异常", inner); } return(result); }
/// <summary> /// 获取响应类型实例,并初始化 /// </summary> /// <param name="requestMessage">请求</param> /// <param name="msgType">响应类型</param> /// <returns></returns> private static ResponseMessageBase CreateFromRequestMessage(RequestMessageBase requestMessage, ResponseMsgType msgType) { ResponseMessageBase responseMessage = null; try { switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; default: throw new UnknownRequestMsgTypeException(string.Format("ResponseMsgType没有为 {0} 提供对应处理程序。", msgType), new ArgumentOutOfRangeException()); } responseMessage.ToUserName = requestMessage.FromUserName; responseMessage.FromUserName = requestMessage.ToUserName; responseMessage.CreateTime = DateTime.Now; //使用当前最新时间 } catch (Exception ex) { throw new WeiXinException("CreateFromRequestMessage过程发生异常", ex); } return(responseMessage); }
/// <summary> /// ResponseMessageBase.CreateFromResponseXml(xml)的扩展方法 /// 从返回结果XML转换成IResponseMessageBase实体类 /// </summary> /// <param name="xml">返回给服务器的Response Xml</param> /// <returns></returns> public static ResponseMessageBase CreateResponseMessage(this string xml) { try { if (string.IsNullOrEmpty(xml)) { return(null); } var doc = XDocument.Parse(xml); ResponseMessageBase responseMessage = null; var msgType = (ResponseMsgType)Enum.Parse(typeof(ResponseMsgType), doc.Root.Element("MsgType").Value, true); switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; } responseMessage.FillEntityWithXml(doc); return(responseMessage); } catch (Exception ex) { throw new WeiXinException("ResponseMessageBase.CreateFromResponseXml<T>过程发生异常!" + ex.Message, ex); } }
public async Task <bool> OnLinkMessageReceived(object sender, LinkMessageReceivedEventArgs e) { _logger.LogInformation($"OnLinkMessageReceived: {e.Url}"); var messageHandler = sender as WeixinMessageHandler; var responseMessage = new ResponseMessageText(); responseMessage.FromUserName = e.ToUserName; responseMessage.ToUserName = e.FromUserName; responseMessage.Content = string.Format(@"您发送了一条链接信息: Title:{0} Description:{1} Url:{2}", e.Title, e.Description, e.Url); await messageHandler.WriteAsync(responseMessage); return(true); }
public override IResponseMessageBase OnTextOrEventRequest(RequestMessageText requestMessage) { // 预处理文字或事件类型请求。 // 这个请求是一个比较特殊的请求,通常用于统一处理来自文字或菜单按钮的同一个执行逻辑, // 会在执行OnTextRequest或OnEventRequest之前触发,具有以下一些特征: // 1、如果返回null,则继续执行OnTextRequest或OnEventRequest // 2、如果返回不为null,则终止执行OnTextRequest或OnEventRequest,返回最终ResponseMessage // 3、如果是事件,则会将RequestMessageEvent自动转为RequestMessageText类型,其中RequestMessageText.Content就是RequestMessageEvent.EventKey ResponseMessageText strongResponseMessage = null; switch (requestMessage.Content) { //case "PushCarInfo": // strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); // strongResponseMessage.Content = "您点击了发布车辆信息按钮。制作跳转发布信息页面!"; // return strongResponseMessage; case "PushWorkInfo": strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了发布用工信息按钮。制作跳转发布信息页面!"; return(strongResponseMessage); case "GetCarInfo": strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了查看车辆信息按钮。查找所有空闲车辆并展示信息!"; return(strongResponseMessage); case "GetWorkInfo": strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了查看用工信息按钮。查找所有空闲人工并展示信息!"; return(strongResponseMessage); case "GetMoney": strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了快速贷款按钮。请填写资料进行贷款!"; return(strongResponseMessage); case "MJPlay": strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了棋牌游戏按钮。点击此处进入游戏!"; return(strongResponseMessage); } return(null);//返回null,则继续执行OnTextRequest或OnEventRequest }
private ResponseMessageText WechatTextMsgHandler(RequestMessageText requestMessage) { ResponseMessageText strongresponseMessage = null; var msgInfo = _wechatMsgRepository.GetAll().FirstOrDefault(p => p.KeyWord.Contains(requestMessage.Content)); if (msgInfo == null) { strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(requestMessage); strongresponseMessage.Content = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "default").ResponseMsg; return(strongresponseMessage); } strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(requestMessage); strongresponseMessage.Content = msgInfo.Sid == null ? msgInfo.ResponseMsg : GetLotteryPlanByCode(msgInfo); return(strongresponseMessage); }
public static ResponseMessageBase CreateFromRequestMessage(IRequestMessageBase requestMessage, WeixinResponseMsgType msgType) { ResponseMessageBase responseMessage = null; switch (msgType) { case WeixinResponseMsgType.Text: responseMessage = new ResponseMessageText() { ToUserName = requestMessage.FromUserName, FromUserName = requestMessage.ToUserName, CreateTime = requestMessage.CreateTime, //这个时间不是Ticks,用DateTime.Now会出错 MsgType = msgType }; break; case WeixinResponseMsgType.News: responseMessage = new ResponseMessageNews() { ToUserName = requestMessage.FromUserName, FromUserName = requestMessage.ToUserName, CreateTime = requestMessage.CreateTime, MsgType = msgType }; break; case WeixinResponseMsgType.Event: responseMessage = new ResponseMessageNews() { ToUserName = requestMessage.FromUserName, FromUserName = requestMessage.ToUserName, CreateTime = requestMessage.CreateTime, MsgType = msgType }; break; default: throw new ArgumentOutOfRangeException("msgType"); } return(responseMessage); }
public async Task <bool> OnTextMessageReceived(object sender, TextMessageReceivedEventArgs e) { _logger.LogDebug(XmlConvert.SerializeObject(e)); var messageHandler = sender as WeixinMessageHandler; var responseMessage = new ResponseMessageText(); { var result = new StringBuilder(); result.AppendFormat("您刚才发送了文本信息:{0}", e.Content); responseMessage.FromUserName = e.ToUserName; responseMessage.ToUserName = e.FromUserName; responseMessage.Content = result.ToString(); } await messageHandler.WriteAsync(responseMessage); _logger.LogDebug(XmlConvert.SerializeObject(responseMessage)); return(true); }
/// <summary> /// 从返回结果XML转换成IResponseMessageBase实体类(通常在反向读取日志的时候用到)。 /// </summary> /// <returns></returns> public static IResponseMessageBase GetResponseEntity(XDocument doc) { ResponseMessageBase val = null; try { ResponseMsgType responseMsgType = MsgTypeHelper.GetResponseMsgType(doc); switch (responseMsgType) { case ResponseMsgType.Text: val = new ResponseMessageText(); break; case ResponseMsgType.Image: val = new ResponseMessageImage(); break; case ResponseMsgType.Voice: val = new ResponseMessageVoice(); break; case ResponseMsgType.Video: val = new ResponseMessageVideo(); break; case ResponseMsgType.Music: val = new ResponseMessageMusic(); break; case ResponseMsgType.News: val = new ResponseMessageNews(); break; } val.FillEntityWithXml <ResponseMessageBase>(doc); return(val); } catch (Exception ex) { throw new Exception($"ResponseMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", ex); } }
public ResponseMessageText SetNotice(string openId, string key) { ResponseMessageText response = null; try { ScanModel lcode = RedisUtil.Get <ScanModel>("wxbindSessionID:" + key); if (lcode == null) { return(response); } lcode.userInfo = UserApi.Info(appId, openId, Language.zh_CN); lcode.isUse = 0; RedisUtil.Set <ScanModel>("wxbindSessionID:" + key, lcode, TimeSpan.FromMinutes(3)); } catch (Exception ex) { log4net.LogHelper.WriteError(this.GetType(), ex); } return(response); }
/// <summary> /// 处理应答链的结果,转为SDK的结果 /// </summary> private IResponseMessageBase ResponseChainRequest_LevelForNode_ResultHandler(RC.IResponseMessage ret) { //根据应答链的处理结果,构造微信SDK的结果 IResponseMessageBase result = null; if (ret is RC.ResponseTextMessage) { ResponseMessageText result_text = base.CreateResponseMessage <ResponseMessageText>(); result_text.Content = ((RC.ResponseTextMessage)ret).Context; result = result_text; } else if (ret is RC.ResponseNewsResult) { ResponseMessageNews result_text = base.CreateResponseMessage <ResponseMessageNews>(); result_text.Articles = new System.Collections.Generic.List <Article>(); foreach (RC.ArticleCan item in ((RC.ResponseNewsResult)ret).ArticleList) { result_text.Articles.Add(new Article { Description = item.Description, PicUrl = item.PicUrl, Title = item.Title, Url = item.Url }); } result = result_text; } else if (ret is RC.ResponseArtificialCustomerResultMessage) { string[] accountList = ((RC.ResponseArtificialCustomerResultMessage)ret).AccountList; return(GetArtificialCustomerService(accountList)); } else if (ret is RC.ResponseRawResult) { result = this.ResponseChainRequest_LevelForNode_RawResultHandler((RC.ResponseRawResult)ret); } //返回结果 return(result); }
/// <summary> /// 根据请求内容处理微信消息 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public ResponseMessageText MsgHandlerByRequestContent(IRequestMessageBase requestMessage) { ResponseMessageText responseMessage = null; switch (requestMessage.MsgType) { case RequestMsgType.Text: //文字类型 var requestMsgText = requestMessage as RequestMessageText; responseMessage = WechatTextMsgHandler(requestMsgText); break; //响应事件 case RequestMsgType.Event: var request = requestMessage as RequestMessageEventBase; responseMessage = WechatEventMsgHandler(request); break; default: LogHelper.Logger.Error("该消息并非文字类型消息,请求内容为:" + requestMessage.ToJson()); throw new Exception("暂不支持其他类型的消息处理"); } return(responseMessage); }
/// <summary> /// 处理语音请求 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage) { //var responseMessage = CreateResponseMessage<ResponseMessageMusic>(); ////上传缩略图 //var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret); //var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, // Server.GetMapPath("~/Images/Logo.jpg")); ////设置音乐信息 //responseMessage.Music.Title = "天籁之音"; //responseMessage.Music.Description = "播放您上传的语音"; //responseMessage.Music.MusicUrl = "http://www.w3ccloud.com/Media/GetVoice?mediaId=" + requestMessage.MediaId; //responseMessage.Music.HQMusicUrl = "http://www.w3ccloud.com/Media/GetVoice?mediaId=" + requestMessage.MediaId; //responseMessage.Music.ThumbMediaId = uploadResult.media_id; //return responseMessage; try { string token = WeiXinUtils.tryGetAccessToken(); string wxMediaUrl = WxApiUrl.mediaDown(token, requestMessage.MediaId); string url = WeiXinUtils.downloadFile(wxMediaUrl, "/image-lib", Guid.NewGuid().ToString()); string path = System.AppDomain.CurrentDomain.BaseDirectory + @"image-lib\" + Guid.NewGuid().ToString() + "." + requestMessage.MsgType; ResponseMessageVoice responseMessage = CreateResponseMessage <ResponseMessageVoice>(); responseMessage.Voice.MediaId = requestMessage.MediaId; return(responseMessage); } catch (Exception e) { ResponseMessageText responseMessage = CreateResponseMessage <ResponseMessageText>(); responseMessage.Content = "您发送了一条语音信息,ID:" + requestMessage.MediaId + requestMessage.Recognition + "\r\n" + e.Message + "\r\n" + e.StackTrace; return(responseMessage); } }
public async Task <bool> OnTextMessageReceived(object sender, TextMessageReceivedEventArgs e) { _logger.LogDebug(XmlConvert.SerializeObject(e)); var msg = new ReceivedTextMessage(); msg.Content = e.Content; msg.From = e.FromUserName; msg.To = e.ToUserName; msg.ReceivedTime = new DateTimeOffset(WeixinTimestampHelper.ToUtcTime(e.CreateTimeStr)); _db.ReceivedTextMessages.Add(msg); var saveResult = await _db.SaveChangesAsync(); if (saveResult > 0) { _logger.LogDebug($"已将微信文本消息存入数据库。Result:{saveResult}, From:{msg.From}, To:{msg.To}, Time:{msg.ReceivedTime}, Content:{msg.Content}"); } _logger.LogDebug($"微信文本消息在数据库中共{_db.ReceivedTextMessages.ToList().Count()}条记录。"); var messageHandler = sender as WeixinMessageHandler; var responseMessage = new ResponseMessageText(); { var result = new StringBuilder(); result.AppendFormat("您刚才发送了文本信息:{0}", e.Content); responseMessage.FromUserName = e.ToUserName; responseMessage.ToUserName = e.FromUserName; responseMessage.Content = result.ToString(); } await messageHandler.WriteAsync(responseMessage); _logger.LogDebug(XmlConvert.SerializeObject(responseMessage)); return(true); }
public void OnTextRequest_Senparc调试(RequestMessageText requestMessage, ref ResponseMessageText responseMessage) { if (requestMessage.Content == null) { } else if (requestMessage.Content == "约束") { responseMessage.Content = "<a href=\"http://weixin.senparc.com/FilterTest/\">点击这里</a>进行客户端约束测试(地址:http://weixin.senparc.com/FilterTest/)。"; } else if (requestMessage.Content == "托管" || requestMessage.Content == "代理") { //开始用代理托管,把请求转到其他服务器上去,然后拿回结果 //甚至也可以将所有请求在DefaultResponseMessage()中托管到外部。 DateTime dt1 = DateTime.Now; //计时开始 var responseXml = MessageAgent.RequestXml(this, agentUrl, agentToken, RequestDocument.ToString()); //获取返回的XML //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); /* 如果有WeiweihiKey,可以直接使用下面的这个MessageAgent.RequestWeiweihiXml()方法。 * WeiweihiKey专门用于对接www.weiweihi.com平台,获取方式见:http://www.weiweihi.com/ApiDocuments/Item/25#51 */ //var responseXml = MessageAgent.RequestWeiweihiXml(weiweihiKey, RequestDocument.ToString());//获取Weiweihi返回的XML DateTime dt2 = DateTime.Now; //计时结束 //转成实体。 /* 如果要写成一行,可以直接用: * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); * 或 * */ responseMessage = responseXml.CreateResponseMessage() as ResponseMessageText; responseMessage.Content += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } else if (requestMessage.Content == "测试" || requestMessage.Content == "退出") { /* * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(http://www.weiweihi.com/User/App/Detail/1), * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。 */ if (requestMessage.Content == "测试") { //进入APP测试 responseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。"; } else { //退出APP测试 responseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。"; } } else if (requestMessage.Content == "AsyncTest") { //异步并发测试(提供给单元测试使用) DateTime begin = DateTime.Now; int t1, t2, t3; System.Threading.ThreadPool.GetAvailableThreads(out t1, out t3); System.Threading.ThreadPool.GetMaxThreads(out t2, out t3); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4)); DateTime end = DateTime.Now; var thread = System.Threading.Thread.CurrentThread; responseMessage.Content = string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}", thread.ManagedThreadId, HttpContext.Current != null ? HttpContext.Current.ApplicationInstance.GetHashCode() : -1, begin, end, t2 - t1 ); } else { var result = new StringBuilder(); result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content); if (CurrentMessageContext.RequestMessages.Count > 1) { result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count, CurrentMessageContext.StorageData); for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--) { var historyMessage = CurrentMessageContext.RequestMessages[i]; result.AppendFormat("{0} 【{1}】{2}\r\n", historyMessage.CreateTime.ToShortTimeString(), historyMessage.MsgType.ToString(), (historyMessage is RequestMessageText) ? (historyMessage as RequestMessageText).Content : "[非文字类型]" ); } result.AppendLine("\r\n"); } result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n", WeixinContext.ExpireMinutes, WeixinContext.MaxRecordCount); result.AppendLine("\r\n"); result.AppendLine( "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com"); responseMessage.Content = result.ToString(); } }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase base2 = null; switch (requestMessage.EventKey) { case "lobby": return(this.GetUrlResponse(requestMessage.FromUserName)); case "OneClick": { ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>(); base2 = text; text.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; return(base2); } case "SubClickRoot_Text": { ResponseMessageText text2 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text2; text2.Content = "您点击了子菜单按钮。"; return(base2); } case "SubClickRoot_News": { ResponseMessageNews news = base.CreateResponseMessage <ResponseMessageNews>(); base2 = news; Article item = new Article { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "http://sdk.weixin.senparc.com" }; news.Articles.Add(item); return(base2); } case "SubClickRoot_Music": { UploadTemporaryMediaResult result = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.thumb, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710); ResponseMessageMusic music = base.CreateResponseMessage <ResponseMessageMusic>(); base2 = music; music.Music.Title = "天籁之音"; music.Music.Description = "真的是天籁之音"; music.Music.MusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; music.Music.HQMusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; music.Music.ThumbMediaId = result.thumb_media_id; return(base2); } case "SubClickRoot_Image": { UploadTemporaryMediaResult result2 = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.image, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710); ResponseMessageImage image = base.CreateResponseMessage <ResponseMessageImage>(); base2 = image; image.Image.MediaId = result2.media_id; return(base2); } case "OAuth": { ResponseMessageNews news2 = base.CreateResponseMessage <ResponseMessageNews>(); Article article2 = new Article { Title = "OAuth2.0测试", Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。" }; news2.Articles.Add(article2); Article article3 = new Article { Title = "OAuth2.0测试(不带returnUrl),测试环境可使用", Description = "OAuth2.0测试(不带returnUrl)", Url = "http://sdk.weixin.senparc.com/oauth2", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }; news2.Articles.Add(article3); string url = "/OAuth2/TestReturnUrl"; Article article4 = new Article { Title = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用", Description = "OAuth2.0测试(带returnUrl)", Url = "http://sdk.weixin.senparc.com/oauth2?returnUrl=" + url.UrlEncode(), PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }; news2.Articles.Add(article4); return(news2); } case "Description": { ResponseMessageText text3 = base.CreateResponseMessage <ResponseMessageText>(); text3.Content = this.GetWelcomeInfo(); return(text3); } case "SubClickRoot_PicPhotoOrAlbum": { ResponseMessageText text4 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text4; text4.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; return(base2); } case "SubClickRoot_ScancodePush": { ResponseMessageText text5 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text5; text5.Content = "您点击了【微信扫码】按钮。"; return(base2); } case "ConditionalMenu_Male": { ResponseMessageText text6 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text6; text6.Content = "您点击了个性化菜单按钮,您的微信性别设置为:男。"; return(base2); } case "ConditionalMenu_Femle": { ResponseMessageText text7 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text7; text7.Content = "您点击了个性化菜单按钮,您的微信性别设置为:女。"; return(base2); } } ResponseMessageText text8 = base.CreateResponseMessage <ResponseMessageText>(); text8.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey; return(text8); }
public IResponseMessageBase AutoReply(RequestMessageText requestMessage) { IResponseMessageBase base2 = null; try { string content = requestMessage.Content; if (this.rules == null) { return(base2); } foreach (KeywordAutoReplyInfo_Item item in this.rules.keyword_autoreply_info.list) { ReplyListInfoItem item3; ResponseMessageNews news; bool flag = false; foreach (KeywordListInfoItem item2 in item.keyword_list_info) { if (((item2.match_mode == AutoReplyMatchMode.equal) && (content == item2.content)) || ((item2.match_mode == AutoReplyMatchMode.contain) && content.Contains(item2.content))) { flag = true; break; } } if (flag) { item3 = item.reply_list_info[0]; switch (item3.type) { case AutoReplyType.text: { ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>(); text.Content = item3.content; base2 = text; break; } case AutoReplyType.news: goto Label_00EA; } } continue; Label_00EA: news = base.CreateResponseMessage <ResponseMessageNews>(); foreach (NewsInfoItem item4 in item3.news_info.list) { Article article = new Article { Title = item4.title, Description = item4.digest, PicUrl = item4.cover_url, Url = item4.content_url }; news.Articles.Add(article); } base2 = news; } if ((base2 == null) && !string.IsNullOrEmpty(this.rules.message_default_autoreply_info.content)) { ResponseMessageText text2 = base.CreateResponseMessage <ResponseMessageText>(); text2.Content = this.rules.message_default_autoreply_info.content; base2 = text2; } } catch { } return(base2); }
//加载文件 private static void LoadConfig() { var tempResponse = new List <ResponseModel>(); var xml = new XmlDocument(); xml.Load(ConfigFile); var items = xml.SelectNodes("/Events/Item"); for (var i = 0; i < items.Count; i++) { var strType = (from XmlNode node in items[i].ChildNodes where node.Name == "MsgType" select node.InnerText).FirstOrDefault(); if (strType == null) { throw new Exception("responseMessage.xml文件配置有误 MsgType 不能为空!"); } ResponseMsgType msgType; if (!Enum.TryParse(strType, true, out msgType)) { throw new Exception("responseMessage.xml文件配置有误 MsgType 不属于指定的类型!"); } IResponseMessageBase responseMessage; switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText { Content = (from XmlNode node in items[i].ChildNodes where node.Name == "Content" select node.InnerText).FirstOrDefault() }; break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage { Image = new Image { MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice { Voice = new Voice { MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo { Video = new Video { Title = (from XmlNode node in items[i].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault(), Description = (from XmlNode node in items[i].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic { Music = new Music { Description = (from XmlNode node in items[i].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), HQMusicUrl = (from XmlNode node in items[i].ChildNodes where node.Name == "HQMusicUrl" select node.InnerText).FirstOrDefault(), MusicUrl = (from XmlNode node in items[i].ChildNodes where node.Name == "MusicUrl" select node.InnerText).FirstOrDefault(), ThumbMediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "ThumbMediaId" select node.InnerText).FirstOrDefault(), Title = (from XmlNode node in items[i].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.News: var selects = items[i].SelectNodes("Article"); var articles = new List <Article>(); for (var j = 0; j < selects.Count; j++) { var url = ( from XmlNode node in selects[j].ChildNodes where node.Name == "Url" select node.InnerText).FirstOrDefault(); articles.Add(new Article { Description = (from XmlNode node in selects[j].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), PicUrl = (from XmlNode node in selects[j].ChildNodes where node.Name == "PicUrl" select node.InnerText).FirstOrDefault(), Title = (from XmlNode node in selects[j].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault(), //Url = WeixinCommon.GetAuthorizeUserInfoUrl(url) Url = url }); } responseMessage = new ResponseMessageNews { Articles = articles }; break; default: continue; } var eventKey = (from XmlNode node in items[i].ChildNodes where node.Name == "EventKey" select node.InnerText).FirstOrDefault(); tempResponse.Add(new ResponseModel { EventKey = eventKey, MsgType = msgType, ResponseMessage = responseMessage }); } _responseList = tempResponse; _isChanging = false; }
public ActionResult PostQuickResponse(string openId, List <NewsInfoView> newsList) { try { var news = newsList[0]; if ("video".Equals(news.NewsCate)) { news.ImageContent = SaveBase64ImageToServer(news.ImageContent); } SysWechatConfig wechat = WeChatCommonService.lstSysWeChatConfig.Find(p => p.Id == news.AppId && !p.IsCorp.Value); if (wechat == null) { return(Json(new { results = new { Data = 500 } })); } ResponseMessageBase response = null; var lstArticles = GetArticleList(newsList, false, news.NewsCate, null, false); //发送消息 WechatCommonMP.SendMsg(news.NewsCate, "", lstArticles, "", new string[] { openId }, null, true); switch (news.NewsCate) { case "text": response = new ResponseMessageText() { Content = news.NewsContent }; //returnResult = CustomApi.SendText(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.NewsContent); break; case "news": //var lstArticles = GetArticleList(newsList, false); //List<NewsModel> articles = new List<NewsModel>(); //string host = CommonService.GetSysConfig("Content Server", ""); //if (host.EndsWith("/")) //{ // host = host.Substring(0, host.Length - 1); //} //for (int i = 0; i < lstArticles.Count; i++) //{ // var item = lstArticles[i]; // var filePath = Server.MapPath("~/") + item.ImageCoverUrl.Insert(item.ImageCoverUrl.LastIndexOf('.'), "_T"); // if (0 == i) // { // filePath = filePath.Replace("_T", "_B"); // } // var ret0 = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(wechat.WeixinAppId, wechat.WeixinCorpSecret, Weixin.MP.UploadMediaFileType.thumb, filePath); // var picUrl = (host + item.ImageCoverUrl).Replace("\\", "/"); // var url = string.Format("{0}/MPNews/ArticleInfo/WxDetail/{1}?wechatid={2}&isPreview={3}", host, item.Id, item.AppId, false); // articles.Add(new NewsModel() { title = item.ArticleTitle, content = WechatCommonMP.ImageConvert(item.ArticleContent, wechat.Id), thumb_url = picUrl, thumb_media_id = ret0.thumb_media_id, content_source_url = url }); //} //var ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryNews(wechat.WeixinAppId, wechat.WeixinCorpSecret, 10000, articles.ToArray()); //returnResult = CustomApi.SendMpNews(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, ret.media_id); string _newsHost = Infrastructure.Web.Domain.Service.CommonService.GetSysConfig("WeChatUrl", ""); response = new ResponseMessageNews() { Articles = lstArticles.Select(a => new Article() { Title = a.ArticleTitle, Url = string.Format("{0}/{3}/ArticleInfo/wxdetail/{1}?wechatid={2}&isAutoReply={4}", _newsHost, a.Id, news.AppId, "mpnews", 0),// _newsHost + "/News/ArticleInfo/wxdetail/" + a.Id + "?wechatid=" + appId, PicUrl = _newsHost + a.ImageCoverUrl, Description = a.ArticleComment }).ToList() }; break; case "image": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.IMAGE, news, news.AppId); //returnResult = CustomApi.SendImage(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId); response = new ResponseMessageImage() { Image = new Weixin.Entities.Image() { MediaId = news.MediaId } }; break; case "video": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.VIDEO, news, news.AppId); ////var ret1 = Innocellence.Weixin.MP.AdvancedAPIs.GroupMessageApi.GetOpenIdVideoMediaIdResult(wechat.WeixinAppId, wechat.WeixinCorpSecret, news.MediaId, news.NewsTitle, news.NewsComment); ////news.MediaId = ret1.media_id; ////news.MediaCreateTime = ret1.created_at; //returnResult = CustomApi.SendVideo(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId, news.NewsTitle, news.NewsComment); response = new ResponseMessageVideo() { Video = new Video() { MediaId = news.MediaId } }; break; case "voice": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.VOICE, news, news.AppId); //returnResult = CustomApi.SendVoice(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId); response = new ResponseMessageVoice() { Voice = new Voice() { MediaId = news.MediaId } }; break; default: throw new Exception("Invalid media type."); } //var user = _WechatMPUserService.GetUserByOpenId(openId); response.ToUserName = openId; var task = _WeChatUserRequestMessageLogHandler.WriteResponseLogMP(new List <Innocellence.Weixin.Entities.IResponseMessageBase> { response }, news.AppId.ToString(), false); return(Json(new { results = new { Data = 200, Object = task.Result } })); } catch (Exception e) { _Logger.Error(e, "An error occurred while PostQuickResponse."); return(Json(new { results = new { Data = 500, Message = e.Message } })); } }
public void GetResponseEntityTest() { { //Text ResponseMessageText exceptResult = new ResponseMessageText() { ToUserName = "******", FromUserName = "******", CreateTime = DateTimeHelper.GetDateTimeFromXml(63497820384), //MsgType = ResponseMsgType.Text, Content = "文字信息", //FuncFlag = false }; var result = ResponseMessageFactory.GetResponseEntity(xmlText) as ResponseMessageText; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); Assert.AreEqual(exceptResult.Content, result.Content); } { //Image ResponseMessageNews exceptResult = new ResponseMessageNews() { //Articles = new List<Article>(), CreateTime = DateTimeHelper.GetDateTimeFromXml(63497821905), FromUserName = "******", ToUserName = "******", //FuncFlag = false, //MsgType = ResponseMsgType.News }; var result = ResponseMessageFactory.GetResponseEntity(xmlNews) as ResponseMessageNews; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); Assert.AreEqual(2, result.ArticleCount); Assert.AreEqual(result.Articles.Count, result.ArticleCount); } //TODO:测试语音和视频类型 { //Music ResponseMessageMusic exceptResult = new ResponseMessageMusic() { Music = new Music() { Title = "标题", Description = "说明", MusicUrl = "https://sdk.weixin.senparc.com/Content/music1.mp3", HQMusicUrl = "" }, CreateTime = DateTimeHelper.GetDateTimeFromXml(63497823450), FromUserName = "******", ToUserName = "******", //FuncFlag = false, //MsgType = ResponseMsgType.Music }; var result = ResponseMessageFactory.GetResponseEntity(xmlMusic) as ResponseMessageMusic; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); //Assert.AreEqual(exceptResult.Music, result.Music); } }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>(); string fromUserName = requestMessage.FromUserName; if (requestMessage.Content == "投票") { return(this.GetVoteUrlResponse(fromUserName)); } else if (requestMessage.Content == "核销") { return(this.GetBonusUrlResponse(fromUserName)); } else { return(AutoReply(requestMessage)); } text.Content = "无效命令"; return(text); var responseMessage = base.CreateResponseMessage <ResponseMessageText>(); if (requestMessage.Content == null) { } else if (requestMessage.Content == "约束") { responseMessage.Content = @"您正在进行微信内置浏览器约束判断测试。您可以: <a href=""http://sdk.weixin.senparc.com/FilterTest/"">点击这里</a>进行客户端约束测试(地址:http://sdk.weixin.senparc.com/FilterTest/),如果在微信外打开将直接返回文字。 或: <a href=""http://sdk.weixin.senparc.com/FilterTest/Redirect"">点击这里</a>进行客户端约束测试(地址:http://sdk.weixin.senparc.com/FilterTest/Redirect),如果在微信外打开将重定向一次URL。"; } else if (requestMessage.Content == "托管" || requestMessage.Content == "代理") { //开始用代理托管,把请求转到其他服务器上去,然后拿回结果 //甚至也可以将所有请求在DefaultResponseMessage()中托管到外部。 DateTime dt1 = DateTime.Now; //计时开始 var agentXml = RequestDocument.ToString(); #region 暂时转发到SDK线上Demo agentUrl = "http://sdk.weixin.senparc.com/weixin"; agentToken = WebConfigurationManager.AppSettings["WeixinToken"];//Token //修改内容,防止死循环 var agentDoc = XDocument.Parse(agentXml); agentDoc.Root.Element("Content").SetValue("代理转发文字:" + requestMessage.Content); agentDoc.Root.Element("CreateTime").SetValue(DateTimeHelper.GetWeixinDateTime(DateTime.Now)); //修改时间,防止去重 agentDoc.Root.Element("MsgId").SetValue("123"); //防止去重 agentXml = agentDoc.ToString(); #endregion var responseXml = MessageAgent.RequestXml(this, agentUrl, agentToken, agentXml); //获取返回的XML //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); /* 如果有WeiweihiKey,可以直接使用下面的这个MessageAgent.RequestWeiweihiXml()方法。 * WeiweihiKey专门用于对接www.weiweihi.com平台,获取方式见:https://www.weiweihi.com/ApiDocuments/Item/25#51 */ //var responseXml = MessageAgent.RequestWeiweihiXml(weiweihiKey, RequestDocument.ToString());//获取Weiweihi返回的XML DateTime dt2 = DateTime.Now; //计时结束 //转成实体。 /* 如果要写成一行,可以直接用: * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); * 或 * */ var msg = string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); var agentResponseMessage = responseXml.CreateResponseMessage(); if (agentResponseMessage is ResponseMessageText) { (agentResponseMessage as ResponseMessageText).Content += msg; } else if (agentResponseMessage is ResponseMessageNews) { (agentResponseMessage as ResponseMessageNews).Articles[0].Description += msg; } return(agentResponseMessage);//可能出现多种类型,直接在这里返回 } else if (requestMessage.Content == "测试" || requestMessage.Content == "退出") { /* * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(https://www.weiweihi.com/User/App/Detail/1), * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。 */ if (requestMessage.Content == "测试") { //进入APP测试 responseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。"; } else { //退出APP测试 responseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。"; } } else if (requestMessage.Content == "AsyncTest") { //异步并发测试(提供给单元测试使用) DateTime begin = DateTime.Now; int t1, t2, t3; System.Threading.ThreadPool.GetAvailableThreads(out t1, out t3); System.Threading.ThreadPool.GetMaxThreads(out t2, out t3); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4)); DateTime end = DateTime.Now; var thread = System.Threading.Thread.CurrentThread; responseMessage.Content = string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}", thread.ManagedThreadId, HttpContext.Current != null ? HttpContext.Current.ApplicationInstance.GetHashCode() : -1, begin, end, t2 - t1 ); } else if (requestMessage.Content.ToUpper() == "OPEN") { var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>(); openResponseMessage.Articles.Add(new Article() { Title = "开放平台微信授权测试", Description = @"点击进入Open授权页面。 授权之后,您的微信所收到的消息将转发到第三方(盛派网络小助手)的服务器上,并获得对应的回复。 测试完成后,您可以登陆公众号后台取消授权。", Url = "http://sdk.weixin.senparc.com/OpenOAuth/JumpToMpOAuth" }); return(openResponseMessage); } else if (requestMessage.Content == "错误") { var errorResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); //因为没有设置errorResponseMessage.Content,所以这小消息将无法正确返回。 return(errorResponseMessage); } else if (requestMessage.Content == "容错") { Thread.Sleep(1500);//故意延时1.5秒,让微信多次发送消息过来,观察返回结果 var faultTolerantResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); faultTolerantResponseMessage.Content = string.Format("测试容错,MsgId:{0},Ticks:{1}", requestMessage.MsgId, DateTime.Now.Ticks); return(faultTolerantResponseMessage); } else if (requestMessage.Content.ToUpper() == "TM")//异步模板消息设置 { var openId = requestMessage.FromUserName; var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3);//为了防止openId泄露造成骚扰,这里启用验证码 TemplateMessageCollection[checkCode] = openId; responseMessage.Content = string.Format(@"新的验证码为:{0},请在网页上输入。网址:http://sdk.weixin.senparc.com/AsyncMethods", checkCode); } else if (requestMessage.Content.ToUpper() == "OPENID") //返回OpenId及用户信息 { var openId = requestMessage.FromUserName; //获取OpenId var userInfo = AdvancedAPIs.UserApi.Info(appId, openId, Language.zh_CN); responseMessage.Content = string.Format( "您的OpenID为:{0}\r\n昵称:{1}\r\n性别:{2}\r\n地区(国家/省/市):{3}/{4}/{5}\r\n关注时间:{6}\r\n关注状态:{7}", requestMessage.FromUserName, userInfo.nickname, (Sex)userInfo.sex, userInfo.country, userInfo.province, userInfo.city, DateTimeHelper.GetDateTimeFromXml(userInfo.subscribe_time), userInfo.subscribe); } else if (requestMessage.Content.ToUpper() == "EX") { var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息");//回调过程在global的ConfigWeixinTraceLog()方法中 responseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + DateTime.Now.ToString(); } else if (requestMessage.Content.ToUpper() == "MUTE") { return(new SuccessResponseMessage()); base.TextResponseMessage = "success"; responseMessage = null; } else { var result = new StringBuilder(); result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content); if (CurrentMessageContext.RequestMessages.Count > 1) { result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count, CurrentMessageContext.StorageData); for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--) { var historyMessage = CurrentMessageContext.RequestMessages[i]; result.AppendFormat("{0} 【{1}】{2}\r\n", historyMessage.CreateTime.ToShortTimeString(), historyMessage.MsgType.ToString(), (historyMessage is RequestMessageText) ? (historyMessage as RequestMessageText).Content : "[非文字类型]" ); } result.AppendLine("\r\n"); } result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n", WeixinContext.ExpireMinutes, WeixinContext.MaxRecordCount); result.AppendLine("\r\n"); result.AppendLine( "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。\r\nSDK官方地址:http://sdk.weixin.senparc.com"); responseMessage.Content = result.ToString(); } return(responseMessage); }