当前位置:   article > 正文

C#微信公众号自动回复源码_c# 微信实现自动回复

c# 微信实现自动回复
  1.     /// <summary>
  2.     /// WechartInterface这里使用一般处理程序 这个写好然后在公众号后台配置地址就好了
  3.     /// </summary>
  4.     public class WechartInterface : IHttpHandler
  5.     {
  6.         protected string TOKEN = "0000"; //TOKEN 必须跟你在微信公众平台上写的token是一致的
  7.         
  8.  
  9.         public void ProcessRequest(HttpContext context)
  10.         {
  11.             //context.Response.ContentType = "text/plain";
  12.             context.Response.Clear(); //清除所有之前生成的Response内容
  13.             Handlewinxin(context);  //进入专业微信处理程序
  14.             context.Response.End();
  15.         }
  16.         public bool IsReusable
  17.         {
  18.             get
  19.             {
  20.                 return false;
  21.             }
  22.         }
  23.         /// <summary>
  24.         ///
  25.         /// </summary>
  26.         /// <param name="content"></param>
  27.         public void Handlewinxin(HttpContext context)
  28.         {
  29.          
  30.             if (context.Request.HttpMethod.ToUpper() == "GET")
  31.             {
  32.               
  33.                 // 微信加密签名  
  34.                 string signature = context.Request.QueryString["signature"];
  35.                 // 时间戳  
  36.                 string timestamp = context.Request.QueryString["timestamp"];
  37.                 // 随机数  
  38.                 string nonce = context.Request.QueryString["nonce"];
  39.                 // 随机字符串  
  40.                 string echostr = context.Request.QueryString["echostr"];
  41.                 if (CheckSignature(signature, timestamp, nonce))
  42.                 {
  43.                     CreateMenu(context);
  44.                     context.Response.Write(echostr);
  45.                 }
  46.             }
  47.             else if (context.Request.HttpMethod.ToUpper() == "POST")
  48.             {
  49.                 StreamReader stream = new StreamReader(context.Request.InputStream);
  50.                 string xml = stream.ReadToEnd();
  51.                 processRequest(xml, context);
  52.             }
  53.         }
  54.         /// <summary>
  55.         /// 验证签名
  56.         /// </summary>
  57.         /// <param name="signature"></param>
  58.         /// <param name="timestamp"></param>
  59.         /// <param name="nonce"></param>
  60.         /// <returns></returns>
  61.         public bool CheckSignature(String signature, String timestamp, String nonce)
  62.         {
  63.             String[] arr = new String[] { TOKEN, timestamp, nonce };
  64.             // 将token、timestamp、nonce三个参数进行字典序排序  
  65.             Array.Sort<String>(arr);
  66.             StringBuilder content = new StringBuilder();
  67.             for (int i = 0; i < arr.Length; i++)
  68.             {
  69.                 content.Append(arr[i]);
  70.             }
  71.             String tmpStr = SHA1_Encrypt(content.ToString());
  72.             // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
  73.             return tmpStr != null ? tmpStr.Equals(signature) : false;
  74.         }
  75.         /// <summary>
  76.         /// 使用缺省密钥给字符串加密
  77.         /// </summary>
  78.         /// <param name="Source_String"></param>
  79.         /// <returns></returns>
  80.         public static string SHA1_Encrypt(string Source_String)
  81.         {
  82.             byte[] StrRes = Encoding.Default.GetBytes(Source_String);
  83.             HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
  84.             StrRes = iSHA.ComputeHash(StrRes);
  85.             StringBuilder EnText = new StringBuilder();
  86.             foreach (byte iByte in StrRes)
  87.             {
  88.                 EnText.AppendFormat("{0:x2}", iByte);
  89.             }
  90.             return EnText.ToString();
  91.         }
  92.         /// <summary>
  93.         /// 处理微信发来的请求
  94.         /// </summary>
  95.         /// <param name="xml"></param>
  96.         public void processRequest(String xml, HttpContext context)
  97.         {
  98.             try
  99.             {
  100.                 LogHelper.Info("微信用户xml:" + xml);
  101.                 XmlDocument xmldoc = new XmlDocument();
  102.                 xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)));  //postStr为微信服务器传过来的xml
  103.                 WxXmlModel wxXmlModel = new WxXmlModel();
  104.                
  105.                 wxXmlModel.ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName").InnerText;
  106.                 wxXmlModel.FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName").InnerText;
  107.                 wxXmlModel.CreateTime = xmldoc.SelectSingleNode("/xml/CreateTime").InnerText;
  108.                 wxXmlModel.MsgType = xmldoc.SelectSingleNode("/xml/MsgType").InnerText;
  109.                 wxXmlModel.MsgId = xmldoc.SelectSingleNode("/xml/MsgId").InnerText;
  110.                 switch (wxXmlModel.MsgType)
  111.                 {
  112.                     case "text":
  113.                         wxXmlModel.Content = xmldoc.SelectSingleNode("/xml/Content").InnerText;
  114.                          WeChatNewsSava(wxXmlModel);
  115.                         wxXmlModel.Content = Context(wxXmlModel.Content);
  116.                         HttpContext.Current.Response.Write(WxReplyContext(wxXmlModel));
  117.                         HttpContext.Current.Response.End();
  118.                         break;
  119.                     case "image":
  120.                         wxXmlModel.PicUrl = xmldoc.SelectSingleNode("/xml/PicUrl").InnerText;
  121.                         WeChatNewsSava(wxXmlModel);
  122.                         break;
  123.                 }
  124.              
  125.             }
  126.             catch (Exception ex)
  127.             {
  128.                 LogHelper.Info("微信用户发送消息错误消息:" + ex.Message);//写日志方便调试
  129.             }
  130.             //HttpContext.Current.Response.Write(wxXmlModel);
  131.             //HttpContext.Current.Response.End();
  132.         }
  133.         /// <summary>       
  134.         /// 10位时间戳转为C#格式时间       
  135.         /// </summary>       
  136.         /// <param name=”timeStamp”></param>       
  137.         /// <returns></returns>       
  138.         public  DateTime ConvertStringToDateTime(string timeStamp)
  139.         {
  140.             Int64 begtime = Convert.ToInt64(timeStamp) * 10000000;
  141.             DateTime dt_1970 = new DateTime(1970, 1, 1, 8, 0, 0);
  142.             long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
  143.             long time_tricks = tricks_1970 + begtime;//日志日期刻度
  144.             DateTime dt = new DateTime(time_tricks);//转化为DateTime
  145.             return dt;
  146.         }
  147.         /// <summary>
  148.         /// 回复文本消息
  149.         /// </summary>
  150.         /// <param name="wxXml"></param>
  151.         /// <returns></returns>
  152.         public string WxReplyContext(WxXmlModel wxXml) 
  153.         {
  154.             string xml = "<xml>";
  155.             xml += "<ToUserName><![CDATA["+ wxXml.FromUserName+ "]]></ToUserName>";
  156.             xml += "<FromUserName><![CDATA[" + wxXml.ToUserName + "]]></FromUserName>";
  157.             xml += "<CreateTime>" + GetTimestamp() + "</CreateTime>";
  158.             xml += "<MsgType><![CDATA[" + wxXml.MsgType + "]]></MsgType>";
  159.             xml += "<Content><![CDATA[" + wxXml.Content + "]]></Content>";
  160.          
  161.             xml += "</xml>";
  162.             LogHelper.Info("微信回复用户文本:" + xml);
  163.             return xml;
  164.         }
  165.         /// <summary>
  166.         /// 将记录保存到数据库
  167.         /// </summary>
  168.         /// <param name="wxXmlModel"></param>
  169.         public void WeChatNewsSava(WxXmlModel wxXmlModel)
  170.         {
  171.             Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
  172.             keyValuePairs.Add(nameof(wxXmlModel.ToUserName), wxXmlModel.ToUserName);
  173.             keyValuePairs.Add(nameof(wxXmlModel.FromUserName), wxXmlModel.FromUserName);
  174.             keyValuePairs.Add(nameof(wxXmlModel.CreateTime), ConvertStringToDateTime(wxXmlModel.CreateTime));
  175.             keyValuePairs.Add(nameof(wxXmlModel.MsgType), wxXmlModel.MsgType);
  176.             keyValuePairs.Add(nameof(wxXmlModel.Content), wxXmlModel.Content);
  177.             keyValuePairs.Add(nameof(wxXmlModel.PicUrl), wxXmlModel.PicUrl);
  178.             keyValuePairs.Add(nameof(StationId), StationId);
  179.             keyValuePairs.Add(nameof(CompanyId), CompanyId);
  180.             new BasService().AddRowToDataByORM("tbWeChatNews", ref keyValuePairs);
  181.             LogHelper.Info("微信用户发送消添加数据库表:tbWeChatNews");
  182.         }
  183.         /// <summary>
  184.         /// 取当前时间戳十位数
  185.         /// </summary>
  186.         /// <returns></returns>
  187.         public static long GetTimestamp()
  188.         {
  189.             TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);//ToUniversalTime()转换为标准时区的时间,去掉的话直接就用北京时间
  190.           //  return (long)ts.TotalMilliseconds; //精确到毫秒
  191.             return (long)ts.TotalSeconds;//获取10位
  192.         }
  193. //自动回复 这里我是写死的 当然也可以取数据库的数据
  194.         public string Context(string str)
  195.         {
  196.          string   strs = "";
  197.             switch (str)
  198.             {
  199.                 case "你好":
  200.                     strs= "您好";
  201.                     break;
  202.                 case "客服电话":
  203.                     strs= "请联系站点客服";
  204.                     break;
  205.                 case "客服":
  206.                     strs= "您要转客服咨询嘛?请输入'人工客服'";
  207.                     break;
  208.                 case "人工客服":
  209.                     strs = "亲,当前客服繁忙,您可以留言您的问题,稍后我们客服会联系您";
  210.                     break;
  211.                 default:
  212.                     strs = "亲,没听懂您的意思哦";
  213.                     break;
  214.             }
  215.             return strs;
  216.         }
  217. //配置公众号菜单  
  218. public void CreateMenu(HttpContext context)
  219.         {
  220.             string access_token = “”;这个可以通过我前面的文章取获取,有写如何获取
  221.             string posturl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token;
  222.             string menuStr = "";// " 菜单结构";
  223.             using (StreamReader sr = new StreamReader(context.Server.MapPath("/WxMenu.json")))
  224.             {
  225.                 menuStr = sr.ReadToEnd();
  226.             }
  227.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(posturl);
  228.             request.Method = "POST";
  229.             request.ContentType = "application/json";
  230.         
  231.             using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
  232.             {
  233.                 dataStream.Write(menuStr);
  234.                 dataStream.Close();
  235.             }
  236.             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  237.             string encoding = response.ContentEncoding;
  238.             if (encoding == null || encoding.Length < 1)
  239.             {
  240.                 encoding = "UTF-8"; //默认编码  
  241.             }
  242.             StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
  243.             string retString = reader.ReadToEnd();
  244.         }
  245.     }
  246. //这个是配置公众号的菜单 这里是用着json数据    当然也可以用数据库或者文本    
  247. {  
  248. "button": [
  249.     {
  250.       "name": "外面按钮",
  251.       "sub_button": [
  252.         {
  253.           "type": "view",
  254.           "name": "子集按钮1",
  255.           "url": "http://www.baidu.com"
  256.         }
  257.     
  258.         {
  259.           "type": "view",
  260.           "name": "子集按钮2",
  261.           "url": "http://www.baidu.com"
  262.         }
  263.       ]
  264.     },
  265.     {
  266.       "type": "view",
  267.       "name": "父级按钮1",
  268.       "url": "http://www.baidu.com"
  269.     }
  270.  
  271.   ]
  272. }
  273. }
  274. 不懂的可以留言

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/341488
推荐阅读
相关标签
  

闽ICP备14008679号