微信服務器配置接收頁面示例代碼
/// <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.IsNullOrEmpty(postStr)) { ResponseMsg(postStr); } } } /// <summary> /// 返回信息結果(微信信息返回) /// </summary> /// <param name="weixinXML"></param> private void ResponseMsg(string weixinXML) { //回復消息的部分:你的代碼寫在這里 //根據關鍵詞 自定義回復 string ToUserName = ""; string FromUserName = ""; string CreateTime = ""; try { WriteLog(weixinXML); var xDoc = XDocument.Parse(weixinXML); var q = (from c in xDoc.Elements() select c).ToList(); var msgType = q.Elements("MsgType").First().Value; // 獲取信息內容的類型 //按鈕事件 if (0 == string.Compare("event", msgType, true)) { ToUserName = q.Elements("ToUserName").First().Value;//開發者微信號 FromUserName = q.Elements("FromUserName").First().Value;//發送方帳號(一個OpenID) #region 事件 string strEvent = ""; string strEventKey = ""; strEvent = q.Elements("Event").First().Value; CreateTime = q.Elements("CreateTime").First().Value; //單擊事件 if (strEvent.ToLower() == "click") { //圖文推送 strEventKey = q.Elements("EventKey").First().Value; } //關注公眾號 else if (strEvent.ToLower() == "subscribe") { strEventKey = q.Elements("EventKey").First().Value; //未關注掃描帶參數的二維碼 if (strEventKey.Contains("qrscene_")) { string vaule = strEventKey.Replace("qrscene_", ""); } } //已關注掃描帶參數的二維碼 else if (strEvent.ToLower() == "scan") { strEventKey = q.Elements("EventKey").First().Value; } #endregion } //用戶文本信息 else if (0 == string.Compare("text", msgType, true)) { } } catch (Exception ex) { WriteLog(ex.ToString()); } Response.End(); } /// <summary> /// 圖片消息 /// </summary> /// <param name="ToUsername"></param> /// <param name="FromUserName"></param> /// <returns></returns> public static bool SendWxPic(string ToUsername, string FromUserName, string MediaId) { var textTpl = "<xml>" + "<ToUserName><![CDATA[{0}]]></ToUserName>" + "<FromUserName><![CDATA[{1}]]></FromUserName>" + "<CreateTime>{2}</CreateTime>" + "<MsgType><![CDATA[image]]></MsgType>" +"<Image>" +"<MediaId><![CDATA[{3}]]></MediaId>" +"</Image>" + "</xml>"; HttpResponse resp = System.Web.HttpContext.Current.Response; resp.Write(string.Format(textTpl, FromUserName, ToUsername, ConvertDateTimeInt(DateTime.Now), MediaId)); return true; } /// <summary> /// 消息轉發到客服 /// </summary> /// <param name="ToUsername"></param> /// <param name="FromUserName"></param> /// <returns></returns> public static bool SendWx(string ToUsername, string FromUserName) { var textTpl = "<xml>" + "<ToUserName><![CDATA[{0}]]></ToUserName>" + "<FromUserName><![CDATA[{1}]]></FromUserName>" + "<CreateTime>{2}</CreateTime>" + "<MsgType><![CDATA[transfer_customer_service]]></MsgType>" + "</xml>"; HttpResponse resp = System.Web.HttpContext.Current.Response; resp.Write(string.Format(textTpl, FromUserName, ToUsername, ConvertDateTimeInt(DateTime.Now))); return true; } /// <summary> /// 回復文本消息 /// </summary> /// <param name="ToUsername"></param> /// <param name="FromUserName"></param> /// <param name="_tmpContent"></param> /// <returns></returns> public static bool SendWx(string ToUsername, string FromUserName, string _tmpContent) { var textTpl = "<xml>" + "<ToUserName><![CDATA[{0}]]></ToUserName>" + "<FromUserName><![CDATA[{1}]]></FromUserName>" + "<CreateTime>{2}</CreateTime>" + "<MsgType><![CDATA[{3}]]></MsgType>" + "<Content><![CDATA[{4}]]></Content>" + "</xml>"; //_tmpContent = "你已經選擇了明細,謝謝!"; HttpResponse resp = System.Web.HttpContext.Current.Response; resp.Write(string.Format(textTpl, FromUserName, ToUsername, ConvertDateTimeInt(DateTime.Now), "text", _tmpContent)); return true; } /// <summary> /// 檢驗signature /// </summary> private void Valid() { //微信服務器配置提交時,echoStr才不為空。 string echoStr = Request.QueryString["echoStr"]; if (echoStr != null) { if (CheckSignature()) { if (!string.IsNullOrEmpty(echoStr)) { Response.Write(echoStr); Response.End(); } } } } /// <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 = Cryptography.SHA1_Hash(tmpStr); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } } /// <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> public static 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(Server.MapPath("//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(); } }
以上代碼是公司要做微信一些功能做的代碼總結,網上找的時候感覺代碼雖然封裝的很好。但是要用麻煩。覺得沒必要封裝的那么簡潔。如果需要封裝,自己在去封裝。
