Example #1
0
        /// <summary>
        /// 加密信息
        /// </summary>
        /// <param name="sTimeStamp"></param>
        /// <param name="sNonce"></param>
        /// <param name="postStr"></param>
        /// <returns></returns>
        private string EncryptMsg(string sTimeStamp, string sNonce, string postStr)
        {
            string strReuslt = postStr;

            string[] tempArray = Regex.Split(postStr, "!@!");
            try
            {
                log.Debug("before EncryptMsg:" + strReuslt);
                if (isDES && (!"success".Equals(tempArray[0])))
                {
                    int ret = 0;
                    ret = wxcpt.EncryptMsg(postStr, sTimeStamp, sNonce, ref strReuslt);
                    log.Debug("PubCore EncryptMsg Msg:" + strReuslt);
                    if (ret != 0)
                    {
                        log.Info("PubCore EncryptMsg failed");
                    }
                }
                if (tempArray.Length == 2)
                {
                    strReuslt = tempArray[1];
                }
                return(strReuslt);
            }
            catch (Exception e)
            {
                log.Error("PubCore EncryptMsg:", e);
                return(strReuslt);
            }
        }
        public string Handle(XMLMessageUrlParameter parameter, string postString)
        {
            //注意不能返回空白 Content 的XML给微信 API
            //否则它会在客户端提示该公众号暂时无法提供服务

            _log.Write("收到消息推送(密文)", postString, TraceEventType.Verbose);

            string message = String.Empty;

            int decryptResult =
                _msgCrypt.DecryptMsg(parameter.Msg_signature, parameter.Timestamp, parameter.Nonce,
                                     postString, ref message);

            _log.Write("收到消息推送(明文)", message, TraceEventType.Verbose);

            string returnMessage = _messageReceiver.Handle(message, this);

            _log.Write("返回消息(明文)", returnMessage, TraceEventType.Verbose);

            string encryptMessage = null;

            if (String.IsNullOrEmpty(returnMessage) == false)
            {
                _msgCrypt.EncryptMsg(returnMessage,
                                     parameter.Timestamp, parameter.Nonce, ref encryptMessage);
            }

            _log.Write("返回消息(密文)", encryptMessage, TraceEventType.Verbose);

            return(encryptMessage);
        }
        /// <summary>
        /// 返回XML格式的响应消息
        /// </summary>
        /// <param name="encryptType">消息加密类型</param>
        /// <returns>返回XML格式的响应消息</returns>
        public string ToXml(MessageEncryptTypeEnum encryptType)
        {
            int WXBizMsgCrypt_OK = 0;
            //得到未加密的XML响应消息
            string xml = ToXml();

            //如果需要加密,加密消息
            if (encryptType == MessageEncryptTypeEnum.aes)
            {
                int         timeStamp = Utility.ToWeixinTime(CreateTime);
                Random      random    = new Random();
                string      nonce     = random.Next().ToString();
                AccountInfo account   = AccountInfoCollection.GetAccountInfo(FromUserName);
                if (account != null)
                {
                    WXBizMsgCrypt wxcpt      = new WXBizMsgCrypt(account.Token, account.EncodingAESKey, account.AppId);
                    string        xmlEncrypt = "";
                    //加密消息
                    if (wxcpt.EncryptMsg(xml, timeStamp.ToString(), nonce, ref xmlEncrypt) == WXBizMsgCrypt_OK)
                    {
                        return(xmlEncrypt);
                    }
                }
            }
            return(xml);
        }
Example #4
0
        public string Handler(string requestBody, bool needEncrypt = false)
        {
            var message = Parse(requestBody);

            try
            {
                if (_customHandle == null)
                {
                    return("");
                }
                string result = _customHandle(message).ToString();

                if (needEncrypt)
                {
                    var    crypt         = new WXBizMsgCrypt(_options);
                    string timestamp     = (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds.ToString("N0");
                    string nonce         = Guid.NewGuid().ToString("N");
                    string cryptograph   = string.Empty;
                    int    encryptResult = crypt.EncryptMsg(result, timestamp, nonce, ref cryptograph);
                    if (encryptResult != 0)
                    {
                        throw new SmartWeChatException("加密失败");
                    }
                    return(cryptograph);
                }

                return(result);
            }
            catch (Exception e)
            {
                _logger.LogError(new SmartWeChatException(e), "handle failure");
                return("failure");
            }
        }
Example #5
0
        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
            });
        }
Example #6
0
        /// <summary>
        /// Encrypts the message.
        /// </summary>
        /// <param name="appId">The component application identifier.</param>
        /// <param name="appToken">The application token.</param>
        /// <param name="encodingAesKey">The encoding aes key.</param>
        /// <param name="xmlMessage">The XML message.</param>
        /// <param name="timestamp">The timestamp.</param>
        /// <param name="nonce">The nonce.</param>
        /// <returns></returns>
        public static string EncryptMessage(string appId, string appToken, string encodingAesKey, string xmlMessage, string timestamp, string nonce)
        {
            var           result        = "";
            WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(appToken, encodingAesKey, appId);
            var           ret           = wxBizMsgCrypt.EncryptMsg(xmlMessage, timestamp, nonce, ref result);

            return(result);
        }
Example #7
0
        /// <summary>
        /// 加密消息
        /// </summary>
        /// <param name="token"></param>
        /// <param name="encodingAESKey"></param>
        /// <param name="corpId"></param>
        /// <param name="replyMsg"></param>
        /// <param name="timeStamp"></param>
        /// <param name="nonce"></param>
        /// <returns></returns>
        public static string EncryptMsg(string token, string encodingAESKey, string corpId, string replyMsg, string timeStamp, string nonce)
        {
            WXBizMsgCrypt crypt      = new WXBizMsgCrypt(token, encodingAESKey, corpId);
            string        encryptMsg = null;
            var           result     = crypt.EncryptMsg(replyMsg, timeStamp, nonce, ref encryptMsg);

            return(encryptMsg);
        }
Example #8
0
        public bool ResponseModel(WxMessageRecXmlModel ReciveModel, ref string sEncryptMsg)
        {
            WxMessageResXmlModel replyMsg = ResponseModel(ReciveModel);
            string timeStamp = "";
            string nonce     = "";

            WxDecode.EncryptMsg(GetResponse(replyMsg), timeStamp, nonce, ref sEncryptMsg);
            return(true);
        }
Example #9
0
        /// <summary>
        /// 微信对接 post 接口入口
        /// </summary>
        /// <returns></returns>
        public async Task <ActionResult> Api(string id, WechatApiReqModel reqModel)
        {
            var wechatAdmin = await _wechatAdminApp.GetWechatAdminByAccountName(id);

            if (wechatAdmin != null)
            {
                if (checkSignature(wechatAdmin.Token, reqModel))
                {
                    //处理消息
                    if (reqModel.echostr.IsEmpty())
                    {
                        WXBizMsgCrypt crypt          = new WXBizMsgCrypt(wechatAdmin.Token, wechatAdmin.EncodingAESKey, wechatAdmin.AppId);
                        string        requestData    = string.Empty;
                        string        refRequestData = string.Empty;
                        using (var streamRead = new System.IO.StreamReader(Request.InputStream))
                        {
                            requestData = await new System.IO.StreamReader(Request.InputStream).ReadToEndAsync();
                        }
                        //解密
                        int cryptResult = crypt.DecryptMsg(reqModel.msg_signature, reqModel.timestamp, reqModel.nonce, requestData, ref refRequestData);
                        if (cryptResult != 0)
                        {
                            return(Content("success"));
                        }
                        XmlDocument xmldoc = new XmlDocument();
                        xmldoc.LoadXml(refRequestData);
                        Dictionary <string, string> resultDic = new Dictionary <string, string>();
                        foreach (XmlNode item in xmldoc.SelectSingleNode("xml").ChildNodes)
                        {
                            resultDic.Add(item.Name, item.InnerText);
                        }

                        await _wechatRequestLogApp.Insert(new Domain.Entity.T_Wechat_RequestLog()
                        {
                            WechatAdminId  = wechatAdmin.ID,
                            MsgId          = resultDic["MsgId"],
                            FromUserName   = resultDic["FromUserName"],
                            FromCreateTime = resultDic["CreateTime"],
                            MsgType        = resultDic["MsgType"],
                            Content        = resultDic["Content"]
                        });

                        string result = string.Empty, refResult = string.Empty;
                        HandlerWebChatMessage.StartHanlder(resultDic, out result);
                        crypt.EncryptMsg(result, reqModel.timestamp, reqModel.nonce, ref refResult);
                        return(Content(refResult));
                    }
                    else
                    {
                        //echostr 不为空则是微信接入请求返回echostr
                        return(Content(reqModel.echostr));
                    }
                }
            }
            return(Content("error-401"));
        }
Example #10
0
        /// <summary>
        /// 将企业号回复用户的消息加密打包
        /// </summary>
        /// <param name="sReplyMsg">企业号待回复用户的消息,xml格式的字符串</param>
        /// <param name="sTimeStamp">时间戳,可以自己生成,也可以用URL参数的timestamp</param>
        /// <param name="sNonce">随机串,可以自己生成,也可以用URL参数的nonce</param>
        /// <returns>返回加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串</returns>
        public string EncryptMsg(string sReplyMsg, string sTimeStamp, string sNonce)
        {
            WXBizMsgCrypt wXBizMsgCrypt = new WXBizMsgCrypt(configModel.Token, configModel.EncodingAESKey, configModel.AppId);

            string sEncryptMsg = null;

            wXBizMsgCrypt.EncryptMsg(sReplyMsg, sTimeStamp, sNonce, ref sEncryptMsg);

            return(sEncryptMsg);
        }
Example #11
0
 private void Response(EnterParam param, string data)
 {
     if (param.IsAes)
     {
         var wxcpt = new WXBizMsgCrypt(param.token, param.EncodingAESKey, param.appid);
         wxcpt.EncryptMsg(data, Utils.ConvertDateTimeInt(DateTime.Now).ToString(), Utils.ConvertDateTimeInt(DateTime.Now).ToString(), ref data);
     }
     HttpContext.Current.Response.Write(data);
     HttpContext.Current.Response.End();
 }
Example #12
0
        public void Index()
        {
            string echoString = HttpContext.Current.Request.QueryString["echoStr"];
            string signature  = HttpContext.Current.Request.QueryString["signature"];
            string timestamp  = HttpContext.Current.Request.QueryString["timestamp"];
            string nonce      = HttpContext.Current.Request.QueryString["nonce"];

            //WriteLog("echoString:" + echoString + "---signature:" + signature + "---timestamp:" + timestamp + "---nonce:" + nonce);
            if (string.IsNullOrEmpty(echoString))
            {
                if (WeChatHelper.CheckSignature(signature, timestamp, nonce))
                {
                    string postString = string.Empty;
                    if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                    {
                        //读取流消息
                        using (Stream stream = HttpContext.Current.Request.InputStream)
                        {
                            Byte[] postBytes = new Byte[stream.Length];
                            stream.Read(postBytes, 0, (Int32)stream.Length);
                            postString = Encoding.UTF8.GetString(postBytes);
                            MessageHelp help = new MessageHelp();
                            help.ToKen = GetToken();
                            string responseContent = string.Empty;
                            //判断是否加密
                            bool IsAes = HttpContext.Current.Request.QueryString["encrypt_type"] == "aes" ? true : false;
                            if (IsAes)
                            {
                                string        msg_signature = HttpContext.Current.Request.QueryString["msg_signature"];
                                WXBizMsgCrypt wmc           = new WXBizMsgCrypt(WeChatConfig.Token, WeChatConfig.EncodingAESKey, WeChatConfig.AppId);
                                string        decmsg        = string.Empty; //解密后
                                int           decnum        = wmc.DecryptMsg(msg_signature, timestamp, nonce, postString, ref postString);
                                if (decnum == 0)
                                {
                                    wmc.EncryptMsg(help.ReturnMessage(postString), timestamp, nonce, ref responseContent);
                                }
                            }
                            else
                            {
                                responseContent = help.ReturnMessage(postString);
                            }
                            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                            HttpContext.Current.Response.Write(responseContent);
                        }
                    }
                }
            }
            else
            {
                if (WeChatHelper.CheckSignature(signature, timestamp, nonce))
                {
                    Write(echoString);
                }
            }
        }
        /// <summary>
        /// 加密消息
        /// </summary>
        /// <param name="msg">要加密的消息</param>
        /// <returns>加密后的消息</returns>
        public string EncryptMsg(string msg)
        {
            var encryptMsg = "";
            var result     = Wxcpt.EncryptMsg(msg, _timestamp, _nonce, ref encryptMsg);

            if (result != 0)
            {
                Logger.Error("微信消息加密失败,result:" + result);
            }
            return(encryptMsg);
        }
Example #14
0
        /// <summary>
        /// 全网发布时处理文本发送
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public static string OnTextRequest(RequestMessageText requestMessage, PostModel postModel)
        {
            if (requestMessage.Content == "TESTCOMPONENT_MSG_TYPE_TEXT")
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("<xml>");
                sb.Append($"<ToUserName><![CDATA[{requestMessage.FromUserName}]]></ToUserName>");
                sb.Append($"<FromUserName><![CDATA[{requestMessage.ToUserName}]]></FromUserName>");
                sb.Append($"<CreateTime>{DateTimeHelper.GetTimeStamp(true)}</CreateTime>");
                sb.Append($"<MsgType><![CDATA[text]]></MsgType>");
                sb.Append($"<Content><![CDATA[TESTCOMPONENT_MSG_TYPE_TEXT_callback]]></Content>");
                sb.Append("</xml>");

                var timeStamp = DateTime.Now.Ticks.ToString();
                var nonce = DateTime.Now.Ticks.ToString();

                //必须要加密
                WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(postModel.Token, postModel.EncodingAESKey, postModel.AppId);
                string finalResponseXml = null;
                msgCrype.EncryptMsg(sb.ToString().Replace("\r\n", "\n")/* 替换\r\n是为了处理iphone设备上换行bug */, timeStamp, nonce, ref finalResponseXml);//TODO:这里官方的方法已经把EncryptResponseMessage对应的XML输出出来了

                return finalResponseXml;
            }

            if (requestMessage.Content.StartsWith("QUERY_AUTH_CODE:"))
            {
                string openTicket = OpenPlatConfigBLL.SingleModel.GetComponentVerifyTicket();
                string query_auth_code = requestMessage.Content.Replace("QUERY_AUTH_CODE:", "");
                try
                {
                    OpenPlatConfig currentmodel = OpenPlatConfigBLL.SingleModel.getCurrentModel();
                    QueryAuthResult oauthResult = WxRequest.QueryAuth(currentmodel.component_access_token, currentmodel.component_Appid, query_auth_code);

                    //调用客服接口
                    string content = query_auth_code + "_from_api";

                    //Task.Run(() => {
                    //    Thread.Sleep(1000);
                    //    WxRequest.SendText(oauthResult.authorization_info.authorizer_access_token, requestMessage.FromUserName, content);
                    //});

                    WxRequest.SendText(oauthResult.authorization_info.authorizer_access_token, requestMessage.FromUserName, content);
                    return "";
                }
                catch (Exception ex)
                {
                    log4net.LogHelper.WriteError(typeof(WXRequestCommandBLL), ex);
                }
            }
            return "success";
        }
Example #15
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var responseMessage = context.GetResponseMessage();

            if (responseMessage == null)
            {
                context.ResponseXml = string.Empty;
            }
            else
            {
                var requestMessage = context.GetRequestMessage();

                //基本信息初始化。
                responseMessage.CreateTime   = DateTime.Now;
                responseMessage.FromUserName = requestMessage.ToUserName;
                responseMessage.ToUserName   = requestMessage.FromUserName;

                var dependencyResolver     = context.GetDependencyResolver();
                var responseMessageFactory = dependencyResolver.GetService <IResponseMessageFactory>();
                var content = responseMessageFactory.GetXmlByReponseMessage(responseMessage);

                #region Encrypt

                if (!string.IsNullOrWhiteSpace(content))
                {
                    var request     = context.Request;
                    var encryptType = request.QueryString["encrypt_type"];

                    if (encryptType != null)
                    {
                        var nonce     = request.QueryString["nonce"];
                        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.EncryptMsg(content, timestamp, nonce, ref content);
                    }
                }

                #endregion Encrypt

                context.ResponseXml = content;
            }

            return(Next.Invoke(context));
        }
Example #16
0
        private string EncryptResponse(PostUrlParameters urlParameters, string responseText)
        {
            var outputData = responseText;

            if (_cryptor != null)
            {
                var encryptResult = _cryptor.EncryptMsg(responseText, urlParameters.timestamp, urlParameters.nonce, ref outputData);
                if (encryptResult != WXBizMsgCrypt.WXBizMsgCryptErrorCode.WXBizMsgCrypt_OK)
                {
                    throw new MessageException($"加密失败: {encryptResult}");
                }
            }

            return(outputData);
        }
Example #17
0
        protected override void SetResponseContent(WebParameter p, GoData d)
        {
            if (d.ResponseData is FrameDLRObject)
            {
                var re = (FrameDLRObject)d.ResponseData;

                var content = ToXml(re);

                if (p.ExtentionObj.weixin.encrypt_type == "aes")
                {
                    var    createTime = re.GetValue("CreateTime") == null ? DateTime.Now : (DateTime)re.GetValue("CreateTime");
                    int    timeStamp  = ToWeixinTime(createTime);
                    Random random     = new Random();
                    string nonce      = random.Next().ToString();

                    WXBizMsgCrypt wxcpt      = new WXBizMsgCrypt(p.ExtentionObj.weixin.token, p.ExtentionObj.weixin.encrypt_key, p.ExtentionObj.weixin.appid);
                    string        xmlEncrypt = "";
                    //加密消息
                    if (wxcpt.EncryptMsg(content, timeStamp.ToString(), nonce, ref xmlEncrypt) == WXBizMsgCrypt.WXBizMsgCryptErrorCode.WXBizMsgCrypt_OK)
                    {
                        content = xmlEncrypt;
                    }
                }

                var msgbytelength = Encoding.UTF8.GetByteCount(content);
                CurrentContext.Response.Headers.Add("Content-Length", msgbytelength + "");
                CurrentContext.Response.ContentType = ResponseHeader_ContentType.xml + ";charset=utf-8";
                CurrentContext.Response.StatusCode  = 200;
                CurrentContext.Response.WriteAsync(content);
            }
            else
            {
                var msgbytelength = Encoding.UTF8.GetByteCount(ComFunc.nvl(d.ResponseData));
                CurrentContext.Response.Headers.Add("Content-Length", msgbytelength + "");
                if (d.ContentType == GoResponseDataType.String)
                {
                    CurrentContext.Response.ContentType = ResponseHeader_ContentType.html + ";charset=utf-8";
                }
                else
                {
                    CurrentContext.Response.ContentType = ResponseHeader_ContentType.xml + ";charset=utf-8";
                }
                CurrentContext.Response.StatusCode = 200;
                CurrentContext.Response.WriteAsync(ComFunc.nvl(d.ResponseData));
            }
        }
Example #18
0
        /// <summary>
        /// 加密消息
        /// </summary>
        /// <param name="wxcpt"></param>
        /// <param name="token"></param>
        /// <param name="encryptMsg"></param>
        /// <returns></returns>
        public int EncryptMessage(WXBizMsgCrypt wxcpt, string token, out string encryptMsg)
        {
            encryptMsg = string.Empty;
            var    serializeMessage = this.AsXmlString();
            string timeSpan         = DateTime.Now.Subtract(dateInit).TotalSeconds.ToString();
            string replyMsg         = serializeMessage;
            string msgSignature     = string.Empty;
            string nonce            = DateTime.Now.Ticks.ToString();
            int    encryptResult    = wxcpt.EncryptMsg(replyMsg, timeSpan, nonce, ref encryptMsg);

            if (encryptResult != 0)
            {
                return(encryptResult);
            }
            int genSinatureResult = WXBizMsgCrypt.GenerateSinature(token, timeSpan, nonce, encryptMsg, ref msgSignature);

            return(genSinatureResult);
        }
Example #19
0
 /// <summary>
 /// 消息加密
 /// </summary>
 /// <param name="fromUserName">发送人</param>
 /// <param name="token">开发者Token</param>
 /// <param name="appid">公众号AppId</param>
 /// <param name="strMsg">消息(xml格式)</param>
 /// <param name="aesKey">用于加密的EncodingAESKey</param>
 /// <param name="timestamp">时间戳</param>
 /// <param name="nonce">随机数</param>
 /// <returns></returns>
 public static string EncryptMsg(string fromUserName, string token, string appid, string strMsg, string aesKey, string timestamp, string nonce)
 {
     try
     {
         string        encryptReplyMsgStr = string.Empty;                                               //  回复的消息密文
         WXBizMsgCrypt wxcpt      = new WXBizMsgCrypt(token, aesKey, appid);
         int           encryptRes = wxcpt.EncryptMsg(strMsg, timestamp, nonce, ref encryptReplyMsgStr); //  消息加密
         if (encryptRes != 0)
         {
             return("");
         }
         return(encryptReplyMsgStr);
     }
     catch (Exception ex)
     {
         return("");
     }
 }
 /// <summary>
 /// 获取输出内容
 /// </summary>
 /// <returns></returns>
 public string GetResponse()
 {
     if (this.Output.ResponseModel != null)
     {
         this.Output.ResponseModel.ToUserName   = this.Input.RequestBaseModel.FromUserName;
         this.Output.ResponseModel.FromUserName = this.Input.RequestBaseModel.ToUserName;
     }
     if (Configurations.Current.EnumMessageMode == Configurations.TransferMode.Cipher)
     {
         WXBizMsgCrypt crypt = new WXBizMsgCrypt();
         var           items = crypt.EncryptMsg(this.Output.Response, Input.RequestBaseModel.Timestamp, Input.RequestBaseModel.Nonce);
         if (!items.Item1)
         {
             throw new Exception(items.Item2);
         }
         return(items.Item2);
     }
     return(this.Output.Response);
 }
Example #21
0
        /// <summary>
        /// 加密回复微信信息
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="repsonseData"></param>
        /// <returns></returns>
        public string  EncryptMessage(string appId, string repsonseData)
        {
            var config = _gateway.Get <MPConfiguration>(appId);

            var nonce     = Guid.NewGuid().ToString("N");
            var timestamp = DateTimeHelper.GetUnixDateTime(DateTime.Now);

            var encMsgData = "";

            var ret = WXBizMsgCrypt.EncryptMsg(repsonseData, config.EncryptAESKey, appId, timestamp.ToStringEx(), nonce, config.Token, ref encMsgData);

            if (ret == 0)
            {
                return(encMsgData);
            }
            else
            {
                return("加密失败");
            }
        }
Example #22
0
        /// <summary>
        /// 返回消息
        /// </summary>
        /// <param name="_crypt"></param>
        /// <param name="_context"></param>
        /// <param name="msgxml"></param>
        public void WriteMeasge(WXBizMsgCrypt _crypt, HttpContext _context, string msgxml)
        {
            string msg_signature = _context.Request.QueryString["msg_signature"];
            string timestamp     = _context.Request.QueryString["timestamp"];
            string nonce         = _context.Request.QueryString["nonce"];

            _context.Response.ContentType     = "text/xml";
            _context.Response.ContentEncoding = Encoding.UTF8;
            _context.Response.Clear();
            string encrypMsgxml = string.Empty;
            int    ret          = _crypt.EncryptMsg(msgxml, timestamp, nonce, ref encrypMsgxml);

            if (ret != 0)
            {
                throw new WeiXinException("ERR: Decrypt fail, ret: " + ret);
            }
            else
            {
                _context.Response.Write(encrypMsgxml);
            }
        }
Example #23
0
        private string SerializeResponse(PostUrlParameters urlParameters, IResponseMessage responseMessage)
        {
            var response = responseMessage.Serialize();

            if (!responseMessage.EncryptionRequired)
            {
                return(response);
            }

            var outputData = response;

            if (_cryptor != null)
            {
                var encryptResult = _cryptor.EncryptMsg(response, urlParameters.timestamp, urlParameters.nonce, ref outputData);
                if (encryptResult != WXBizMsgCrypt.WXBizMsgCryptErrorCode.WXBizMsgCrypt_OK)
                {
                    throw new MessageException($"加密失败: {encryptResult}");
                }
            }

            return(outputData);
        }
Example #24
0
        /// <summary>
        /// 加密信息
        /// </summary>
        /// <param name="sTimeStamp"></param>
        /// <param name="sNonce"></param>
        /// <param name="postStr"></param>
        /// <returns></returns>
        private string EncryptMsg(string sTimeStamp, string sNonce, string postStr)
        {
            string strReuslt = postStr;

            try
            {
                if (isDES && (!"success".Equals(postStr)))
                {
                    int ret = 0;
                    ret = wxcpt.EncryptMsg(postStr, sTimeStamp, sNonce, ref strReuslt);
                    log.Debug("CorpCore EncryptMsg Msg:" + postStr);
                    if (ret != 0)
                    {
                        log.Info("CorpCore EncryptMsg failed");
                    }
                }
                return(strReuslt);
            }
            catch (Exception e)
            {
                log.Error("CorpCore EncryptMsg:", e);
                return(strReuslt);
            }
        }
Example #25
0
        static void Main(string[] args)
        {
            //公众平台上开发者设置的token, appID, EncodingAESKey
            string sToken = "QDG6eK";
            string sAppID = "wx5823bf96d3bd56c7";
            string sEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C";

            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
            
             /* 1. 对用户回复的数据进行解密。
             * 用户回复消息或者点击事件响应时,企业会收到回调消息,假设企业收到的推送消息:
             * 	POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6&timestamp=1409659813&nonce=1372623149 HTTP/1.1
	            Host: qy.weixin.qq.com
                Content-Length: 613
             *
             * 	<xml>
	                <ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName>
	                <Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt>
                </xml>
             */
            string sReqMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6";
            string sReqTimeStamp = "1409659813";
            string sReqNonce = "1372623149";
            string sReqData = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt></xml>";
            string sMsg = "";  //解析之后的明文
			int ret = 0;
            ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);
            if (ret != 0)
            {
                System.Console.WriteLine("ERR: Decrypt fail, ret: " + ret);
                return;
            }
            System.Console.WriteLine(sMsg);


            /*
             * 2. 企业回复用户消息也需要加密和拼接xml字符串。
             * 假设企业需要回复用户的消息为:
             * 		<xml>
             * 		<ToUserName><![CDATA[mycreate]]></ToUserName>
             * 		<FromUserName><![CDATA[wx5823bf96d3bd56c7]]></FromUserName>
             * 		<CreateTime>1348831860</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
             *      <Content><![CDATA[this is a test]]></Content>
             *      <MsgId>1234567890123456</MsgId>
             *      </xml>
             * 生成xml格式的加密消息过程为:
             */
            string sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[wx582测试一下中文的情况,消息长度是按字节来算的396d3bd56c7]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>";
            string sEncryptMsg = ""; //xml格式的密文
            ret = wxcpt.EncryptMsg(sRespData, sReqTimeStamp, sReqNonce, ref sEncryptMsg);
            System.Console.WriteLine("sEncryptMsg");
            System.Console.WriteLine(sEncryptMsg);

            /*测试:
             * 将sEncryptMsg解密看看是否是原文
             * */
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(sEncryptMsg);
            XmlNode root = doc.FirstChild;
            string sig = root["MsgSignature"].InnerText;
            string enc = root["Encrypt"].InnerText;
            string timestamp = root["TimeStamp"].InnerText;
            string nonce = root["Nonce"].InnerText;
            string stmp = "";
            ret = wxcpt.DecryptMsg(sig, timestamp, nonce, sEncryptMsg, ref stmp);
            System.Console.WriteLine("stemp");
            System.Console.WriteLine(stmp + ret);
            return;
        }
Example #26
0
        public void ProcessRequest(HttpContext context)
        {
            //添加自定义token
            string sToken = "";
            //string sAppID = HttpContext.Current.Request.QueryString["appId"];
            //sAppID = sAppID.Replace("/","");
            string sAppID = WebConfigurationManager.AppSettings["MASTERAPPID"];
            //添加43位预设密钥
            string        sEncodingAESKey = "";
            WXBizMsgCrypt wxcpt           = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
            //获取interfacetest页面的accesstoken
            var accesstoken = GetCache("token");

            string sReqData       = GetPost();
            string respnseContent = "";
            string sResponse      = ""; //加密之后的回复文本
            string sReqMsgSig     = HttpContext.Current.Request.QueryString["msg_signature"];
            string sReqTimeStamp  = HttpContext.Current.Request.QueryString["timestamp"];
            string sReqNonce      = HttpContext.Current.Request.QueryString["nonce"];
            string openid         = HttpContext.Current.Request.QueryString["openid"];

            string sMsg = "";  //解析之后的明文
            int    ret  = 0;

            ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);

            var xDoc = XDocument.Parse(sMsg);

            List <XElement> q = (from c in xDoc.Elements() select c).ToList();

            var model = new
            {
                ToUserName   = q.Elements("ToUserName").First().Value,
                FromUserName = q.Elements("FromUserName").First().Value,
                CreateTime   = q.Elements("CreateTime").First().Value,

                MsgType = q.Elements("MsgType").First().Value,
                Content = ("" + q.Elements("Content").First().Value).Trim(),
                MsgId   = q.Elements("MsgId").First().Value
            };

            if (false == string.IsNullOrEmpty(model.Content))
            {
                var textTpl = "<xml>"
                              + "<ToUserName><![CDATA[{0}]]></ToUserName>"
                              + "<FromUserName><![CDATA[{1}]]></FromUserName>"
                              + "<CreateTime>{2}</CreateTime>"
                              + "<MsgType><![CDATA[{3}]]></MsgType>"
                              + "<Content><![CDATA[{4}]]></Content>"
                              + "</xml>";
                if (model.Content == "TESTCOMPONENT_MSG_TYPE_TEXT")
                {
                    //回复普通消息
                    respnseContent = "TESTCOMPONENT_MSG_TYPE_TEXT_callback";
                    int enRet = wxcpt.EncryptMsg(string.Format(textTpl, model.FromUserName, model.ToUserName, ConvertDateTimeInt(DateTime.Now), "text", respnseContent), sReqTimeStamp, sReqNonce, ref sResponse);
                    //sResponse = string.Format(textTpl, model.ToUserName, model.FromUserName, ConvertDateTimeInt(DateTime.Now), "text", respnseContent);
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.Write(sResponse);
                    HttpContext.Current.Response.End();
                }
                else
                {
                    //回复API消息
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.Write(string.Empty);//回复空字符串
                    var auth = model.Content;
                    auth = auth.Replace("QUERY_AUTH_CODE:queryauthcode@@@", "");
                    string  data      = "{\"component_appid\":\"" + WebConfigurationManager.AppSettings["MASTERAPPID"] + "\",\"authorization_code\":\"" + auth + "\"}";
                    var     result    = HttpClientHelper.PostResponse("https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=" + accesstoken, data);
                    JObject outputObj = JObject.Parse(result);
                    var     token     = outputObj["authorization_info"]["authorizer_access_token"].ToString();
                    respnseContent = model.Content.Replace("QUERY_AUTH_CODE:", "") + "_from_api";
                    var data2   = "{\"touser\":\"" + openid + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + respnseContent + "\"}}";
                    var result2 = HttpClientHelper.PostResponse("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + token, data2);
                    HttpContext.Current.Response.End();
                }
            }
        }
        public ActionResult Post(PostModel postModel)
        {
            postModel.Token = WeixinConfig.Token;
            //postModel.EncodingAESKey = WeixinConfig.EncodingAESKey;
            postModel.AppId = WeixinConfig.AppID;

            var ent = "";

            if (!BasicAPI.CheckSignature(postModel.Signature, postModel.Timestamp, postModel.Nonce, WeixinConfig.Token, out ent))
            {
                return(Content("参数错误!"));
            }

            var           encryptMsg = string.Empty;
            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, postModel.Timestamp, postModel.Nonce, msg, ref decryptMsg);
                    if (ret != 0)//解密失败
                    {
                        //TODO:开发者解密失败的业务处理逻辑
                        Log.Instence.LogWriteLine(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);

            #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, postModel.Timestamp, postModel.Nonce, ref encryptMsg);
                if (ret != 0)//加密失败
                {
                    //TODO:开发者加密失败的业务处理逻辑
                    Log.Instence.LogWriteLine(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
            });
        }
Example #28
0
        public void responseMsg(HttpContext context, XmlDocument xmlDoc)
        {
            string result = "";
            string msgType = WeiXinXML.GetFromXML(xmlDoc, "MsgType");
            switch (msgType)
            {
                case "event":
                    switch (WeiXinXML.GetFromXML(xmlDoc, "Event"))
                    {
                        case "subscribe": //订阅
                            String retUserInfo = getUserInfo(WeiXinXML.GetFromXML(xmlDoc, "FromUserName"));
                            Util.Debuglog("getUserInfo" + retUserInfo, "wxapi.txt");
                            if (retUserInfo.Contains("errcode"))
                            {

                            }
                            else
                            {
                                WeiXinUserInfo info = JsonConvert.DeserializeObject<WeiXinUserInfo>(retUserInfo);
                                if (!string.IsNullOrEmpty(info.OpenId) && !string.IsNullOrEmpty(info.UnionId))
                                {
                                    Util.Debuglog("info=" + info.ToString(), "wxapi.txt");
                                    string sql = "select * from asm_member where unionID='" + info.UnionId + "'";
                                    Util.Debuglog("sql=" + sql, "wxapi.txt");
                                    DataTable dt = DbHelperSQL.Query(sql).Tables[0];
                                    if (dt.Rows.Count <= 0)
                                    {
                                        string insert = "insert into asm_member(name,phone,province,city,country,AvailableMoney,sumConsume,sumRecharge,createDate,companyID,headurl,nickname,sex,unionID,openID,consumeCount)"
                                            + " values(N'" + info.NickName + "','','" + info.Province + "','" + info.City + "','" + info.Conuntry + "',0,0,0,'" + DateTime.Now + "',14,'" + info.HeadImgUrl + "',N'" + info.NickName + "','" + info.Sex + "','" + info.UnionId + "','" + info.OpenId + "',0)";
                                        Util.Debuglog(insert, "wxapi.txt");
                                        DbHelperSQL.ExecuteSql(insert);
                                    }
                                    else
                                    {
                                        //更新
                                        string update = "update asm_member set openID='" + info.OpenId + "' where unionID='" + info.UnionId + "'";
                                        Util.Debuglog("更新" + update, "wxapi.txt");
                                        DbHelperSQL.ExecuteSql(update);
                                    }

                                }
                            }

                            string sqlcom = "select * from asm_company where user_name='" + WeiXinXML.GetFromXML(xmlDoc, "ToUserName") + "'";
                            Util.Debuglog("sqlcom=" + sqlcom, "wxapi.txt");
                            DataTable dtcom = DbHelperSQL.Query(sqlcom).Tables[0];
                            string txt ="";
                            if (dtcom.Rows.Count > 0){
                                txt = dtcom.Rows[0]["subscribe_info"].ToString();
                            }
                            result = WeiXinXML.CreateTextMsg(xmlDoc,txt);
                            Util.Debuglog("用户关注result="+ result, "wxapi.txt");

                            break;
                        case "unsubscribe": //取消订阅
                            Util.Debuglog("取消订阅", "wxapi.txt");
                            break;
                        case "LOCATION":
                            string Latitude = WeiXinXML.GetFromXML(xmlDoc, "Latitude");
                            string Longitude = WeiXinXML.GetFromXML(xmlDoc, "Longitude");
                            Util.Debuglog("Latitude="+ Latitude+ ";Longitude="+ Longitude, "wxapi.txt");
                            break;
                        default:

                            break;
                    }
                    break;

                default:
                    break;
            }

            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
            string signature = context.Request["msg_signature"];
            string timestamp = context.Request["timestamp"];
            string nonce = context.Request["nonce"];
            string stmp = "";
            int ret = wxcpt.EncryptMsg(result, timestamp, nonce, ref stmp);
            context.Response.Write(stmp);

            context.Response.Flush();
        }
Example #29
0
        protected override void OnError(Exception ex, ParameterStd p, DataCollection d)
        {
            //GlobalCommon.ExceptionProcessor.ProcessException(this, ex, p, d);
            string errorCode = "E-" + ComFunc.nvl(p[DomainKey.CONFIG, "Machine_No"]) + "-" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string errlog    = "";

            if (ex.InnerException != null)
            {
                errlog = string.Format("错误编号:{0},\n{1}\n{2}\nInnerException:{3}\n{4}", errorCode, ex.Message, ex.StackTrace, ex.InnerException.Message, ex.InnerException.StackTrace);
            }
            else
            {
                errlog = string.Format("错误编号:{0},\n{1}\n{2}", errorCode, ex.Message, ex.StackTrace);
            }
            GlobalCommon.Logger.WriteLog(LoggerLevel.ERROR, errlog);

            var errormsg = "";
            var isdebug  = p[DomainKey.CONFIG, "DebugMode"] == null ? false : (bool)p[DomainKey.CONFIG, "DebugMode"];

            if (isdebug)
            {
                errormsg = string.Format("出错了,{0}", errlog);;
            }
            else
            {
                errormsg = string.Format("系统出错了,亲,请将错误编号({0})告知我们,我们会帮亲处理的哦!", errorCode);
            }
            var logkey = ComFunc.nvl(p.GetValue("logkey"));

            if (logmsg.ContainsKey(logkey))
            {
                var msgobj = (FrameDLRObject)logmsg[logkey];
                DebugLog(string.Format("标号{0}微信请求处理记录:\n{1}", logkey, msgobj.ToJSONString()), (WebParameter)p);
            }


            p.Resources.RollbackTransaction(p.CurrentTransToken);
            p.Resources.ReleaseAll();

            var dobj = FrameDLRObject.CreateInstance(FrameDLRFlags.SensitiveCase);

            dobj.ToUserName   = p[DomainKey.POST_DATA, "FromUserName"];
            dobj.FromUserName = p[DomainKey.POST_DATA, "ToUserName"];
            dobj.CreateTime   = DateTime.Now;
            dobj.MsgType      = "text";
            dobj.Content      = errormsg;
            dobj.FuncFlag     = 0;
            var content = ToXml(dobj);

            //如果内容为aes加密
            if (p.ExtentionObj.weixin.encrypt_type == "aes")
            {
                DateTime createTime = dobj.CreateTime;
                int      timeStamp  = ToWeixinTime(createTime);
                Random   random     = new Random();
                string   nonce      = random.Next().ToString();

                WXBizMsgCrypt wxcpt      = new WXBizMsgCrypt(p.ExtentionObj.weixin.token, p.ExtentionObj.weixin.encrypt_key, p.ExtentionObj.weixin.appid);
                string        xmlEncrypt = "";
                //加密消息
                if (wxcpt.EncryptMsg(content, timeStamp.ToString(), nonce, ref xmlEncrypt) == WXBizMsgCrypt.WXBizMsgCryptErrorCode.WXBizMsgCrypt_OK)
                {
                    content = xmlEncrypt;
                }
            }
            var msgbytelength = Encoding.UTF8.GetByteCount(content);

            CurrentContext.Response.Headers.Add("Content-Length", new Microsoft.Extensions.Primitives.StringValues(msgbytelength + ""));
            CurrentContext.Response.ContentType = ResponseHeader_ContentType.xml + ";charset=utf-8";
            CurrentContext.Response.WriteAsync((string)content);
        }
Example #30
0
        public ActionResult Post(string signature, string timestamp, string nonce, string openid, string encrypt_type, string msg_signature)
        {
            //StringBuilder log = new StringBuilder();
            LogService.AnyLog("WeChatWebHook", $"WxApi\tPost In");//{DateTime.Now.ToString("HH:mm:ss.fffffff")}\t

            PostModel postModel = new PostModel()
            {
                Token          = WechatMpSettings.Default.Token, //根据自己后台的设置保持一致
                Signature      = signature,
                Timestamp      = timestamp,
                Nonce          = nonce,
                AppId          = WechatMpSettings.Default.AppId,
                EncodingAESKey = WechatMpSettings.Default.EncodingAESKey,
                Msg_Signature  = msg_signature,
            };

            try
            {
                //加密异常
                if (encrypt_type == "aes" && string.IsNullOrEmpty(postModel.EncodingAESKey))
                {
                    return(Content("公从号接口有异常,请通过其它途径解决您的问题,并反馈此消息"));
                }
                if (encrypt_type == "aes" && wxcrypt == null)
                {
                    wxcrypt = new WXBizMsgCrypt(postModel.Token, postModel.EncodingAESKey, postModel.AppId);
                }

                if (!CheckSignature.Check(signature, postModel))
                {
                    return(Content("参数错误!"));
                }

                String PostXml = Request.GetBodyString();
                //解密信息
                if (encrypt_type == "aes")
                {
                    var    aeskey = WechatMpSettings.Default.EncodingAESKey;
                    string detext = null;
                    var    res    = wxcrypt.DecryptMsg(postModel.Msg_Signature, postModel.Timestamp, postModel.Nonce, PostXml, ref detext);
                    //Console.WriteLine($"{res} detext({postModel.Token},{postModel.EncodingAESKey},{postModel.AppId},{postModel.Msg_Signature}, {postModel.Timestamp}, {postModel.Nonce},{PostXml})>{detext}");
                    PostXml = detext;
                }

                WechatResponse wxsponse  = new WechatResponse(Request, PostXml);
                var            botsponse = wxsponse.Rebot();
                LogService.AnyLog("WeChatWebHook", "响应源数据", $"{botsponse.Content}");
                //加密信息
                if (encrypt_type == "aes")
                {
                    var    rTimeStamp = DateTime.Now.GetTimestamp10();
                    var    rNonce     = RandomString.BuildRndString(16);
                    string restr      = null;
                    var    rb         = wxcrypt.EncryptMsg(botsponse.Content, rTimeStamp + "", rNonce, ref restr);
                    if (rb == 0)
                    {
                        botsponse.Content = restr;
                    }
                    else
                    {
                        $"{rb} EncryptMsg".WriteErrorLine();
                    }
                }
                LogService.AnyLog("WeChatWebHook", "响应密数据", $"{botsponse.Content}");
                return(botsponse);
            }
            catch (Exception ex)
            {
                #region 异常处理
                LogService.AnyLog("WeChatWebHook", $"{ex.Message}");
                LogService.Exception(ex);
                return(Content(""));

                #endregion
            }
            finally
            {
                LogService.AnyLog("WeChatWebHook", $"WxApi\tPost Out");
            }
        }
Example #31
0
        static void Main(string[] args)
        {
            //公众平台上开发者设置的token, appID, EncodingAESKey
            string sToken          = "QDG6eK";
            string sAppID          = "wx5823bf96d3bd56c7";
            string sEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C";

            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);

            /* 1. 对用户回复的数据进行解密。
             * 用户回复消息或者点击事件响应时,企业会收到回调消息,假设企业收到的推送消息:
             *  POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6&timestamp=1409659813&nonce=1372623149 HTTP/1.1
             *     Host: qy.weixin.qq.com
             * Content-Length: 613
             *
             *  <xml>
             *         <ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName>
             *         <Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt>
             * </xml>
             */
            string sReqMsgSig    = "477715d11cdb4164915debcba66cb864d751f3e6";
            string sReqTimeStamp = "1409659813";
            string sReqNonce     = "1372623149";
            string sReqData      = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt></xml>";
            string sMsg          = ""; //解析之后的明文
            int    ret           = 0;

            ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);
            if (ret != 0)
            {
                System.Console.WriteLine("ERR: Decrypt fail, ret: " + ret);
                return;
            }
            System.Console.WriteLine(sMsg);


            /*
             * 2. 企业回复用户消息也需要加密和拼接xml字符串。
             * 假设企业需要回复用户的消息为:
             *      <xml>
             *      <ToUserName><![CDATA[mycreate]]></ToUserName>
             *      <FromUserName><![CDATA[wx5823bf96d3bd56c7]]></FromUserName>
             *      <CreateTime>1348831860</CreateTime>
             *      <MsgType><![CDATA[text]]></MsgType>
             *      <Content><![CDATA[this is a test]]></Content>
             *      <MsgId>1234567890123456</MsgId>
             *      </xml>
             * 生成xml格式的加密消息过程为:
             */
            string sRespData   = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[wx582测试一下中文的情况,消息长度是按字节来算的396d3bd56c7]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>";
            string sEncryptMsg = ""; //xml格式的密文

            ret = wxcpt.EncryptMsg(sRespData, sReqTimeStamp, sReqNonce, ref sEncryptMsg);
            System.Console.WriteLine("sEncryptMsg");
            System.Console.WriteLine(sEncryptMsg);

            /*测试:
             * 将sEncryptMsg解密看看是否是原文
             * */
            XmlDocument doc = new Senparc.CO2NET.ExtensionEntities.XmlDocument_XxeFixed();

            doc.LoadXml(sEncryptMsg);
            XmlNode root      = doc.FirstChild;
            string  sig       = root["MsgSignature"].InnerText;
            string  enc       = root["Encrypt"].InnerText;
            string  timestamp = root["TimeStamp"].InnerText;
            string  nonce     = root["Nonce"].InnerText;
            string  stmp      = "";

            ret = wxcpt.DecryptMsg(sig, timestamp, nonce, sEncryptMsg, ref stmp);
            System.Console.WriteLine("stemp");
            System.Console.WriteLine(stmp + ret);
            return;
        }