/// <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); }
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"); } }
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> /// 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); }
/// <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); }
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); }
/// <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")); }
/// <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); }
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(); }
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); }
/// <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"; }
/// <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)); }
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); }
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)); } }
/// <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); }
/// <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); }
/// <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("加密失败"); } }
/// <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); } }
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); }
/// <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); } }
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×tamp=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; }
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 }); }
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(); }
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); }
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"); } }
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×tamp=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; }