微信平臺ASPX高級定製開發(一):如何使用C#創建響應微信接入和自動回覆的代碼

微信平臺不解釋了,若是不瞭解的百度一下下,若是不會用微信,請自宮,光盤重啓電腦,打開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數組

請讀者能夠點擊以上的網站,申請一個微信公衆號,而後就能夠開始拉!安全

1 建立Visual Studio項目

打開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的字串什麼的,因此咱們使用通常處理程序能夠很是好完成任務。網絡

 

2 編寫signature校驗函數

 

接口的接入過程其實很簡單,用糙人的一句話就是,哥我喊一個「哎。。。」,妹紙你回一個「哎。。。」,咱就結婚成功了(程序直接回復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();
        }

 

 3 接入接口寫入數據庫代碼

想搞微信平臺就要接入幾百個或更多公衆號,必竟委託給你的妹紙起碼三宮六院,作好管理仍是有必要的,數據庫的技術是必須滴,因此在這裏,我使用了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();
}

4 完成代碼編寫接入接口

 

(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                 }

 

 

 

 

 

 

5 把程序發佈到互聯網上(此處不解釋),注意必定要80端口

 

 

 (此處省略18000字,記得記上稿費)

 

6 在微信公衆平臺上,作以下設置:

 

 

在公衆平臺網站的高級功能 – 開發模式頁,點擊「成爲開發者」按鈕,填寫URL和Token,其中URL是開發者用來接收微信服務器數據的接口URL。Token可由開發者任意填寫, 用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。 填寫信息

 

什麼也不說了,直接上效果圖!

 

相關文章
相關標籤/搜索