DecryptMsg() public method

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
            };
        }
Beispiel #3
0
 /// <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;
        }