public override void OnExecuted() { try { WX_InteractionInfo model = new WX_InteractionInfo { OpenID = OpenId, CreateTime = DateTime.Now, MsgType = (WxMsgType)((int)Request.MsgType), InteractionContent = RequestDocument.ToString(), CompanyID = config.CompanyID }; bool result = false; if ((int)Request.MsgType != 6) { result = WXInteractionInfoServices.Add(model); if (!result) { string msg = string.Format("保存微信和平台交换信息失败:OpenID:{0};CreateTime:{1}:MsgType:{2};Content:{3}", model.OpenID, model.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), model.MsgType.GetDescription(), model.InteractionContent); TxtLogServices.WriteTxtLogEx("WeiXinConversation", msg); } } if (ResponseDocument != null) { int replyId = 0; if (result) { replyId = WXInteractionInfoServices.QueryMaxIdByOpenId(OpenId); } //回复给用户的消息 WX_InteractionInfo respModel = new WX_InteractionInfo { OpenID = OpenId, CreateTime = DateTime.Now, MsgType = (WxMsgType)((int)Request.MsgType), InteractionContent = ResponseDocument.ToString(), ReplyID = replyId.ToString(), CompanyID = config.CompanyID }; WXInteractionInfoServices.Add(respModel); } } catch (Exception ex) { ExceptionsServices.AddExceptions(ex, string.Format("保存微信交互消息失败,OPENID:{0}", OpenId), LogFrom.WeiXin); TxtLogServices.WriteTxtLogEx("WeiXinConversation", ex); } }
/// <summary> /// 点击事件 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "toupiao": return(this.GetVoteUrlResponse(requestMessage.FromUserName)); break; case "OneClick": { //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。这个区域是Description内容\r\n可以使用\\r\\n进行换行。", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "http://sdk.weixin.senparc.com" }); //随机添加一条图文,或只输出一条图文信息 if (DateTime.Now.Second % 2 == 0) { strongResponseMessage.Articles.Add(new Article() { Title = "这是随机产生的第二条图文信息,用于测试多条图文的样式", Description = "这是随机产生的第二条图文信息,用于测试多条图文的样式", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "http://sdk.weixin.senparc.com" }); } } break; case "SubClickRoot_Music": { //上传缩略图 var accessToken = Containers.AccessTokenContainer.TryGetAccessToken(appId, appSecret); var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb, Server.GetMapPath("~/Images/Logo.jpg")); //设置音乐信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>(); reponseMessage = strongResponseMessage; strongResponseMessage.Music.Title = "天籁之音"; strongResponseMessage.Music.Description = "真的是天籁之音"; strongResponseMessage.Music.MusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; strongResponseMessage.Music.HQMusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id; } break; case "SubClickRoot_Image": { //上传图片 var accessToken = Containers.AccessTokenContainer.TryGetAccessToken(appId, appSecret); var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, Server.GetMapPath("~/Images/Logo.jpg")); //设置图片信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageImage>(); reponseMessage = strongResponseMessage; strongResponseMessage.Image.MediaId = uploadResult.media_id; } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试", Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。", //Url = "http://sdk.weixin.senparc.com/oauth2", //PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }); strongResponseMessage.Articles.Add(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" }); var returnUrl = "/OAuth2/TestReturnUrl"; strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用", Description = "OAuth2.0测试(带returnUrl)", Url = "http://sdk.weixin.senparc.com/oauth2?returnUrl=" + returnUrl.UrlEncode(), PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }); reponseMessage = strongResponseMessage; } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = GetWelcomeInfo(); reponseMessage = strongResponseMessage; } break; case "SubClickRoot_PicPhotoOrAlbum": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; } break; case "SubClickRoot_ScancodePush": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信扫码】按钮。"; } break; case "ConditionalMenu_Male": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了个性化菜单按钮,您的微信性别设置为:男。"; } break; case "ConditionalMenu_Femle": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了个性化菜单按钮,您的微信性别设置为:女。"; } break; default: { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "正在建设中,敬请期待"; reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }
/// <summary> /// 点击事件 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { //这个过程实际已经在OnTextOrEventRequest中命中“OneClick”关键字,并完成回复,这里不会执行到。 var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。这个区域是Description内容\r\n可以使用\\r\\n进行换行。", PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "https://sdk.weixin.senparc.com" }); //随机添加一条图文,或只输出一条图文信息 if (SystemTime.Now.Second % 2 == 0) { strongResponseMessage.Articles.Add(new Article() { Title = "这是随机产生的第二条图文信息,用于测试多条图文的样式", Description = "这是随机产生的第二条图文信息,用于测试多条图文的样式", PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "https://sdk.weixin.senparc.com" }); } } break; case "SubClickRoot_Music": { //上传缩略图 #if NET45 var filePath = "~/Images/Logo.thumb.jpg"; #else var filePath = "~/wwwroot/Images/Logo.thumb.jpg"; #endif var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.thumb, ServerUtility.ContentRootMapPath(filePath)); //PS:缩略图官方没有特别提示文件大小限制,实际测试哪怕114K也会返回文件过大的错误,因此尽量控制在小一点(当前图片39K) //设置音乐信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>(); reponseMessage = strongResponseMessage; strongResponseMessage.Music.Title = "天籁之音"; strongResponseMessage.Music.Description = "真的是天籁之音"; strongResponseMessage.Music.MusicUrl = "https://sdk.weixin.senparc.com/Content/music1.mp3"; strongResponseMessage.Music.HQMusicUrl = "https://sdk.weixin.senparc.com/Content/music1.mp3"; strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id; } break; case "SubClickRoot_Image": { //上传图片 #if NET45 var filePath = "~/Images/Logo.jpg"; #else var filePath = "~/wwwroot/Images/Logo.jpg"; #endif var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image, ServerUtility.ContentRootMapPath(filePath)); //设置图片信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageImage>(); reponseMessage = strongResponseMessage; strongResponseMessage.Image.MediaId = uploadResult.media_id; } break; case "SendMenu": { var menuContentList = new List <SendMenuContent>() { new SendMenuContent("101", "满意"), new SendMenuContent("102", "一般"), new SendMenuContent("103", "不满意") }; //使用异步接口 CustomApi.SendMenu(appId, OpenId, "请对 Senparc.Weixin SDK 给出您的评价", menuContentList, "感谢您的参与!"); reponseMessage = new ResponseMessageNoResponse(); //不返回任何消息 } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML var dt1 = SystemTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); var dt2 = SystemTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试", Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。", //Url = "https://sdk.weixin.senparc.com/oauth2", //PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg" }); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试(不带returnUrl),测试环境可使用", Description = "OAuth2.0测试(不带returnUrl)", Url = "https://sdk.weixin.senparc.com/oauth2", PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg" }); var returnUrl = "/OAuth2/TestReturnUrl"; strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用", Description = "OAuth2.0测试(带returnUrl)", Url = "https://sdk.weixin.senparc.com/oauth2?returnUrl=" + returnUrl.UrlEncode(), PicUrl = "https://sdk.weixin.senparc.com/Images/qrcode.jpg" }); reponseMessage = strongResponseMessage; } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = GetWelcomeInfo(); reponseMessage = strongResponseMessage; } break; case "SubClickRoot_PicPhotoOrAlbum": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; } break; case "SubClickRoot_ScancodePush": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信扫码】按钮。"; } break; case "ConditionalMenu_Male": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了个性化菜单按钮,您的微信性别设置为:男。"; } break; case "ConditionalMenu_Femle": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了个性化菜单按钮,您的微信性别设置为:女。"; } break; case "GetNewMediaId": //获取新的MediaId { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); try { var result = AdvancedAPIs.MediaApi.UploadForeverMedia(appId, ServerUtility.ContentRootMapPath("~/Images/logo.jpg")); strongResponseMessage.Content = result.media_id; } catch (Exception e) { strongResponseMessage.Content = "发生错误:" + e.Message; WeixinTrace.SendCustomLog("调用UploadForeverMedia()接口发生异常", e.Message); } } break; default: { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey; reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。", PicUrl = "http://www.w3ccloud.com/Images/qrcode.jpg", Url = "http://www.w3ccloud.com" }); } break; case "SubClickRoot_Music": { //上传缩略图 var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret); var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb, Server.GetMapPath("~/Images/Logo.jpg")); //设置音乐信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>(); reponseMessage = strongResponseMessage; strongResponseMessage.Music.Title = "天籁之音"; strongResponseMessage.Music.Description = "真的是天籁之音"; strongResponseMessage.Music.MusicUrl = "http://www.w3ccloud.com/Content/music1.mp3"; strongResponseMessage.Music.HQMusicUrl = "http://www.w3ccloud.com/Content/music1.mp3"; strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id; } break; case "SubClickRoot_Image": { //上传图片 var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret); var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, Server.GetMapPath("~/Images/Logo.jpg")); //设置图片信息 var strongResponseMessage = CreateResponseMessage <ResponseMessageImage>(); reponseMessage = strongResponseMessage; strongResponseMessage.Image.MediaId = uploadResult.media_id; } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试", Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试(是专门的一个临时测试账号的授权,并非Senparc.Weixin.MP SDK官方账号,所以如果授权后出现错误页面数正常情况),测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。", Url = "http://www.w3ccloud.com/oauth2", PicUrl = "http://www.w3ccloud.com/Images/qrcode.jpg" }); reponseMessage = strongResponseMessage; } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = GetWelcomeInfo(); reponseMessage = strongResponseMessage; } break; case "SubClickRoot_PicPhotoOrAlbum": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; } break; case "SubClickRoot_ScancodePush": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信扫码】按钮。"; } break; default: { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey; reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs //书中例子 //if (requestMessage.Content == "你好") //{ // var responseMessage = base.CreateResponseMessage<ResponseMessageNews>(); // var title = "Title"; // var description = "Description"; // var picUrl = "PicUrl"; // var url = "Url"; // responseMessage.Articles.Add(new Article() // { // Title = title, // Description = description, // PicUrl = picUrl, // Url = url // }); // return responseMessage; //} //else if (requestMessage.Content == "Senparc") //{ // //相似处理逻辑 //} //else //{ // //... //} //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 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 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()); * 或 * */ 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)的“盛派网络小助手”应用请求(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 if (requestMessage.Content == "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 { 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); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //说明:实际项目中这里的逻辑可以交给Service处理具体信息 //参考OnLocationRequest方法或 /Service/LocationSercice.cs var defaultResponseMessage = base.CreateResponseMessage <ResponseMessageText>(); var requestHandler = requestMessage.StartHandler() //关键字不区分大小写,按照顺序匹配成功后将不再运行下面的逻辑 .Keyword("约束", () => { defaultResponseMessage.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。"; return(defaultResponseMessage); }). //匹配任一关键字 Keywords(new[] { "托管", "代理" }, () => { //开始用代理托管,把请求转到其他服务器上去,然后拿回结果 //甚至也可以将所有请求在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); //可能出现多种类型,直接在这里返回 }) .Keywords(new[] { "退出" }, () => { defaultResponseMessage.Content = "您已经退出【威尔汽车租赁】的测试程序。"; return(defaultResponseMessage); }) .Keyword("OPEN", () => { var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>(); openResponseMessage.Articles.Add(new Article() { Title = "开放平台微信授权测试", Description = @"点击进入Open授权页面。授权之后,您的微信所收到的消息将转发到第三方(威尔汽车租赁)的服务器上,并获得对应的回复。测试完成后,您可以登陆公众号后台取消授权。", Url = "http://sdk.weixin.senparc.com/OpenOAuth/JumpToMpOAuth" }); return(openResponseMessage); }) .Keyword("错误", () => { var errorResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); //因为没有设置errorResponseMessage.Content,所以这小消息将无法正确返回。 return(errorResponseMessage); }) .Keyword("容错", () => { Thread.Sleep(4900); //故意延时1.5秒,让微信多次发送消息过来,观察返回结果 var faultTolerantResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); faultTolerantResponseMessage.Content = string.Format("测试容错,MsgId:{0},Ticks:{1}", requestMessage.MsgId, DateTime.Now.Ticks); return(faultTolerantResponseMessage); }) .Keyword("TM", () => { var openId = requestMessage.FromUserName; var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3); //为了防止openId泄露造成骚扰,这里启用验证码 TemplateMessageCollection[checkCode] = openId; defaultResponseMessage.Content = string.Format(@"新的验证码为:{0},请在网页上输入。网址:http://sdk.weixin.senparc.com/AsyncMethods", checkCode); return(defaultResponseMessage); }) .Keyword("OPENID", () => { var openId = requestMessage.FromUserName; //获取OpenId var userInfo = UserApi.Info(appId, openId, Language.zh_CN); defaultResponseMessage.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); return(defaultResponseMessage); }) .Keyword("EX", () => { var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息"); //回调过程在global的ConfigWeixinTraceLog()方法中 defaultResponseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + DateTime.Now.ToString(); return(defaultResponseMessage); }) .Keyword("MUTE", () => //不回复任何消息 { //方案一: return(new SuccessResponseMessage()); //方案二: var muteResponseMessage = base.CreateResponseMessage <ResponseMessageNoResponse>(); return(muteResponseMessage); //方案三: base.TextResponseMessage = "success"; return(null); }) .Keyword("JSSDK", () => { defaultResponseMessage.Content = "点击打开:http://sdk.weixin.senparc.com/WeixinJsSdk"; return(defaultResponseMessage); }) //Default不一定要在最后一个 .Default(() => { 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.ToString("HH:mm:ss"), 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"); defaultResponseMessage.Content = result.ToString(); return(defaultResponseMessage); }) //“一次订阅消息”接口测试 .Keyword("订阅", () => { defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/SubscribeMsg"; return(defaultResponseMessage); }) //正则表达式 .Regex(@"^\d+#\d+$", () => { defaultResponseMessage.Content = string.Format("您输入了:{0},符合正则表达式:^\\d+#\\d+$", requestMessage.Content); return(defaultResponseMessage); }); return(requestHandler.GetResponseMessage() as IResponseMessageBase); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 var responseMessage = base.CreateResponseMessage <ResponseMessageText>(); 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(); } return(responseMessage); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。", PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg", Url = "http://weixin.senparc.com" }); } break; case "SubClickRoot_Music": { var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>(); reponseMessage = strongResponseMessage; strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试", Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试,测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。", Url = "http://weixin.senparc.com/oauth2", }); reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "telphone": { //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "02168409571"; } break; case "SubClickRoot_Text": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮222", Description = "您点击了子菜单图文按钮,这是一条图文信息33。", PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg", Url = "http://weixin.senparc.com" }); } break; //case "SubClickRoot_Music": // { // //上传缩略图 // var accessToken = CommonAPIs.AccessTokenContainer.TryGetToken(appId, appSecret); // var uploadResult = AdvancedAPIs.Media.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb, // Server.GetMapPath("~/Images/Logo.jpg")); // //设置音乐信息 // var strongResponseMessage = CreateResponseMessage<ResponseMessageMusic>(); // reponseMessage = strongResponseMessage; // strongResponseMessage.Music.Title = "天籁之音"; // strongResponseMessage.Music.Description = "真的是天籁之音"; // strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; // strongResponseMessage.Music.HQMusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; // strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id; // } // break; //case "SubClickRoot_Image": // { // //上传图片 // var accessToken = CommonAPIs.AccessTokenContainer.TryGetToken(appId, appSecret); // var uploadResult = AdvancedAPIs.Media.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, // Server.GetMapPath("~/Images/Logo.jpg")); // //设置图片信息 // var strongResponseMessage = CreateResponseMessage<ResponseMessageImage>(); // reponseMessage = strongResponseMessage; // strongResponseMessage.Image.MediaId = uploadResult.media_id; // } // break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); reponseMessage = strongResponseMessage; strongResponseMessage.Articles.Add(new Article() { Title = "您点击了子菜单图文按钮111", Description = "您点击了子菜单图文按钮,这是一条图文信息。", PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg", Url = "http://weixin.senparc.com" }); } break; case "SubClickRoot_PicPhotoOrAlbum": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; } break; case "SubClickRoot_ScancodePush": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了【微信扫码】按钮。"; } break; default: { reponseMessage = this.Robet(requestMessage.EventKey); } break; } return(reponseMessage); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs #region 书中例子 //if (requestMessage.Content == "你好") //{ // var responseMessage = base.CreateResponseMessage<ResponseMessageNews>(); // var title = "Title"; // var description = "Description"; // var picUrl = "PicUrl"; // var url = "Url"; // responseMessage.Articles.Add(new Article() // { // Title = title, // Description = description, // PicUrl = picUrl, // Url = url // }); // return responseMessage; //} //else if (requestMessage.Content == "Senparc") //{ // //相似处理逻辑 //} //else //{ // //... //} #endregion //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 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); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { _logger.LogTrace(string.Format("post:进入handler")); try { var defaultResponseMessage = base.CreateResponseMessage <ResponseMessageText>(); var xml = RequestDocument.ToString(); _logger.LogTrace(string.Format("post:{0}", xml)); var data = new RequestMsgData(); data.MsgId = requestMessage.MsgId; data.Content = Newtonsoft.Json.JsonConvert.SerializeObject(new { msgType = "text", text = requestMessage.Content }); data.CreateTime = requestMessage.CreateTime; data.FromUserName = requestMessage.FromUserName; data.ToUserName = requestMessage.ToUserName; data.MsgType = requestMessage.MsgType; db.AddToRequestMsgData(data); db.SaveChanges(); _logger.LogTrace(string.Format("post:原始数据保存成功")); //绑定会员功能,此处用输入账号密码来实现 if (!string.IsNullOrWhiteSpace(requestMessage.Content) && requestMessage.Content.StartsWith("bd#")) { string emailPwd = requestMessage.Content.Substring(2); var member = db.MemberDbSet().FirstOrDefault(p => p.Email != null && p.Email.Trim() != string.Empty && (p.Email + p.Password) == emailPwd); if (member != null) { var memberWechat = db.QueryMemberWechat().FirstOrDefault(p => p.MemberId == member.Id); if (memberWechat != null) { memberWechat.OpenId = requestMessage.FromUserName; } else { memberWechat = new MemberWechat() { OpenId = requestMessage.FromUserName, MemberId = member.Id }; db.Add(memberWechat); } db.SaveChanges(); } } var robotMessages = db.QueryRobotMessage() .Where(m => !m.IsDel) .Where(m => m.Status == RobotMessageStatus.正常) .Select(m => new { Question = m.Question, Answer = m.Answer, QuestionType = m.QuestionType }) .ToList(); _logger.LogTrace($"post:尝试自动回复,共条{robotMessages.Count}自动回复内容"); var question = requestMessage.Content; var textResponse = robotMessages.Where(m => m.QuestionType == RobotMessageQuestionType.文本) .Where(m => m.Question == question) .FirstOrDefault(); if (textResponse != null) { if (textResponse.Answer.StartsWith("image:")) { var tmpMessage = CreateResponseMessage <ResponseMessageImage>(); tmpMessage.Image.MediaId = textResponse.Answer.Replace("images:", ""); return(tmpMessage); } else if (textResponse.Answer.StartsWith("video:")) { var tmpMessage = CreateResponseMessage <ResponseMessageVideo>(); tmpMessage.Video.MediaId = textResponse.Answer.Replace("video:", ""); return(tmpMessage); } else if (textResponse.Answer.StartsWith("voice:")) { var tmpMessage = CreateResponseMessage <ResponseMessageVoice>(); tmpMessage.Voice.MediaId = textResponse.Answer.Replace("voice:", ""); return(tmpMessage); } else if (textResponse.Answer.StartsWith("music:")) { var tmpMessage = CreateResponseMessage <ResponseMessageMusic>(); tmpMessage.Music.ThumbMediaId = textResponse.Answer.Replace("music:", ""); return(tmpMessage); } else if (textResponse.Answer.StartsWith("news:")) { var mediaId = textResponse.Answer.Replace("news:", ""); Task.Factory.StartNew(() => { Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendMpNews(GetAccessToken(), base.WeixinOpenId, mediaId); }); return(null); } else { defaultResponseMessage.Content = textResponse.Answer; return(defaultResponseMessage); } } var regexResponse = robotMessages.Where(m => m.QuestionType == RobotMessageQuestionType.正则) .Where(m => System.Text.RegularExpressions.Regex.IsMatch(question, m.Question, System.Text.RegularExpressions.RegexOptions.None)) .FirstOrDefault(); if (regexResponse != null) { defaultResponseMessage.Content = regexResponse.Answer; return(defaultResponseMessage); } //这个没效果,仍然会弹出“该公众号暂时无法提供服务,请稍后再试” //return base.CreateResponseMessage<ResponseMessageNoResponse>(); return(new SuccessResponseMessage()); } catch (Exception ex) { _logger.LogError(new EventId(-100), ex, "OnTextRequest Error"); return(new SuccessResponseMessage()); } }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using ChainClouds.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 var responseMessage = base.CreateResponseMessage <ResponseMessageText>(); if (requestMessage.Content == null) { } else if (requestMessage.Content == "约束") { responseMessage.Content = @"您正在进行微信内置浏览器约束判断测试。您可以: <a href=""http://open.chainclouds.com/FilterTest/"">点击这里</a>进行客户端约束测试(地址:http://open.chainclouds.com/FilterTest/),如果在微信外打开将直接返回文字。 或: <a href=""http://open.chainclouds.com/FilterTest/Redirect"">点击这里</a>进行客户端约束测试(地址:http://open.chainclouds.com/FilterTest/Redirect),如果在微信外打开将重定向一次URL。"; } 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()); /* 如果有ChaincloudsKey,可以直接使用下面的这个MessageAgent.RequestChaincloudsXml()方法。 * ChaincloudsKey专门用于对接www.chainclouds.com平台,获取方式见:http://www.chainclouds.com/ApiDocuments/Item/25#51 */ //var responseXml = MessageAgent.RequestChaincloudsXml(chaincloudsKey, RequestDocument.ToString());//获取Chainclouds返回的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.chainclouds.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 == "open") { var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>(); openResponseMessage.Articles.Add(new Article() { Title = "开放平台微信授权测试", Description = @"点击进入Open授权页面。 授权之后,您的微信所收到的消息将转发到第三方(连锁掌柜小助手)的服务器上,并获得对应的回复。 测试完成后,您可以登陆公众号后台取消授权。", Url = "http://open.chainclouds.com/OpenOAuth/JumpToMpOAuth" }); return(openResponseMessage); } else { //#region 老接口调用 //var keywordDAO = new WKeywordReplyDAO(this.LoggingSession); ////var ds = keywordDAO.GetMaterialByKeyword(content); //var ds = keywordDAO.GetMaterialByKeywordJermyn(requestMessage.Content, requestMessage.ToUserName, 1); //int keywordType = 1; //#region 如果没有关键字回复,给予自动回复内容 //if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0) //{ // ds = keywordDAO.GetMaterialByKeywordJermyn(requestMessage.Content, requestMessage.ToUserName, 3); // keywordType = 3; //} //#endregion //#region 如果回复,调用老的接口 //if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0) //{ // //HandlerTextOld(); // //return;//执行 完老的发送信息的方法,就直接跳出请去,不往下走了**** //} //#endregion //var resultinfo = new StringBuilder(); //if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) //{ // string Text = ds.Tables[0].Rows[0]["Text"].ToString(); //素材类型 // string ReplyId = ds.Tables[0].Rows[0]["ReplyId"].ToString(); //素材ID // string typeId = ds.Tables[0].Rows[0]["ReplyType"].ToString(); //素材ID // resultinfo.AppendLine(Text); // //BaseService.WriteLogWeixin("ReplyId:" + ReplyId); // //BaseService.WriteLogWeixin("typeId:" + typeId); // //switch (typeId) // //{ // // case MaterialType.TEXT: //回复文字消息 // // //ReplyText(materialId); // // ReplyTextJermyn(Text); // // break; // // case MaterialType.IMAGE_TEXT: //回复图文消息 // // //ReplyNews(materialId); // // ReplyNewsJermyn(ReplyId, keywordType, 1); // // break; // // default: // // break; // //} //} //#endregion 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( "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。"); //result = resultinfo.Length > 0 ? resultinfo : result; responseMessage.Content = result.ToString(); } return(responseMessage); }
/// <summary> /// 处理文字请求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 var responseMessage = base.CreateResponseMessage <ResponseMessageText>(); if (requestMessage.Content == "约束") { responseMessage.Content = "<a href=\"http://weixin.senparc.com/FilterTest/\">点击这里</a>进行客户端约束测试(地址:http://weixin.senparc.com/FilterTest/)。"; } 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()); /* 如果有SouideaKey,可以直接使用下面的这个MessageAgent.RequestSouideaXml()方法。 * SouideaKey专门用于对接www.souidea.com平台,获取方式见:http://www.souidea.com/ApiDocuments/Item/25#51 */ //var responseXml = MessageAgent.RequestSouideaXml(souideaKey, RequestDocument.ToString());//获取Souidea返回的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 { 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(); } return(responseMessage); }
/// <summary> /// 处理文字请求 /// </summary> /// <param name="requestMessage">请求消息</param> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //说明:实际项目中这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs #region 书中例子 //if (requestMessage.Content == "你好") //{ // var responseMessage = base.CreateResponseMessage<ResponseMessageNews>(); // var title = "Title"; // var description = "Description"; // var picUrl = "PicUrl"; // var url = "Url"; // responseMessage.Articles.Add(new Article() // { // Title = title, // Description = description, // PicUrl = picUrl, // Url = url // }); // return responseMessage; //} //else if (requestMessage.Content == "Senparc") //{ // //相似处理逻辑 //} //else //{ // //... //} #endregion #region 历史方法 //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装 //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。 #endregion var defaultResponseMessage = base.CreateResponseMessage <ResponseMessageText>(); var requestHandler = requestMessage.StartHandler() //关键字不区分大小写,按照顺序匹配成功后将不再运行下面的逻辑 .Keyword("约束", () => { defaultResponseMessage.Content = @"您正在进行微信内置浏览器约束判断测试。您可以: <a href=""https://sdk.weixin.senparc.com/FilterTest/"">点击这里</a>进行客户端约束测试(地址:https://sdk.weixin.senparc.com/FilterTest/),如果在微信外打开将直接返回文字。 或: <a href=""https://sdk.weixin.senparc.com/FilterTest/Redirect"">点击这里</a>进行客户端约束测试(地址:https://sdk.weixin.senparc.com/FilterTest/Redirect),如果在微信外打开将重定向一次URL。"; return(defaultResponseMessage); }). //匹配任一关键字 Keywords(new[] { "托管", "代理" }, () => { //开始用代理托管,把请求转到其他服务器上去,然后拿回结果 //甚至也可以将所有请求在DefaultResponseMessage()中托管到外部。 var dt1 = SystemTime.Now; //计时开始 var agentXml = RequestDocument.ToString(); #region 暂时转发到SDK线上Demo agentUrl = "https://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.GetUnixDateTime(SystemTime.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 var dt2 = SystemTime.Now; //计时结束 //转成实体。 /* 如果要写成一行,可以直接用: * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); * 或 * */ var msg = string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); var agentResponseMessage = responseXml.CreateResponseMessage(this.MessageEntityEnlightener); if (agentResponseMessage is ResponseMessageText) { (agentResponseMessage as ResponseMessageText).Content += msg; } else if (agentResponseMessage is ResponseMessageNews) { (agentResponseMessage as ResponseMessageNews).Articles[0].Description += msg; } return(agentResponseMessage); //可能出现多种类型,直接在这里返回 }) .Keywords(new[] { "测试", "退出" }, () => { /* * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(https://www.weiweihi.com/User/App/Detail/1), * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。 */ if (defaultResponseMessage.Content == "测试") { //进入APP测试 defaultResponseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。"; } else { //退出APP测试 defaultResponseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。"; } return(defaultResponseMessage); }) .Keyword("AsyncTest", () => { //异步并发测试(提供给单元测试使用) #if NET45 var begin = SystemTime.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)); var end = SystemTime.Now; var thread = System.Threading.Thread.CurrentThread; defaultResponseMessage.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 ); #endif return(defaultResponseMessage); }) .Keyword("OPEN", () => { var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>(); openResponseMessage.Articles.Add(new Article() { Title = "开放平台微信授权测试!", Description = @"点击进入Open授权页面。 授权之后,您的微信所收到的消息将转发到第三方(盛派网络小助手)的服务器上,并获得对应的回复。 测试完成后,您可以登陆公众号后台取消授权。", Url = "https://sdk.weixin.senparc.com/OpenOAuth/JumpToMpOAuth" }); return(openResponseMessage); }) .Keyword("错误", () => { var errorResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); //因为没有设置errorResponseMessage.Content,所以这小消息将无法正确返回。 return(errorResponseMessage); }) .Keyword("容错", () => { Thread.Sleep(4900); //故意延时1.5秒,让微信多次发送消息过来,观察返回结果 var faultTolerantResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>(); faultTolerantResponseMessage.Content = string.Format("测试容错,MsgId:{0},Ticks:{1}", requestMessage.MsgId, SystemTime.Now.Ticks); return(faultTolerantResponseMessage); }) .Keyword("TM", () => { var openId = requestMessage.FromUserName; var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3); //为了防止openId泄露造成骚扰,这里启用验证码 TemplateMessageCollection[checkCode] = openId; defaultResponseMessage.Content = string.Format(@"新的验证码为:{0},请在网页上输入。网址:https://sdk.weixin.senparc.com/AsyncMethods", checkCode); return(defaultResponseMessage); }) .Keyword("OPENID", () => { var openId = requestMessage.FromUserName; //获取OpenId var userInfo = UserApi.Info(appId, openId, Language.zh_CN); defaultResponseMessage.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, (WeixinSex)userInfo.sex, userInfo.country, userInfo.province, userInfo.city, DateTimeHelper.GetDateTimeFromXml(userInfo.subscribe_time), userInfo.subscribe); return(defaultResponseMessage); }) .Keyword("EX", () => { var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息"); //回调过程在global的ConfigWeixinTraceLog()方法中 defaultResponseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + SystemTime.Now.ToString(); return(defaultResponseMessage); }) .Keyword("MUTE", () => //不回复任何消息 { //方案一: return(new SuccessResponseMessage()); //方案二: var muteResponseMessage = base.CreateResponseMessage <ResponseMessageNoResponse>(); return(muteResponseMessage); //方案三: base.TextResponseMessage = "success"; return(null); //方案四: return(null); //在 Action 中结合使用 return new FixWeixinBugWeixinResult(messageHandler); }) .Keyword("JSSDK", () => { defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/WeixinJsSdk"; return(defaultResponseMessage); }) //选择菜单,关键字:101(微信服务器端最终格式:id="s:101",content="满意") .SelectMenuKeyword("101", () => { defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!我们会一如既往为提高企业和开发者生产力而努力!"; return(defaultResponseMessage); }) //选择菜单,关键字:102(微信服务器端最终格式:id="s:102",content="一般") .SelectMenuKeyword("102", () => { defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!希望我们的服务能让您越来越满意!"; return(defaultResponseMessage); }) //选择菜单,关键字:103(微信服务器端最终格式:id="s:103",content="不满意") .SelectMenuKeyword("103", () => { defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!我们需要您的意见或建议,欢迎向我们反馈! <a href=\"https://github.com/JeffreySu/WeiXinMPSDK/issues/new\">点击这里</a>"; return(defaultResponseMessage); }) .SelectMenuKeywords(new[] { "110", "111" }, () => { defaultResponseMessage.Content = $"这里只是演示,可以同时支持多个选择菜单"; return(defaultResponseMessage); }) //Default不一定要在最后一个 .Default(() => { 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.ToString("HH:mm:ss"), historyMessage.MsgType.ToString(), (historyMessage is RequestMessageText) ? (historyMessage as RequestMessageText).Content : "[非文字类型]" ); } result.AppendLine("\r\n"); } result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n", GlobalMessageContext.ExpireMinutes, GlobalMessageContext.MaxRecordCount); result.AppendLine("\r\n"); result.AppendLine( "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。\r\nSDK官方地址:https://sdk.weixin.senparc.com"); defaultResponseMessage.Content = result.ToString(); return(defaultResponseMessage); }) //“一次订阅消息”接口测试 .Keyword("订阅", () => { defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/SubscribeMsg"; return(defaultResponseMessage); }) //正则表达式 .Regex(@"^\d+#\d+$", () => { defaultResponseMessage.Content = string.Format("您输入了:{0},符合正则表达式:^\\d+#\\d+$", requestMessage.Content); return(defaultResponseMessage); }); return(requestHandler.GetResponseMessage() as IResponseMessageBase); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 //var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageNews>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Articles.Add(new Article() //{ // Title = "您点击了子菜单图文按钮", // Description = "您点击了子菜单图文按钮,这是一条图文信息。", // PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg", // Url = "http://weixin.senparc.com" //}); } break; case "SubClickRoot_Music": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageMusic>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; } break; case "SubClickRoot_Image": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageImage>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Image.MediaId = "Mj0WUTZeeG9yuBKhGP7iR5n1xUJO9IpTjGNC4buMuswfEOmk6QSIRb_i98do5nwo"; } break; case "SubClickRoot_Agent": //代理消息 { ////获取返回的XML //DateTime dt1 = DateTime.Now; //reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); ////上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); //DateTime dt2 = DateTime.Now; //if (reponseMessage is ResponseMessageNews) //{ // (reponseMessage as ResponseMessageNews) // .Articles[0] // .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); //} } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { //var strongResponseMessage = CreateResponseMessage<ResponseMessageNews>(); //strongResponseMessage.Articles.Add(new Article() //{ // Title = "OAuth2.0测试", // Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试(是专门的一个临时测试账号的授权,并非Senparc.Weixin.MP SDK官方账号,所以如果授权后出现错误页面数正常情况),测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。", // Url = "http://weixin.senparc.com/oauth2", // PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg" //}); //reponseMessage = strongResponseMessage; } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = GetWelcomeInfo(); reponseMessage = strongResponseMessage; } break; case "GetPublish": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = "欢迎参加2015年2月26日正月初八龙岩体育公园“海西招聘—春风行动”大型招聘会"; reponseMessage = strongResponseMessage; } break; case "GetNewsType1": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = new NewsCfgOp().GetHrefStr(1); reponseMessage = strongResponseMessage; } break; case "GetNewsType2": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = new NewsCfgOp().GetHrefStr(2); reponseMessage = strongResponseMessage; } break; default: { //var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); //strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey; //reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "OneClick": { ////这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。 //var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "SubClickRoot_Text": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Content = "您点击了子菜单按钮。"; } break; case "SubClickRoot_News": { //var strongResponseMessage = CreateResponseMessage<ResponseMessageNews>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Articles.Add(new Article() //{ // Title = "您点击了子菜单图文按钮", // Description = "您点击了子菜单图文按钮,这是一条图文信息。", // PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg", // Url = "http://weixin.senparc.com" //}); } break; case "SubClickRoot_Music": { ////上传缩略图 //var accessToken = CommonAPIs.AccessTokenContainer.TryGetToken(appId, appSecret); //var uploadResult = AdvancedAPIs.Media.MediaApi.Upload(accessToken, UploadMediaFileType.thumb, // Server.GetMapPath("~/Images/Logo.jpg")); ////设置音乐信息 //var strongResponseMessage = CreateResponseMessage<ResponseMessageMusic>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Music.Title = "天籁之音"; //strongResponseMessage.Music.Description = "真的是天籁之音"; //strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; //strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id; } break; case "SubClickRoot_Customer": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; using (WXDBEntities db = new WXDBEntities()) { var tmp = db.WXKewWords.Where(s => s.Type == 0).FirstOrDefault(); if (tmp != null) { strongResponseMessage.Content = tmp.Description; } else { strongResponseMessage.Content = "你好,欢迎关注恒大御景湾 !"; //\r\n输入序号快速了解我们\r\n[1]查看项目投资方\r\n[2]查看户型\r\n[3]查看交通,\r\n加入誉天下会,尊享更多优惠!\r\n<a href=\"http://zhengrong.tencenthouse.com/member/registerMember.aspx\">马上加入》》》</a> } } } break; case "SubClick_sh": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "开盘时间待定,敬请关注官方微信。"; } break; case "SubClick_xs": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "销售热线:021-60259333"; } break; case "SubClick_jt": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "来访动线:\r\n1、地铁11号线,马陆站2号出口(出口前进20米,到阿克苏南路后右转);\r\n2、市区方向:\r\n(1)您可以就近上中环高架,转S5沪嘉高速至【马陆】出口下,左转至【宝安公路】,然后到【永盛南路】左转,根据我们的道旗指引就到了。\r\n(2)沪翔高速:S6沪翔高速至【永盛路出口】下,至永盛南路向北行驶再右转,根据我们的道旗指引就到了。\r\n3、使用手机【高德导航】,搜索“恒大御景湾”根据指示即可到达"; } break; case "SubClick_xm": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "项目地址:嘉定区马陆镇【阿克苏南路】与【合作南路】交汇处东50米。"; } break; case "SubClickRoot_Image": { //上传图片 //var accessToken = CommonAPIs.AccessTokenContainer.TryGetToken(appId, appSecret); //var uploadResult = AdvancedAPIs.Media.MediaApi.Upload(accessToken, UploadMediaFileType.image, // Server.GetMapPath("~/Images/Logo.jpg")); ////设置图片信息 //var strongResponseMessage = CreateResponseMessage<ResponseMessageImage>(); //reponseMessage = strongResponseMessage; //strongResponseMessage.Image.MediaId = uploadResult.media_id; //return null; } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { return(null); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML //return null; } break; case "OAuth": //OAuth授权测试 { //return null; } break; case "Description": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); strongResponseMessage.Content = GetWelcomeInfo(); reponseMessage = strongResponseMessage; } break; default: { // return null; } break; } return(reponseMessage); }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase reponseMessage = null; //菜单点击,需要跟创建菜单时的Key匹配 switch (requestMessage.EventKey) { case "Near": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; } break; case "ContactUs": { MpUser fromUser = MpUserService.GetByOpenID(requestMessage.FromUserName); if (fromUser != null) { Client.StartKfMeeting(fromUser.Id); } return(null); } break; case "NearBy": { var strongResponseMessage = CreateResponseMessage <ResponseMessageText>(); reponseMessage = strongResponseMessage; strongResponseMessage.Content = "首先切换到对话模式,看到输入框旁边那个“+”了没,选择“位置”后点击“发送”,即可查询周边网点信息。"; } break; case "SubClickRoot_Music": { var strongResponseMessage = CreateResponseMessage <ResponseMessageMusic>(); reponseMessage = strongResponseMessage; strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3"; } break; case "SubClickRoot_Agent": //代理消息 { //获取返回的XML DateTime dt1 = DateTime.Now; reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString()); //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); DateTime dt2 = DateTime.Now; if (reponseMessage is ResponseMessageNews) { (reponseMessage as ResponseMessageNews) .Articles[0] .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds); } } break; case "Member": //托管代理会员信息 { //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); } break; case "OAuth": //OAuth授权测试 { var strongResponseMessage = CreateResponseMessage <ResponseMessageNews>(); strongResponseMessage.Articles.Add(new Article() { Title = "OAuth2.0测试", Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试,测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。", Url = "http://weixin.senparc.com/oauth2", }); reponseMessage = strongResponseMessage; } break; } return(reponseMessage); }