public DecryptMsg ( string sMsgSignature, string sTimeStamp, string sNonce, string sPostData, string &sMsg ) : int | ||
sMsgSignature | string | |
sTimeStamp | string | |
sNonce | string | |
sPostData | string | |
sMsg | string | |
return | int |
/// <summary> /// ���á� /// </summary> /// <param name="context">���������ġ�</param> /// <returns>����</returns> public override Task Invoke(IHandlerContext context) { var request = context.Request; var dependencyResolver = context.GetDependencyResolver(); var requestMessageFactory = dependencyResolver.GetService<IRequestMessageFactory>(); var content = Encoding.UTF8.GetString(request.InputStream.ReadBytes()); #region Decrypt var encryptType = request.QueryString["encrypt_type"]; if (encryptType != null) { var nonce = request.QueryString["nonce"]; var signature = request.QueryString["msg_signature"]; var timestamp = request.QueryString["timestamp"]; var baseInfo = context.GetMessageHandlerBaseInfo(); var appId = baseInfo.AppId; var encodingAesKey = baseInfo.EncodingAesKey; var token = baseInfo.Token; var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId); wxBizMsgCrypt.DecryptMsg(signature, timestamp, nonce, content, ref content); } #endregion Decrypt context.SetRequestMessage(requestMessageFactory.CreateRequestMessage(content)); return Next.Invoke(context); }
public ActionResult Post(string signature, string timestamp, string nonce, string echostr) { WeixinMessage message = null; var safeMode = Request.QueryString.Get("encrypt_type") == "aes"; using (var streamReader = new StreamReader(Request.InputStream)) { var decryptMsg = string.Empty; var msg = streamReader.ReadToEnd(); #region 解密 if (safeMode) { var msg_signature = Request.QueryString.Get("msg_signature"); var wxBizMsgCrypt = new WXBizMsgCrypt(WeixinConfig.Token, WeixinConfig.EncodingAESKey, WeixinConfig.AppID); var ret = wxBizMsgCrypt.DecryptMsg(msg_signature, timestamp, nonce, msg, ref decryptMsg); if (ret != 0)//解密失败 { //TODO:开发者解密失败的业务处理逻辑 //注意:本demo用log4net记录此信息,你可以用其他方法 LogWriter.Default.WriteError(string.Format("decrypt message return {0}, request body {1}", ret, msg)); } } else { decryptMsg = msg; } #endregion message = AcceptMessageAPI.Parse(decryptMsg); } var response = new WeixinExecutor().Execute(message); var encryptMsg = string.Empty; #region 加密 if (safeMode) { var msg_signature = Request.QueryString.Get("msg_signature"); var wxBizMsgCrypt = new WXBizMsgCrypt(WeixinConfig.Token, WeixinConfig.EncodingAESKey, WeixinConfig.AppID); var ret = wxBizMsgCrypt.EncryptMsg(response, timestamp, nonce, ref encryptMsg); if (ret != 0)//加密失败 { //TODO:开发者加密失败的业务处理逻辑 LogWriter.Default.WriteError(string.Format("encrypt message return {0}, response body {1}", ret, response)); } } else { encryptMsg = response; } #endregion return new ContentResult { Content = encryptMsg, ContentType = "text/xml", ContentEncoding = System.Text.UTF8Encoding.UTF8 }; }
/// <summary> /// 微信后台消息POST处理函数 /// </summary> /// <param name="id">微信公众号ID,系统可以托管多个公众号,用于区分各个公众号</param> /// <param name="msg_signature">微信后台发过来的签名参数,用于验证是否是微信服务器发的消息</param> /// <param name="timestamp">微信后台发过来的签名参数,用于验证是否是微信服务器发的消息</param> /// <param name="nonce">微信后台发过来的签名参数,用于验证是否是微信服务器发的消息</param> /// <param name="msg">微信POST请求中的消息主体内容,后台会自动用XMLFORMATER反序列化</param> /// <returns></returns> public HttpResponseMessage Post(string id, string msg_signature, string timestamp, string nonce) { try { var wx = WXManager.Current[id]; if (wx != null) { var wxcpt = new Tencent.WXBizMsgCrypt(wx.Token, wx.EncodingAESKey, wx.AppID); var content = Request.Content.ReadAsStringAsync().Result; string xml = ""; // 解析之后的明文 var ret = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, content, ref xml); if (ret == 0) { var stream = new StringReader(xml); WXRequestMsg msg = new XmlSerializer(typeof(WXRequestMsg)).Deserialize(stream) as WXRequestMsg; if (msg != null) { var res = new WXRequestHandler(this.Request).HandleMsg(id, msg); if (res != null) { var response = Request.CreateResponse(); string sRespData = res.ToXML(); string sEncryptMsg = ""; //xml格式的密文 ret = wxcpt.EncryptMsg(sRespData, timestamp, nonce, ref sEncryptMsg); if (ret == 0) { response.Content = new StringContent(sEncryptMsg); return(response); } } } } } } catch (Exception ex) { } return(Request.CreateResponse()); }
public XDocument Init() { //解密XML信息 var postDataStr = EcryptRequestDocument.ToString(); WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return null; } RequestDocument = XDocument.Parse(msgXml);//完成解密 RequestMessage = RequestMessageFactory.GetRequestEntity(RequestDocument); //((RequestMessageBase)RequestMessage).FillEntityWithXml(RequestDocument); return RequestDocument; }
public void ProcessRequest(HttpContext context) { Log.WriteDebug("ProcessRequest start"); try { Stream stream = context.Request.InputStream; byte[] byteArray = new byte[stream.Length]; stream.Read(byteArray, 0, (int)stream.Length); string postXmlStr = System.Text.Encoding.UTF8.GetString(byteArray); Log.WriteDebug("1"); if (!string.IsNullOrEmpty(postXmlStr)) { Log.WriteDebug("IsNullOrEmpty"); XmlDocument doc = new XmlDocument(); doc.LoadXml(postXmlStr); if (string.IsNullOrWhiteSpace(sToken)) { Log.WriteDebug("string.IsNullOrWhiteSpace(sToken)"); DataTable dt = ConfigDal.GetConfig(WXMsgUtil.GetFromXML(doc, "ToUserName")); DataRow dr = dt.Rows[0]; sToken = dr["Token"].ToString(); sAppID = dr["AppID"].ToString(); sEncodingAESKey = dr["EncodingAESKey"].ToString(); Log.WriteDebug(sToken + "\r\n" + sAppID + "\r\n" + sEncodingAESKey + "\r\n"); } Log.WriteDebug("2"); if (!string.IsNullOrWhiteSpace(sAppID)) //没有AppID则不解密(订阅号没有AppID) { Log.WriteDebug("!string.IsNullOrWhiteSpace(sAppID)"); //解密 WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID); string signature = context.Request["msg_signature"]; string timestamp = context.Request["timestamp"]; string nonce = context.Request["nonce"]; Log.WriteDebug(signature + "\r\n" + timestamp + "\r\n" + nonce + "\r\n"); string stmp = ""; int ret = wxcpt.DecryptMsg(signature, timestamp, nonce, postXmlStr, ref stmp); if (ret == 0) { doc = new XmlDocument(); doc.LoadXml(stmp); try { Log.WriteDebug("3"); responseMsg(context, doc); } catch (Exception ex) { //FileLogger.WriteErrorLog(context, ex.Message); Log.WriteError(ex.Message); } } else { //FileLogger.WriteErrorLog(context, "解密失败,错误码:" + ret); Log.WriteError("解密失败,错误码:" + ret); } } else { Log.WriteDebug("responseMsg(context, doc);"); responseMsg(context, doc); } } else { Log.WriteError("valid(context);"); valid(context); } } catch (Exception ex) { //FileLogger.WriteErrorLog(context, ex.Message); Log.WriteError("ProcessRequest" + context.ToString() + ex.Message); } }
public XDocument Init() { //解密XML信息 var postDataStr = EcryptRequestDocument.ToString(); WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId); string msgXml = null; var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml); //判断result类型 if (result != 0) { //验证没有通过,取消执行 CancelExcute = true; return null; } RequestDocument = XDocument.Parse(msgXml);//完成解密 RequestMessage = RequestMessageFactory.GetRequestEntity(RequestDocument); //转成实体 RequestMessageBase requestMessage = null; RequestInfoType infoType; try { infoType = InfoTypeHelper.GetRequestInfoType(RequestDocument); switch (infoType) { case RequestInfoType.component_verify_ticket: requestMessage = new RequestMessageComponentVerifyTicket(); break; case RequestInfoType.unauthorized: requestMessage = new RequestMessageUnauthorized(); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception ex) { //此处可以记录日志 throw; } requestMessage.FillEntityWithXml(RequestDocument); RequestMessage = requestMessage; return RequestDocument; }