直接上代码:如有问题请留言。
View Code
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Web.Security; using System.Xml.Linq; using System.Linq; public partial class WeiXin : System.Web.UI.Page { /// <summary> /// 微信的Token /// </summary> const string Token = "token"; protected void Page_Load(object sender, EventArgs e) { string postStr = ""; Valid(); if (Request.HttpMethod.ToLower() == "post") { postStr = PostInput(); if (false == string.IsNullOrWhiteSpace(postStr)) { ResponseMsg(postStr); } } } /// <summary> /// 验证微信签名 /// </summary> /// * 将token、timestamp、nonce三个参数进行字典序排序 /// * 将三个参数字符串拼接成一个字符串进行sha1加密 /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 /// <returns></returns> private bool CheckSignature() { string signature = Request.QueryString["signature"].ToString(); string timestamp = Request.QueryString["timestamp"].ToString(); string nonce = Request.QueryString["nonce"].ToString(); string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } } private void Valid() { string echoStr = Request.QueryString["echoStr"].ToString(); if (CheckSignature()) { if (!string.IsNullOrEmpty(echoStr)) { Response.Write(echoStr); Response.End(); } } } /// <summary> /// 返回信息结果(微信信息返回) /// </summary> /// <param name="weixinXML"></param> private void ResponseMsg(string weixinXML) { //回复消息的部分:你的代码写在这里 //根据关键词 自定义回复 try { var xDoc = XDocument.Parse(weixinXML); var q = (from c in xDoc.Elements() select c).ToList(); var msgType = q.Elements("MsgType").First().Value; // 获取信息内容的类型 var _tmpContent = ""; #region =============== 处理MsgType:text ===================== if (0 == string.Compare("text", msgType, true)) { 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.IsNullOrWhiteSpace(model.Content)) { switch (model.Content.ToLower()) { case "帮助": case "help": case "hello2bizuser": //被关注时自动回复 _tmpContent = "使用帮助说明:\r\n------------------------\r\n" + "常用命令:\r\n" + "1、查看案例;\r\n" + "2、联系方式;\r\n" + "3、帮助或help;\r\n" + "------------------------\r\n如果喜欢就推荐给您的朋友,\r\n我们的微信号:gzjinri"; break; case "查看案例": _tmpContent = "查看案例:\r\n------------------------\r\n"; break; case "联系方式": _tmpContent = "联系方式:\r\n------------------------\r\n"; break; default: // 默认不做任务处理 break; } if (false == string.IsNullOrWhiteSpace(_tmpContent)) { var textTpl = "<xml>" + "<ToUserName><![CDATA[{0}]]></ToUserName>" + "<FromUserName><![CDATA[{1}]]></FromUserName>" + "<CreateTime>{2}</CreateTime>" + "<MsgType><![CDATA[{3}]]></MsgType>" + "<Content><![CDATA[{4}]]></Content>" + "<FuncFlag>{5}</FuncFlag>" + "</xml>"; Response.Write(string.Format(textTpl, model.FromUserName, model.ToUserName, ConvertDateTimeInt(DateTime.Now), "text", _tmpContent)); } } } #endregion } catch (Exception ex) { WriteLog(ex.ToString()); } Response.End(); } /// <summary> /// 获取POST返回来的数据 /// </summary> /// <returns></returns> private string PostInput() { try { System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[s.Length]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, buffer.Length)) > 0) { builder.Append(Request.ContentEncoding.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); return builder.ToString(); } catch (Exception ex) { throw ex; } } /// <summary> /// unix时间转换为datetime /// </summary> /// <param name="timeStamp"></param> /// <returns></returns> private DateTime UnixTimeToTime(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } /// <summary> /// datetime转换为unixtime /// </summary> /// <param name="time"></param> /// <returns></returns> private int ConvertDateTimeInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); return (int)(time - startTime).TotalSeconds; } /// <summary> /// 写日志(用于跟踪) /// </summary> private void WriteLog(string strMemo) { string filename = Server.MapPath("~/logs/log.txt"); if (!Directory.Exists(Server.MapPath("//logs//"))) Directory.CreateDirectory("//logs//"); StreamWriter sr = null; try { if (!File.Exists(filename)) { sr = File.CreateText(filename); } else { sr = File.AppendText(filename); } sr.WriteLine(strMemo); } catch { } finally { if (sr != null) sr.Close(); } } }