創建後,添加以下引用:
使用系統;
使用系統。集合。泛型;
使用系統。Linq
使用系統。Web
使用系統。Data . SqlClient
使用系統。木衛壹;
使用系統。文本;
使用系統。Xml
使用系統。Xml . XPath使用系統。安全性;
使用System.Net;
使用系統。收藏;
使用系統。安全。密碼術;
提示:通用處理程序可以返回各種格式的HTTP響應數據,甚至包括但不限於GIF和其他圖像的格式。很強大,很靈活,但是開發起來有點困難,有點像LOL裏的盲僧。因為微信公眾平臺支持查詢,所以返回的數據格式壹般是XML,但是也包含了壹些非XML的字符串,所以我們用通用的處理程序就可以很好的完成任務。
2編寫簽名檢查函數
接口的訪問過程其實很簡單。壹句粗話,我喊了壹聲“餵。。。",妹紙妳回個“啊。。。"我們會結婚成功的(程序直接回復echostr參數)。當然,我們需要更深層次的結合,不是那麽簡單的。
兄弟,想想吧。如果不是妳哥哥半夜爬上我妹妹的床,而是壹個叫dosboy的黑客,後果我不敢再想了。所以在微信開通前,妳要把密碼(微信平臺)告訴妳哥(微信裏預置了壹個令牌)。
每次哥哥有訪問請求,妹紙都可以拉過來,因為網絡是明文(dosboy會在窗下偷聽),所以這個驗證不能直接傳令牌,而是通過壹定的算法,在微信文檔下:
根據微信文檔,開發者提交信息後,微信服務器會向填充的URL發送GET請求,GET請求攜帶四個參數:
參數
形容
簽名微信加密簽名,簽名將開發者填充的令牌參數與請求中的時間戳參數和nonce參數結合在壹起。
時間戳時間戳
隨機數隨機數
Echostr隨機字符串
開發人員通過驗證簽名來驗證請求(下面有驗證方法)。如果確認GET請求來自微信服務器,請原樣返回echostr參數內容,訪問生效,開發者成功,否則訪問失敗。
加密/驗證過程如下:1。按照字典順序對令牌、時間戳和nonce這三個參數進行排序。2.將三個參數字符串拼接成壹個字符串,用於sha1加密。3.開發人員獲得的加密字符串可以與簽名進行比較。
根據以上信息,我寫了壹個函數,壹定要用。如果妳堅持不驗證身份,平臺代碼也可以訪問,但是妳可以自己判斷危險程度:
私有布爾校驗簽名(字符串簽名、字符串時間戳、字符串隨機數、字符串令牌)
{
ArrayList tmp array = new ArrayList();
tmpArray。添加(令牌);
tmpArray。添加(時間戳);
tmpArray。add(nonce);
tmpArray。sort();
string tmp str =(string)tmp array[0]+(string)tmp array[1]+(string)tmp array[2];
//創建SHA1對象。
sha 1 sha = new sha 1 cryptoserviceprovider();
//將mystr轉換為byte[]
asciencoding enc = new asciencoding();
byte[] dataToHash = enc。GetBytes(tmpStr);
//哈希運算
byte[] dataHashed = sha。compute hash(dataToHash);
//將運算結果轉換成字符串。
字符串哈希=位轉換器。ToString(dataHashed)。替換("-"," ");
log(" hash:"+hash);//記錄日誌,不需要註釋。
如果(哈希。to lower()= =簽名。ToLower())
返回true
其他
返回false
}
我在程序裏用了壹個登錄的功能,貼在這裏。如果不需要,可以註釋掉紅線:
私有void日誌(字符串stringinput)
{
streamwriter SW = new streamwriter(" c:\ \微信log.txt ",true);
西南。WriteLine(日期時間。Now.ToString() +","+stringinput);
西南。close();
}
3訪問接口寫數據庫代碼
想要搭建壹個微信平臺,就得接入上百個甚至更多的微信官方賬號。妳至少要把三宮六院托付給妳的妹紙。要做好管理,數據庫的技術壹定要降。所以在這裏,我使用SQL SERVER 2008R2將所有的訪問信息寫入數據庫的“微信號列表”。在這裏,我簡單地使用數據庫的更新。該函數是LandMPUpdateSQLServer()代碼,如下所示:
我就切壹張桌子的結構圖。如果讀者只是想測試如何訪問,直接閃到下壹節。
私有void landmpupdatesql server(HttpContext上下文)
{
SqlConnection connMpDb = new SqlConnection(connectionString);//connectionString是預定義的連接字符串。
connMpDb。open();
sqlcommand commpdb = new sqlcommand("更新微信號列表set signature = @ signature,timestamp = @ timestamp,nonce = @ nonce,echostr = @ echostr,[verification] = 1其中ID = * * * ",conn mpdb);
foreach(open parameters中的string s)//open parameters是四個參數名的數組,分別是“signature”、“timestamp”、“nonce”和“echostr”。
{
SqlParameter sp = comMpDb。參數。Add("@" + s,System。data . sqldbtype . varchar);
如果(上下文。request . query string . all keys . contains)
物種價值=背景。Request . QueryString
其他
物種Value = "無值";
}
comMpDb。ExecuteNonQuery();
connMpDb。close();
}
4.完成編碼訪問接口
(1)請添加變量聲明:
在後面的位置,也就是mp類的後面,填充了兩個類的變量的定義。
公共課議員:IHttpHandler
{
//訪問參數
private string[]open parameters = { " signature "," timestamp "," nonce "," echostr " };
//SQL連接字符串,可以定義為字符串。我從系統設置裏得到的。
私有字符串connectionString = System。configuration . configuration manager . connection strings[" testmpConnectionString "]。ConnectionString
(2)請完成主程序:
請簽到
將以下語句添加到公共void流程請求(httpcontext)中
提示:這是壹個系統函數。微信上每次發生事件(比如有人給妳發消息,加妳關註什麽的),微信都會主動聯系妳填寫網址地址,這個功能裏的代碼就會被激活!
自動回復下面的代碼操作,不僅能讓妳的程序訪問微信的公眾平臺,還能自動回復別人反復發來的話。看下面這張效果圖。妳和妳的朋友們是不是已經驚呆了?如果妳不想要這個功能,妳只需要保留這個程序。
1-16行代碼,其他全部刪除!妳已經完全接入了微信公眾平臺。如果妳希望妳的程序更聰明,比如妳的妹紙給妳發“我現在就要”,妳自動回復“我很忙”(妳活該單身)。請修改17行後的代碼,完全夠用。
如果數據庫不想碰數據庫,就註釋掉14行。
1布爾孤島化=真;
2 foreach(open parameters中的字符串s)
3 {
4如果(!語境。request . query string . all keys . contains)
5孤島化=假;
六
7 }
八
Toke為AAA時驗證是否為微信請求。
10 if(孤島& amp& ampcheckSignature(上下文。request . query string[" signature "],上下文。request . query string[" timestamp "],上下文。Request.QueryString["nonce"]," AAA "))
11 {
12上下文。response . content type = " text/plain ";
13字符串echoString =上下文。request . query string[" echostr "];
14 LandMPUpdateSQLServer(上下文);
15上下文。response . Write(echoString);
16 }
17其他
18 {
19 //將發送的信息讀入inputXml變量。
20流sin =上下文。請求. InputStream
21 byte[]read bytes;
22讀取字節=新字節[sin。長度];
23罪。讀取(readBytes,0,readBytes。長度);
24字符串inputXml =編碼。UTF8 . GetString(read bytes);
25
26 //使用XMLDocument加載信息結構
27 XML document XML doc = new XML document();
28 xmlDoc。load XML(input XML);
29字符串stringMsgId = xmlDoc。SelectSingleNode("//MsgId ")。InnerText
30
31 //區分傳遞過來的XML數據的字段,填入字典變量字段。
32字典& ltstring,string & gtfields =新詞典& ltstring,string & gt();
33 foreach(xmlDoc中的XmlNode x。SelectSingleNode("/xml ")。子節點)
34 {
35個字段。Add(x.Name,x . InnerText);
36
37 }
38 //返回格式的表單XML文檔
39 string returnXml = " & ltxml & gt& ltToUserName & gt& lt![CDATA[" +
40個字段["來自用戶名"]+"]]& gt;& lt/touser name & gt;& ltfrom用戶名& gt& lt![CDATA[" +
41個字段[" ToUserName "]+"]]& gt;& lt/from username & gt;& ltCreateTime >+
42日期時間。Now.Subtract(新日期時間(1970,1,1,8,0,0)). total seconds . tostring()+" & lt;/create time & gt;& ltMsgType & gt& lt![CDATA[text]]& gt;& lt/msg type & gt;& lt內容& gt& lt![CDATA[" +
43個字段[" Content "]+"]]& gt;& lt/Content & gt;& lt/XML >;;
四十四
45上下文。response . content type = " text/XML ";
46上下文。response . Write(return XML);
47
48 }
5把程序發布到網上(這裏不解釋),壹定要用80端口。
(此處省略18000字,記得記下稿費。)
6在微信公眾平臺上,進行如下設置:
在公眾平臺網站的高級功能-開發模式頁面,點擊“成為開發者”按鈕,填寫URL和Token,其中URL是開發者用來接收微信服務器數據的接口URL。令牌可以由開發人員任意填寫,以生成簽名(該令牌將與接口URL中包含的令牌進行比較,以驗證安全性)。