當前位置:成語大全網 - 書法字典 - 如何用C#構建響應微信訪問和自動回復的代碼?

如何用C#構建響應微信訪問和自動回復的代碼?

打開Visual Studio 2010,創建壹個ASPX WEB應用程序類型的新項目。Visual Studio會幫我們自動創建壹些bam bam文件,直接忽略。創建後,右鍵單擊如下所示的項目並選擇Add-New Item。選擇如下所示的通用處理程序,並將其命名為“mp.ashx”。

創建後,添加以下引用:

使用系統;

使用系統。集合。泛型;

使用系統。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中包含的令牌進行比較,以驗證安全性)。