微信平臺不解釋了,若是不瞭解的百度一下下,若是不會用微信,請自宮,光盤重啓電腦,打開CMD輸入Format C:。網上有不少針對企業級的高級定製ASPX開發,寫得草草了事,不少男人幹事都草草了事,這可不行,您不懂小夥伴們的心情。初學者老是但願無碼,即不要太多代碼就能運行起來的示例,本人保證貼出來的代碼全是可運行的,代碼雖然有點乾癟,但給你想象和改造的空間很大,感受對於微信平臺是真正的互聯網技術改造傳統行業,爲何? 找度大娘(個人QQ26959368問我,別發郵件收不到!)。php
本代碼實現了接入微信平臺,而且能夠自動回覆和重複別人的話。要接入微信平臺,您必須有一個公網IP和保證您的80端口可用,全部使用ASPX技術 開發的網站應該在公網上均可見。本示例,可被改形成各類用途,本系統共包括4篇,最終要講到如何利用微信平臺整合SharePoint列表的數據,實現和 企業現的OA辦公平臺整合。算法
我是SharePoint 專家,固然要說說SharePoint的事情,對於那些企業保存了不少內容,SharePoint列表的內容的狀況,員工如何能經過微信查到這些內容,建一個ASPX的Web Application是接入微信最好的方式,考慮到SharePonit是.Net Framework架構的,因此必須使用C#來建一個網站,而且能夠接入到微信公衆平臺,固然本文內容並不限於SharePoint,那些想經過.Net 技術來創建微信運營平臺徹底能夠進來無節操圍觀,有了SharePoint不是限得高端、大氣、上檔次嘛,而且有了SharePoint您連CMS平臺都不用代碼,SharePoint天生一個CMS管理神器呀,堪稱0代碼建立本身的微信運營平臺!數據庫
微信公衆平臺的網址:mp.weixin.qq.com數組
請讀者能夠點擊以上的網站,申請一個微信公衆號,而後就能夠開始拉!安全
打開Visual Studio 2010, 新建一個ASPX WEB應用程序類型的項目, Visual Studio 會幫咱們自動地建立一些得得啵啵的文件,直接不理會,建立完畢後,以下圖右擊項目,選擇「添加」-「新建項」,以下圖選擇「通常處理程序」,而且命名爲"mp.ashx"。服務器
建立好了,添加以下的引用:微信
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.IO; using System.Text; using System.Xml; using System.Xml.XPath;using System.Security; using System.Net; using System.Collections; using System.Security.Cryptography;
提示:通常處理程序,能夠返回各類格式的HTTP響應數據,甚至包括但不限於GIF等圖像的格式哦,很是地強大並且靈活,但開發難度有點高,有一點相似LOL 中的盲僧,因微信公衆平臺支持探返回的數據格式通常是XML,但也包括一些非XML的字串什麼的,因此咱們使用通常處理程序能夠很是好完成任務。網絡
接口的接入過程其實很簡單,用糙人的一句話就是,哥我喊一個「哎。。。」,妹紙你回一個「哎。。。」,咱就結婚成功了(程序直接回復echostr參數),固然要更深度的結合,決不止那麼簡單。架構
哥哥您想呀,若是夜半三更,爬上妹妹牀頭的不是哥哥您,而是一個叫dosboy的駭客,後果我都沒有辦法再想下去了,因此微信開通前,妹紙您要告訴哥哥(微信平臺)口令(在微信中預設一個令牌Token)。微信公衆平臺
哥哥每回有接入要求的時候,妹紙驗明正身就能夠拉,由於網絡都是明文(dosboy會在窗下偷聽的哦),因此這個驗證不能直接傳遞Token,而要經過必定算法,微信的文檔下:
根據微信的文檔,開發者提交信息後,微信服務器將發送GET請求到填寫的URL上,GET請求攜帶四個參數:
參數 | 描述 |
---|---|
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。
加密/校驗流程以下: 1. 將token、timestamp、nonce三個參數進行字典序排序 2. 將三個參數字符串拼接成一個字符串進行sha1加密 3. 開發者得到加密後的字符串可與signature對比,
根據以上信息,我寫了一個函數,這個函數必定要使用,若是您堅持不驗明正身,平臺代碼也能夠接入的,可是危險程度您本身判斷:
private bool checkSignature(string signature,string timestamp,string nonce,string token) { ArrayList tmpArray = new ArrayList(); tmpArray.Add(token); tmpArray.Add(timestamp); tmpArray.Add(nonce); tmpArray.Sort(); string tmpStr = (string)tmpArray[0] + (string)tmpArray[1] + (string)tmpArray[2]; //創建SHA1對象 SHA1 sha = new SHA1CryptoServiceProvider(); //將mystr轉換成byte[] ASCIIEncoding enc = new ASCIIEncoding(); byte[] dataToHash = enc.GetBytes(tmpStr); //Hash運算 byte[] dataHashed = sha.ComputeHash(dataToHash); //將運算結果轉換成string string hash = BitConverter.ToString(dataHashed).Replace("-", ""); log("hash:" + hash); //記錄日誌,不須要能夠註釋掉 if(hash.ToLower()==signature.ToLower()) return true; else return false; }
程序中我用了一個記錄日誌的函數,在這裏我也貼上來,若是你們不需能夠能夠註釋掉紅色的那行:
private void log(string stringinput) { StreamWriter sw = new StreamWriter("C:\\微信日誌.txt", true); sw.WriteLine(DateTime.Now.ToString() + "," + stringinput); sw.Close(); }
想搞微信平臺就要接入幾百個或更多公衆號,必竟委託給你的妹紙起碼三宮六院,作好管理仍是有必要的,數據庫的技術是必須滴,因此在這裏,我使用了SQL SERVER 2008R2,把全部的接入信息都寫入數據庫的「微信號列表」,這裏我就簡簡單單使用了數據庫的Update,函數爲 LandMPUpdateSQLServer() 代碼以下:
表的結構我就截個圖,若是看官只想測試一下如何接入,直接閃現到下一節。
private void LandMPUpdateSQLServer(HttpContext context) { SqlConnection connMpDb = new SqlConnection(connectionString); //connectionString爲預先定義的鏈接串 connMpDb.Open(); SqlCommand comMpDb = new SqlCommand("update 微信號列表 set signature=@signature,timestamp=@timestamp,nonce=@nonce,echostr=@echostr,[驗證]=1 Where ID=*****", connMpDb); foreach (string s in OpenParameters) //OpenParameters 爲4個參數名的數組,即 "signature","timestamp","nonce","echostr" { SqlParameter sp = comMpDb.Parameters.Add("@" + s, System.Data.SqlDbType.VarChar); if (context.Request.QueryString.AllKeys.Contains(s)) sp.Value = context.Request.QueryString[s]; else sp.Value = "No Value"; } comMpDb.ExecuteNonQuery(); connMpDb.Close(); }
(1)請加上變量聲明:
在以下的位置後面,即mp類裏填加上2個類的變量的定義
public class mp : IHttpHandler
{
//接入參數 private string[] OpenParameters = { "signature", "timestamp", "nonce", "echostr" }; //SQL鏈接字串,您能夠定義成一個字符串,我是從系統設置裏取的 private string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["testmpConnectionString"].ConnectionString;
(2)請完成主程序:
請在
public void ProcessRequest(HttpContext context) 內填加上以下的語句
提示: 這是一個系統函數,每次微信有事件發生時(好比有人給你發消息拉,加你爲關注拉什麼的)的微信就會主動出動聯繫你給它填的URL地址,這個函數內的代碼就會激發運行!
【自動回覆】 以下的代碼運行,不只僅會讓您的程序接入微信的公衆平臺,而且還能自動重複回覆別人發的話,看看以下的效果圖,你和你的小夥伴是否是已經驚呆了!若是您不要這個功能的話這個程序,您只要保留
1-16行的代碼,其它全刪除!就已經徹底作到接入微信公衆平臺,若是您再想您的程序智能一點,好比您的妹紙給你發,「我如今就要」,你自動回覆 「本人正在忙」(活該你單身),請改造17行之後的代碼,徹底夠用了。
【數據庫】 不想碰數據庫,就註釋掉14行
1 bool isLanding = true; 2 foreach (string s in OpenParameters) 3 { 4 if (!context.Request.QueryString.AllKeys.Contains(s)) 5 isLanding = false; 6 7 } 8 9 //toke 爲 AAA時驗證是不是微信的請求 10 if (isLanding && checkSignature(context.Request.QueryString["signature"], context.Request.QueryString["timestamp"], context.Request.QueryString["nonce"],"AAA")) 11 { 12 context.Response.ContentType = "text/plain"; 13 string echoString = context.Request.QueryString["echostr"]; 14 LandMPUpdateSQLServer(context); 15 context.Response.Write(echoString); 16 } 17 else 18 { 19 //讀取發過來的信息到inputXml變量中 20 Stream sin = context.Request.InputStream; 21 byte[] readBytes; 22 readBytes = new byte[sin.Length]; 23 sin.Read(readBytes, 0, readBytes.Length); 24 string inputXml = Encoding.UTF8.GetString(readBytes); 25 26 //使用XMLDocument加載信息結構 27 XmlDocument xmlDoc = new XmlDocument(); 28 xmlDoc.LoadXml(inputXml); 29 string stringMsgId = xmlDoc.SelectSingleNode("//MsgId").InnerText; 30 31 //把傳過來的XML數據各個字段區分出來,而且填到fields這個字典變量中去 32 Dictionary<string, string> fields = new Dictionary<string, string>(); 33 foreach (XmlNode x in xmlDoc.SelectSingleNode("/xml").ChildNodes) 34 { 35 fields.Add(x.Name, x.InnerText); 36 37 } 38 //造成返回格式的XML文檔 39 string returnXml = "<xml><ToUserName><![CDATA[" + 40 fields["FromUserName"] + "]]></ToUserName><FromUserName><![CDATA[" + 41 fields["ToUserName"] + "]]></FromUserName><CreateTime>" + 42 DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + 43 fields["Content"] + "]]></Content></xml>"; 44 45 context.Response.ContentType = "text/xml"; 46 context.Response.Write(returnXml); 47 48 }
(此處省略18000字,記得記上稿費)
在公衆平臺網站的高級功能 – 開發模式頁,點擊「成爲開發者」按鈕,填寫URL和Token,其中URL是開發者用來接收微信服務器數據的接口URL。Token可由開發者任意填寫, 用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。