public ActionResult Index(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wxtoken)) { return Content("参数错误!"); } postModel.Token = wxtoken; postModel.EncodingAESKey = encodingAESKey; //根据自己后台的设置保持一致 postModel.AppId = appId; //根据自己后台的设置保持一致 //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, 10) { OmitRepeatedMessage = true }; /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ //执行微信处理过程 messageHandler.Execute(); //return Content(messageHandler.ResponseDocument.ToString());//v0.7- //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 return new WeixinResult(messageHandler); //v0.8+ }
public void SetSecretInfoTest() { var postModel = new PostModel(); postModel.SetSecretInfo("A","B","C"); Assert.AreEqual("A", postModel.Token); Assert.AreEqual("B", postModel.EncodingAESKey); Assert.AreEqual("C", postModel.AppId); }
public ActionResult Get(PostModel postModel, string echostr,string appId) { int wxId = 0; if (string.IsNullOrWhiteSpace(appId) && !int.TryParse(appId, out wxId)) return Content("未知平台接入!"); wxId = Convert.ToInt32(appId); Weixin_Sys_Info wxInfo = null; using (SeekAskContext context = new SeekAskContext()) { wxInfo = context.Weixin_Sys_Info.FirstOrDefault(p => p.WxId == wxId); if (wxInfo == null) return Content("平台未新增管理代号(" + appId + ")!"); bool isCheckSignature = CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wxInfo.Wx_Token); #region 记录接入日志 try { Szx_Sys_Log log = new Szx_Sys_Log() { LogID = Guid.NewGuid().ToString("N"), LogName = "微信接入验证", Source = "01", LevelCode = 0, RequestUrl = HttpContext.Request.Url.ToString(), LogDate = DateTime.Now, Message = "验证结果:" + isCheckSignature, Create_Id = "wxjk", Create_Name = "微信接口", Create_Time = DateTime.Now, Create_IP = WebSiteTools.GetRequestIP() }; context.Szx_Sys_Log.Add(log); context.SaveChanges(); } catch (Exception) { } #endregion if (isCheckSignature) { try { wxInfo.Wx_Status = 1; //状态改为已对接 context.SaveChanges(); } catch (Exception) { } return Content(echostr); //返回随机字符串则表示验证通过 } else { return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, wxInfo.Wx_Token) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); } } }
public ActionResult Index(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wxtoken)) { return Content(echostr); //返回随机字符串则表示验证通过 } return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, wxtoken) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); }
public ActionResult Get(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content(echostr); } else { return Content("error!"); } }
public ActionResult Get(PostModel postModel, string echostr) { LogHelper.WriteLog(typeof(HomeController), echostr); if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content(echostr);//返回随机字符串则表示验证通过 } else { return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); } }
public ActionResult CheckSign(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, token)) { return Content(echostr); } else { Trace.TraceInformation("url绑定"); return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, token) + "。如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); } }
public bool Check(Wx_App app, MP.PostModel model) { string token = model.Token ?? app.Token; if (CheckSignature.Check(model.Signature, model.Timestamp, model.Nonce, token)) { model.Token = token; model.AppId = app.AppId; model.EncodingAESKey = app.AesKey; return(true); } return(false); }
public ActionResult Get(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content(echostr); } else { string errMsg = string.Format("{请求失败:{0},{1}。", postModel.Signature, CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token), "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); return Content(echostr); } }
public ActionResult Get(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { LogHelper.LogInfoAsync(typeof(HomeController), "微信成功对接!SUCCEED!"); return Content(echostr); //返回随机字符串则表示验证通过 } else { LogHelper.LogInfoAsync(typeof(HomeController), "failed:肖劲"); return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); } }
public ActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("error!"); } postModel.Token = Token; postModel.EncodingAESKey = ""; postModel.AppId = Util.AppId; var messageHandler = new TulipeMessageHandler(Request.InputStream, postModel); messageHandler.Execute(); return new WeixinResult(messageHandler); }
public ActionResult Post(PostModel postModel) { LogHelper.WriteLog(typeof(HomeController), Request.Params.ToString()); if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token; postModel.EncodingAESKey = "13qhqURcAGvCCjZC5YBWry6iF7zBqdVJXzIHb5mFVJJ";//根据自己后台的设置保持一致 postModel.AppId = "wx613d6a2e27509b58";//根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息 messageHandler.Execute(); return new WeixinResult(messageHandler);//返回结果 }
public ActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token; postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致 postModel.AppId = AppId;//根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息 messageHandler.Execute();//执行微信处理过程 return new WeixinResult(messageHandler);//返回结果 }
public ActionResult MiniPost(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { //return Content("参数错误!");//v0.7- return new WeixinResult("参数错误!");//v0.8+ } postModel.Token = Token; postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致 postModel.AppId = AppId;//根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, 10); messageHandler.Execute();//执行微信处理过程 //return Content(messageHandler.ResponseDocument.ToString());//v0.7- return new FixWeixinBugWeixinResult(messageHandler);//v0.8+ return new WeixinResult(messageHandler);//v0.8+ }
public Task<ActionResult> MiniPost(PostModel postModel) { return Task.Factory.StartNew<ActionResult>(() => { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return new WeixinResult("参数错误!"); } postModel.Token = Token; postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致 postModel.AppId = AppId; //根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, 10); messageHandler.Execute(); //执行微信处理过程 return new FixWeixinBugWeixinResult(messageHandler); }).ContinueWith<ActionResult>(task => task.Result); }
public HttpResponseMessage Processing(PostModel postModel, string appId) { // TODO: // Get token by appid var token = ""; if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, token)) { // Return echostr return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("2", Encoding.UTF8, "text/plain") }; } else { // TODO: return some message. return new HttpResponseMessage() { Content = new StringContent("1", Encoding.UTF8) }; } }
/// <summary> /// 检查签名是否正确 /// </summary> /// <param name="signature"></param> /// <param name="postModel">需要提供:Timestamp、Nonce、Token</param> /// <returns></returns> public static bool Check(string signature, PostModel postModel) { return Check(signature, postModel.Timestamp, postModel.Nonce, postModel.Token); }
public ActionResult Post(PostModel postModel,string appId) { int wxId = 0; if (string.IsNullOrWhiteSpace(appId) && !int.TryParse(appId, out wxId)) return Content("未知平台接入!"); wxId = Convert.ToInt32(appId); Weixin_Sys_Info wxInfo = null; using (SeekAskContext context = new SeekAskContext()) { wxInfo = context.Weixin_Sys_Info.FirstOrDefault(p => p.WxId == wxId); if (wxInfo == null) return Content("平台未新增管理代号(" + appId + ")!"); if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wxInfo.Wx_Token)) { return Content("参数错误!"); } postModel.Token = wxInfo.Wx_Token;//根据自己后台的设置保持一致 postModel.EncodingAESKey = wxInfo.Wx_EncodingAESKey;//根据自己后台的设置保持一致 postModel.AppId = wxInfo.Wx_AppId;//根据自己后台的设置保持一致 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ messageHandler.OmitRepeatedMessage = true; //执行微信处理过程 messageHandler.Execute(); #region 记录微信操作日志 try { if (!messageHandler.CancelExcute) { Weixin_Msg_Request msgRequest = new Weixin_Msg_Request(); msgRequest.WxId = wxInfo.WxId; msgRequest.MsgType = messageHandler.RequestMessage.MsgType.ToString(); if (messageHandler.RequestMessage.MsgType != RequestMsgType.Event) msgRequest.MsgId = messageHandler.RequestMessage.MsgId.ToString(); else msgRequest.MsgId = Guid.NewGuid().ToString("N"); msgRequest.FromUserName = messageHandler.RequestMessage.FromUserName; msgRequest.ToUserName = messageHandler.RequestMessage.ToUserName; msgRequest.Encrypt = null; msgRequest.CreateTime = messageHandler.RequestMessage.CreateTime; msgRequest.XmlDocument = messageHandler.RequestDocument.ToString(); context.Weixin_Msg_Request.Add(msgRequest); context.SaveChanges(); } } catch (Exception) { } #endregion //return Content(messageHandler.ResponseDocument.ToString());//v0.7- //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 return new WeixinResult(messageHandler);//v0.8+ } catch (Exception ex) { #region 记录系统日志 try { Szx_Sys_Log log = new Szx_Sys_Log() { LogID = Guid.NewGuid().ToString("N"), LogName = "微信消息处理", Source = "01", LevelCode = 2, RequestUrl = HttpContext.Request.Url.ToString(), LogDate = DateTime.Now, Message = "处理异常:" + ex.Message, Create_Id = "wxjk", Create_Name = "微信接口", Create_Time = DateTime.Now, Create_IP = WebSiteTools.GetRequestIP() }; context.Szx_Sys_Log.Add(log); context.SaveChanges(); } catch (Exception) { } #endregion } } return Content("参数错误!"); }
public ActionResult Index(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token; postModel.EncodingAESKey = EncodingAESKey; postModel.AppId = AppId; var maxRecordCount = 10; var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { messageHandler.Execute(); return new FixWeixinBugWeixinResult(messageHandler); } catch (Exception ex) { #region LogException var logPath = Server.MapPath("~/Error.txt"); using (StreamWriter tw = new StreamWriter(logPath)) { tw.WriteLine("Time:" + DateTime.Now); tw.WriteLine("ExecptionMessage:" + ex.Message); tw.WriteLine(ex.Source); tw.WriteLine(ex.StackTrace); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } if (ex.InnerException != null) { tw.WriteLine("========= InnerException ========="); tw.WriteLine(ex.InnerException.Message); tw.WriteLine(ex.InnerException.Source); tw.WriteLine(ex.InnerException.StackTrace); } tw.Flush(); tw.Close(); } #endregion return Content(""); } }
protected void Page_Load(object sender, EventArgs e) { string signature = Request["signature"]; string timestamp = Request["timestamp"]; string nonce = Request["nonce"]; string echostr = Request["echostr"]; if (Request.HttpMethod == "GET") { //get method - 仅在微信后台填写URL验证时触发 if (CheckSignature.Check(signature, timestamp, nonce, Token)) { WriteContent(echostr); //返回随机字符串则表示验证通过 } else { WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); } Response.End(); } else { // 本地调试时,要把校验关掉 /* //post method - 当有用户向公众账号发送消息时触发 if (!CheckSignature.Check(signature, timestamp, nonce, Token)) { WriteContent("参数错误!"); return; } */ var postModel = new PostModel() { Signature = Request.QueryString["signature"], Msg_Signature = Request.QueryString["msg_signature"], Timestamp = Request.QueryString["timestamp"], Nonce = Request.QueryString["nonce"], //以下保密信息不会(不应该)在网络上传播,请注意 Token = Token, //根据自己后台的设置保持一致??? todo 在微信测试公众号没看到这个值EncodingAESKey? EncodingAESKey = "85777abcddde69d7c44f421c49dfa331", AppId = "wx0f2b65b37835f531"//根据自己后台的设置保持一致 }; //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new dp2MessageHandler(dp2CommandServer.Instance, Request.InputStream, postModel, maxRecordCount); messageHandler.dp2WeiXinAppDir = Server.MapPath("~"); try { //测试时可开启此记录,帮助跟踪数据 //Global.GlobalWeiXinServer.WriteErrorLog(messageHandler.RequestDocument.ToString()); //执行微信处理过程 messageHandler.Execute(); //测试时可开启,帮助跟踪数据 //Global.GlobalWeiXinServer.WriteErrorLog(messageHandler.ResponseDocument.ToString()); // 返回给微信服务器 WriteContent(messageHandler.ResponseDocument.ToString()); return; } catch (Exception ex) { //将程序运行中发生的错误记录到日志 dp2CommandServer.Instance.WriteErrorLog(LibraryChannel.GetExceptionMessage(ex)); if (messageHandler.ResponseDocument != null) { dp2CommandServer.Instance.WriteErrorLog(messageHandler.ResponseDocument.ToString()); } // 返回给微信服务器为空内容 WriteContent(""); } finally { Response.End(); } } }
//<?xml version="1.0" encoding="utf-8"?> //<xml> // <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> // <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> // <CreateTime>1357986928</CreateTime> // <MsgType><![CDATA[text]]></MsgType> // <Content><![CDATA[中文]]></Content> // <MsgId>5832509444155992350</MsgId> //</xml> /// <summary> /// 获取XDocument转换后的IRequestMessageBase实例。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null) { RequestMessageBase requestMessage = null; RequestMsgType msgType; try { msgType = MsgTypeHelper.GetRequestMsgType(doc); switch (msgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); break; case RequestMsgType.Location: requestMessage = new RequestMessageLocation(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.Voice: requestMessage = new RequestMessageVoice(); break; case RequestMsgType.Video: requestMessage = new RequestMessageVideo(); break; case RequestMsgType.Link: requestMessage = new RequestMessageLink(); break; case RequestMsgType.ShortVideo: requestMessage = new RequestMessageShortVideo(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "ENTER"://进入会话 requestMessage = new RequestMessageEvent_Enter(); break; case "LOCATION"://地理位置 requestMessage = new RequestMessageEvent_Location(); break; case "SUBSCRIBE"://订阅(关注) requestMessage = new RequestMessageEvent_Subscribe(); break; case "UNSUBSCRIBE"://取消订阅(关注) requestMessage = new RequestMessageEvent_Unsubscribe(); break; case "CLICK"://菜单点击 requestMessage = new RequestMessageEvent_Click(); break; case "SCAN"://二维码扫描 requestMessage = new RequestMessageEvent_Scan(); break; case "VIEW"://URL跳转 requestMessage = new RequestMessageEvent_View(); break; case "MASSSENDJOBFINISH": requestMessage = new RequestMessageEvent_MassSendJobFinish(); break; case "TEMPLATESENDJOBFINISH"://模板信息 requestMessage = new RequestMessageEvent_TemplateSendJobFinish(); break; case "SCANCODE_PUSH"://扫码推事件(scancode_push) requestMessage = new RequestMessageEvent_Scancode_Push(); break; case "SCANCODE_WAITMSG"://扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg) requestMessage = new RequestMessageEvent_Scancode_Waitmsg(); break; case "PIC_SYSPHOTO"://弹出系统拍照发图(pic_sysphoto) requestMessage = new RequestMessageEvent_Pic_Sysphoto(); break; case "PIC_PHOTO_OR_ALBUM"://弹出拍照或者相册发图(pic_photo_or_album) requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album(); break; case "PIC_WEIXIN"://弹出微信相册发图器(pic_weixin) requestMessage = new RequestMessageEvent_Pic_Weixin(); break; case "LOCATION_SELECT"://弹出地理位置选择器(location_select) requestMessage = new RequestMessageEvent_Location_Select(); break; case "CARD_PASS_CHECK"://卡券通过审核 requestMessage = new RequestMessageEvent_Card_Pass_Check(); break; case "CARD_NOT_PASS_CHECK"://卡券未通过审核 requestMessage = new RequestMessageEvent_Card_Not_Pass_Check(); break; case "USER_GET_CARD"://领取卡券 requestMessage = new RequestMessageEvent_User_Get_Card(); break; case "USER_DEL_CARD"://删除卡券 requestMessage = new RequestMessageEvent_User_Del_Card(); break; case "KF_CREATE_SESSION"://多客服接入会话 requestMessage = new RequestMessageEvent_Kf_Create_Session(); break; case "KF_CLOSE_SESSION"://多客服关闭会话 requestMessage = new RequestMessageEvent_Kf_Close_Session(); break; case "KF_SWITCH_SESSION"://多客服转接会话 requestMessage = new RequestMessageEvent_Kf_Switch_Session(); break; case "POI_CHECK_NOTIFY"://审核结果事件推送 requestMessage = new RequestMessageEvent_Poi_Check_Notify(); break; case "WIFICONNECTED"://Wi-Fi连网成功事件 requestMessage = new RequestMessageEvent_WifiConnected(); break; case "USER_CONSUME_CARD"://卡券核销 requestMessage = new RequestMessageEvent_User_Consume_Card(); break; case "USER_ENTER_SESSION_FROM_CARD"://从卡券进入公众号会话 requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card(); break; case "USER_VIEW_CARD"://进入会员卡 requestMessage = new RequestMessageEvent_User_View_Card(); break; case "MERCHANT_ORDER"://微小店订单付款通知 requestMessage = new RequestMessageEvent_Merchant_Order(); break; case "SUBMIT_MEMBERCARD_USER_INFO"://接收会员信息事件通知 requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info(); break; default://其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } EntityHelper.FillEntityWithXml(requestMessage, doc); } catch (ArgumentException ex) { throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); } return requestMessage; }
/// <summary> /// 返回正确的签名 /// </summary> /// <param name="postModel">需要提供:Timestamp、Nonce、Token</param> /// <returns></returns> public static string GetSignature(PostModel postModel) { return GetSignature(postModel.Timestamp, postModel.Nonce, postModel.Token); }
private readonly string Token = "wvqusrtg"; //与微信公众账号后台的Token设置保持一致,区分大小写。 #endregion Fields #region Methods protected void Page_Load(object sender, EventArgs e) { string signature = Request["signature"]; string timestamp = Request["timestamp"]; string nonce = Request["nonce"]; string echostr = Request["echostr"]; if (Request.HttpMethod == "GET") { //get method - 仅在微信后台填写URL验证时触发 if (CheckSignature.Check(signature, timestamp, nonce, Token)) { WriteContent(echostr); //返回随机字符串则表示验证通过 } else { WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" + "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。(六九城微信开发:倪新生)"); } Response.End(); } else { //post method - 当有用户想公众账号发送消息时触发 if (!CheckSignature.Check(signature, timestamp, nonce, Token)) { WriteContent("参数错误!"); return; } //post method - 当有用户想公众账号发送消息时触发 var postModel = new PostModel() { Signature = Request.QueryString["signature"], Msg_Signature = Request.QueryString["msg_signature"], Timestamp = Request.QueryString["timestamp"], Nonce = Request.QueryString["nonce"], //以下保密信息不会(不应该)在网络上传播,请注意 Token = Token, //如下公众平台里找到相应信息 EncodingAESKey = "ACcrkBQlVwzkvUGb8N50XpYmGx4N9gtjllvP0NJtNCo",//根据自己后台的设置保持一致 AppId = "wx8115a513a4159ea2"//根据自己后台的设置保持一致 }; //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。 messageHandler.RequestDocument.Save( Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + messageHandler.RequestMessage.FromUserName + ".txt")); //执行微信处理过程 messageHandler.Execute(); //测试时可开启,帮助跟踪数据 messageHandler.ResponseDocument.Save( Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + messageHandler.ResponseMessage.ToUserName + ".txt")); WriteContent(messageHandler.ResponseDocument.ToString()); return; } catch (Exception ex) { using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt"))) { tw.WriteLine(ex.Message); tw.WriteLine(ex.InnerException.Message); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } tw.Flush(); tw.Close(); } } finally { Response.End(); } } }
public ActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token; postModel.EncodingAESKey = "YTJkZmVjMzQ5NDU5NDY3MDhiZWI0NTdiMjFiY2I5MmU";//根据自己后台的设置保持一致 postModel.AppId = "wx669ef95216eef885";//根据自己后台的设置保持一致 //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。 messageHandler.RequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + messageHandler.RequestMessage.FromUserName + ".txt")); if (messageHandler.UsingEcryptMessage) { messageHandler.EcryptRequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_Ecrypt_" + messageHandler.RequestMessage.FromUserName + ".txt")); } /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ messageHandler.OmitRepeatedMessage = true; //执行微信处理过程 messageHandler.Execute(); //测试时可开启,帮助跟踪数据 messageHandler.ResponseDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + messageHandler.ResponseMessage.ToUserName + ".txt")); if (messageHandler.UsingEcryptMessage) { //记录加密后的响应信息 messageHandler.FinalResponseDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_Final_" + messageHandler.ResponseMessage.ToUserName + ".txt")); } //return Content(messageHandler.ResponseDocument.ToString());//v0.7- return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 //return new WeixinResult(messageHandler);//v0.8+ } catch (Exception ex) { using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt"))) { tw.WriteLine("ExecptionMessage:" + ex.Message); tw.WriteLine(ex.Source); tw.WriteLine(ex.StackTrace); //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } tw.Flush(); tw.Close(); } return Content(""); } }
private static readonly string _urlVote = ConfigurationManager.AppSettings["UrlVote"]; //投票大赛的地址 #endregion Fields #region Methods /// <summary> /// 获取XDocument转换后的IRequestMessageBase实例。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IRequestMessageBase GetRequestEntity(IWeChatManagementService service, XDocument doc, PostModel postModel = null) { RequestMessageBase requestMessage = null; RequestMsgType msgType; try { msgType = MsgTypeHelper.GetRequestMsgType(doc); switch (msgType) { case RequestMsgType.Text: requestMessage = new RequestMessageText(); requestMessage.FillEntityWithXml(doc); /*tim update by 2016-03-31*/ var rMessage = (RequestMessageText) requestMessage; //回复手机号重新绑定到会员 var b = System.Text.RegularExpressions.Regex.IsMatch(rMessage.Content.Trim(), @"^1[3|4|5|8][0-9]\d{8}$"); if (b) { var customerService = ServiceLocatorFactory.GetServiceLocator().GetService<ICustomerManagementService>(); var result = customerService.RebindFans(new CustRebindFansModel { Openid = rMessage.FromUserName, Mobile = rMessage.Content }); LoggerFactories.CreateLogger() .Write($"rebind result:{result.errcode}", TraceEventType.Information); } else { //处理投票活动消息 var result = HandleVote(rMessage.Content, requestMessage.FromUserName); if (result) { return requestMessage; } CustomApi.SendText(AppID, requestMessage.FromUserName, "感谢您的回复,玖伍淘车会尽快回复您。"); } break; case RequestMsgType.Location: requestMessage = new RequestMessageLocation(); break; case RequestMsgType.Image: requestMessage = new RequestMessageImage(); break; case RequestMsgType.Voice: requestMessage = new RequestMessageVoice(); break; case RequestMsgType.Video: requestMessage = new RequestMessageVideo(); break; case RequestMsgType.Link: requestMessage = new RequestMessageLink(); break; case RequestMsgType.ShortVideo: requestMessage = new RequestMessageShortVideo(); break; case RequestMsgType.Event: //判断Event类型 switch (doc.Root.Element("Event").Value.ToUpper()) { case "ENTER": //进入会话 requestMessage = new RequestMessageEvent_Enter(); break; case "LOCATION": //地理位置 requestMessage = new RequestMessageEvent_Location(); break; case "SUBSCRIBE": //订阅(关注) requestMessage = new RequestMessageEvent_Subscribe(); EntityHelper.FillEntityWithXml(requestMessage, doc); var taskSubscribe = new Task(() => { service.GenerateWechatFriend(AppID, requestMessage.FromUserName, true); }); taskSubscribe.Start(); var slogan = _slogan.Replace("\\n", Environment.NewLine); //"\n\n<a src=''>点击参加玖伍淘车首届“/强绝代车王/强”微信自拍投票大赛<a/>"; var btnContent = ConfigurationManager.AppSettings["BtnContent"]; var tourl = $"https://open.weixin.qq.com/connect/oauth2/authorize?appid={AppID}&redirect_uri={_urlVote}&response_type=code&scope=snsapi_base&state=vote&connect_redirect=1#wechat_redirect"; btnContent = $"<a href=\"{tourl}\">{btnContent}</a>"; slogan = string.Concat(slogan, Environment.NewLine, btnContent); CustomApi.SendText(AppID, requestMessage.FromUserName, slogan); //判断是否扫描场景二维码关注 var xElement = doc.Root.Element("EventKey"); if (xElement != null && xElement.Value.Contains("qrscene_")) { var code = xElement.Value.Replace("qrscene_", ""); service.UpdateWechatFriendQrScene(requestMessage.FromUserName, code, AppID); } break; case "UNSUBSCRIBE": //取消订阅(关注) requestMessage = new RequestMessageEvent_Unsubscribe(); EntityHelper.FillEntityWithXml(requestMessage, doc); service.UpdateWechatFriendUnSubscribe(AppID, requestMessage.FromUserName); var activityservice = ServiceLocatorFactory.GetServiceLocator().GetService<IActivityManagementService>(); activityservice.UnSubscribe(AppID, requestMessage.FromUserName); break; case "CLICK": //菜单点击 requestMessage = new RequestMessageEvent_Click(); break; case "SCAN": //二维码扫描 requestMessage = new RequestMessageEvent_Scan(); break; case "VIEW": //URL跳转 requestMessage = new RequestMessageEvent_View(); break; case "MASSSENDJOBFINISH": requestMessage = new RequestMessageEvent_MassSendJobFinish(); break; case "TEMPLATESENDJOBFINISH": //模板信息 requestMessage = new RequestMessageEvent_TemplateSendJobFinish(); break; case "SCANCODE_PUSH": //扫码推事件(scancode_push) requestMessage = new RequestMessageEvent_Scancode_Push(); break; case "SCANCODE_WAITMSG": //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg) requestMessage = new RequestMessageEvent_Scancode_Waitmsg(); break; case "PIC_SYSPHOTO": //弹出系统拍照发图(pic_sysphoto) requestMessage = new RequestMessageEvent_Pic_Sysphoto(); break; case "PIC_PHOTO_OR_ALBUM": //弹出拍照或者相册发图(pic_photo_or_album) requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album(); break; case "PIC_WEIXIN": //弹出微信相册发图器(pic_weixin) requestMessage = new RequestMessageEvent_Pic_Weixin(); break; case "LOCATION_SELECT": //弹出地理位置选择器(location_select) requestMessage = new RequestMessageEvent_Location_Select(); break; case "CARD_PASS_CHECK": //卡券通过审核 requestMessage = new RequestMessageEvent_Card_Pass_Check(); break; case "CARD_NOT_PASS_CHECK": //卡券未通过审核 requestMessage = new RequestMessageEvent_Card_Not_Pass_Check(); break; case "USER_GET_CARD": //领取卡券 requestMessage = new RequestMessageEvent_User_Get_Card(); break; case "USER_DEL_CARD": //删除卡券 requestMessage = new RequestMessageEvent_User_Del_Card(); break; case "KF_CREATE_SESSION": //多客服接入会话 requestMessage = new RequestMessageEvent_Kf_Create_Session(); break; case "KF_CLOSE_SESSION": //多客服关闭会话 requestMessage = new RequestMessageEvent_Kf_Close_Session(); break; case "KF_SWITCH_SESSION": //多客服转接会话 requestMessage = new RequestMessageEvent_Kf_Switch_Session(); break; case "POI_CHECK_NOTIFY": //审核结果事件推送 requestMessage = new RequestMessageEvent_Poi_Check_Notify(); break; case "WIFICONNECTED": //Wi-Fi连网成功事件 requestMessage = new RequestMessageEvent_WifiConnected(); break; case "USER_CONSUME_CARD": //卡券核销 requestMessage = new RequestMessageEvent_User_Consume_Card(); break; case "USER_ENTER_SESSION_FROM_CARD": //从卡券进入公众号会话 requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card(); break; case "USER_VIEW_CARD": //进入会员卡 requestMessage = new RequestMessageEvent_User_View_Card(); break; case "MERCHANT_ORDER": //微小店订单付款通知 requestMessage = new RequestMessageEvent_Merchant_Order(); var merchantOrderresult = (RequestMessageEvent_Merchant_Order) requestMessage; EntityHelper.FillEntityWithXml(requestMessage, doc); var orderresult = OrderApi.GetByIdOrder(AppID, merchantOrderresult.OrderId); if (orderresult.errcode == ReturnCode.请求成功) { var rewardsManagementService = ServiceLocatorFactory.GetServiceLocator() .GetService<IRewardsManagementService>(); var wholesaleCouponresult = rewardsManagementService.WholesaleCoupon(new CouponBuyModel() { //ProductId = orderresult.order.product_id, //OrderId = orderresult.order.order_id, //Accountid = AppID, //Number = orderresult.order.product_count, //Openid = orderresult.order.buyer_openid Order = orderresult.order }); var text = JsonConvert.SerializeObject(orderresult.order); var logresult = $"MERCHANT_ORDER:{text} result:{JsonConvert.SerializeObject(wholesaleCouponresult)}"; LoggerFactories.CreateLogger().Write(logresult, TraceEventType.Information); } break; case "SUBMIT_MEMBERCARD_USER_INFO": //接收会员信息事件通知 requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info(); break; case "SHAKEAROUNDUSERSHAKE": //摇一摇事件通知 requestMessage = new RequestMessageEvent_ShakearoundUserShake(); break; default: //其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); break; } break; default: throw new UnknownRequestMsgTypeException( $"MsgType:{msgType} 在RequestMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException()); //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 } } catch (ArgumentException ex) { //throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); LoggerFactories.CreateLogger() .Write($"RequestMessage转换出错!可能是MsgType不存在!,XML:{doc}", TraceEventType.Error, ex); } return requestMessage; }
public void MessageContextRecordLimtTest() { //测试MessageContext的数量限制 var xml = string.Format(string.Format(xmlTextFormat, "测试限制"), DateTimeHelper.GetWeixinDateTime(DateTime.Now)); for (int i = 0; i < 100; i++) { Init(xml);//初始化 var timestamp = "itsafaketimestamp"; var nonce = "whateveryouwant"; var signature = CheckSignature.GetSignature(timestamp, nonce, WeixinController.Token); var postModel = new PostModel() { Signature = signature, Timestamp = timestamp, Nonce = nonce }; var actual = target.MiniPost(postModel) as FixWeixinBugWeixinResult; Assert.IsNotNull(actual); } Assert.AreEqual(1, MessageHandler<MessageContext<IRequestMessageBase,IResponseMessageBase>>.GlobalWeixinContext.MessageQueue.Count); var weixinContext = MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>.GlobalWeixinContext.MessageQueue[0]; var recordCount = MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>.GlobalWeixinContext.MaxRecordCount; Assert.AreEqual(recordCount, weixinContext.RequestMessages.Count); Assert.AreEqual(recordCount, weixinContext.ResponseMessages.Count); }
public void MessageAgent_MemberTest() { //按钮测试-会员 var xml = string.Format(string.Format(xmlEvent_ClickFormat, "Member"), DateTimeHelper.GetWeixinDateTime(DateTime.Now)); Init(xml);//初始化 var timestamp = "itsafaketimestamp"; var nonce = "whateveryouwant"; var signature = Senparc.Weixin.MP.CheckSignature.GetSignature(timestamp, nonce, WeixinController.Token); var postModel = new PostModel() { Signature = signature, Timestamp = timestamp, Nonce = nonce }; var actual = target.MiniPost(postModel) as FixWeixinBugWeixinResult; Assert.IsNotNull(actual); Console.WriteLine(actual.Content); }
/// <summary> /// 测试不同类型的请求 /// </summary> /// <param name="xml">微信发过来的xml原文</param> private void PostTest(string xml) { Init(xml);//初始化 var timestamp = "itsafaketimestamp"; var nonce = "whateveryouwant"; var signature = Senparc.Weixin.MP.CheckSignature.GetSignature(timestamp, nonce, WeixinController.Token); DateTime st = DateTime.Now; //这里使用MiniPost,绕过日志记录 var postModel = new PostModel() { Signature = signature, Timestamp=timestamp, Nonce = nonce, }; var actual = target.MiniPost(postModel) as FixWeixinBugWeixinResult; DateTime et = DateTime.Now; Assert.IsNotNull(actual); Assert.IsNotNull(actual.Content); Console.WriteLine(actual.Content); Console.WriteLine("页面用时(ms):" + (et - st).TotalMilliseconds); }
public ActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token;//根据自己后台的设置保持一致 postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致 postModel.AppId = AppId;//根据自己后台的设置保持一致 //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; var logPath = Server.MapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd"))); if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。 messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); if (messageHandler.UsingEcryptMessage) { messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); } /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ messageHandler.OmitRepeatedMessage = true; //执行微信处理过程 messageHandler.Execute(); //测试时可开启,帮助跟踪数据 //if (messageHandler.ResponseDocument == null) //{ // throw new Exception(messageHandler.RequestDocument.ToString()); //} if (messageHandler.ResponseDocument != null) { messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); } if (messageHandler.UsingEcryptMessage) { //记录加密后的响应信息 messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); } //return Content(messageHandler.ResponseDocument.ToString());//v0.7- return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 //return new WeixinResult(messageHandler);//v0.8+ } catch (Exception ex) { using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt"))) { tw.WriteLine("ExecptionMessage:" + ex.Message); tw.WriteLine(ex.Source); tw.WriteLine(ex.StackTrace); //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } if (ex.InnerException != null) { tw.WriteLine("========= InnerException ========="); tw.WriteLine(ex.InnerException.Message); tw.WriteLine(ex.InnerException.Source); tw.WriteLine(ex.InnerException.StackTrace); } tw.Flush(); tw.Close(); } return Content(""); } }
public ActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content("参数错误!"); } postModel.Token = Token; postModel.AppId = AppId; postModel.EncodingAESKey = EncodingAESKey; int maxRecordContent = 20;//每个人上下文消息存储的最大数量。 string logPath = Server.MapPath(string.Format("~App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd"))); if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordContent); try { messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ messageHandler.OmitRepeatedMessage = false; messageHandler.Execute();//执行微信处理过程 //测试时可开启,帮助跟踪数据 //if (messageHandler.ResponseDocument == null) //{ // throw new Exception(messageHandler.RequestDocument.ToString()); //} if (messageHandler.ResponseMessage != null) { messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); } if (messageHandler.UsingEcryptMessage) { //记录加密后的响应信息 messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName))); } return new FixWeixinBugWeixinResult(messageHandler); } catch (Exception ex) { using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt"))) { tw.WriteLine("ExecptionMessage:" + ex.Message); tw.WriteLine(ex.Source); tw.WriteLine(ex.StackTrace); //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } if (ex.InnerException != null) { tw.WriteLine("========= InnerException ========="); tw.WriteLine(ex.InnerException.Message); tw.WriteLine(ex.InnerException.Source); tw.WriteLine(ex.InnerException.StackTrace); } tw.Flush(); tw.Close(); } return Content(""); } }