做者:王先榮git
最近在學習微信公衆號開發,將學習的成果作成了一個類庫,方便重複使用。服務器
如今微信公衆號多如牛毛,開發微信的高手能夠直接無視這個系列的文章了。微信
使用該類庫的流程及寥寥數行代碼獲得的結果以下。ide
本文的源代碼主要在:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/xrwang.net/WeixinInterface.ashx以及http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/xrwang.net/Global.asaxpost
1 引用微信公衆號類庫性能
引用xrwang.weixin.PublicAccount。學習
2 添加公衆號信息測試
添加提供服務的公衆號的信息,包括:原始id、AppId、AppSecret、EncodingAESKey。代碼以下:優化
AccountInfoCollection.SetAccountInfo(new AccountInfo("YourOriginalId", "AppId", "AppSecret", "Token", "EncodingAESKey"));
若是須要同時給多個公衆號提供服務,重複上面這行代碼就能夠了。spa
注:因爲微信服務器的緣由,若是在一個站點中要同時給多個公衆號提供服務,有兩種方法:若是用同一頁面處理多個公衆號,那麼Token必須一致(1)能夠在接口配置信息的URL中加入區分公衆號的參數(例如:http://www.xrwang.net/WeixinInterface.ashx?username=gh_5dbae931ec49);(2)針對每一個公衆號單獨創建一個頁面來處理。我目前採用了第一種方式,這樣更簡便。
我喜歡將添加公衆號信息的工做放到Gobal.asax的Application_Start方法中。
3 與微信服務器通訊
我添加了名爲「WeixinInterface.ashx」的通常處理頁,並在其中與微信服務器進行通訊,包括:校驗請求、處理請求、回覆適當的響應。代碼以下:
public void ProcessRequest(HttpContext context) { string result = string.Empty; if (Validate(context)) { if (context.Request.HttpMethod == WebRequestMethods.Http.Get) result = HandleGet(context); else if (context.Request.HttpMethod == WebRequestMethods.Http.Post) result = HandlePost(context); } else Message.Insert(new Message(MessageType.Exception, "校驗消息失敗。\r\n地址:" + context.Request.RawUrl)); context.Response.Write(result); }
3.1 校驗請求
首先,咱們須要校驗接收到的請求是否來自微信服務器,方法以下:
/// <summary> /// 驗證消息的有效性 /// </summary> /// <param name="context"></param> /// <returns>若是消息有效,返回true;不然返回false。</returns> private bool Validate(HttpContext context) { string token = AccountInfoCollection.First.Token; //因爲在校驗微信簽名時,微信未傳入公衆號,所以這裏用第一個公衆號的TOKEN string signature = RequestEx.TryGetQueryString("signature"); string timestamp = RequestEx.TryGetQueryString("timestamp"); string nonce = RequestEx.TryGetQueryString("nonce"); if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce)) return false; return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce); }
固然,若是你對世界充滿愛,相信沒有欺騙;若是你厲行節約,急需提升性能;不校驗也是能夠的。
3.2 處理請求
校驗完請求以後,咱們分兩種狀況處理請求:
(1)微信服務器的GET請求,用來驗證咱們的服務器是否正在工做,咱們直接返回echostr就能夠了;
/// <summary> /// 處理微信的GET請求,校驗簽名 /// </summary> /// <param name="context"></param> /// <returns>返回echostr</returns> private string HandleGet(HttpContext context) { return RequestEx.TryGetQueryString("echostr"); }
(2)微信服務器的POST請求,這是服務器分發給咱們的消息,咱們須要解析消息。
RequestMessageHelper helper = new RequestMessageHelper(context.Request);
3.3 回覆響應
解析完微信服務器分發給咱們的消息以後,咱們要作出迴應。我這裏把收到的消息直接發回去,偷懶~\(≧▽≦)/~啦啦啦
/// <summary> /// 處理微信的POST請求 /// </summary> /// <param name="context"></param> /// <returns>返回xml響應</returns> private string HandlePost(HttpContext context) { RequestMessageHelper helper = new RequestMessageHelper(context.Request); if (helper.Message != null) { ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message); return responseMessage.ToXml(helper.EncryptType); } else return string.Empty; } /// <summary> /// 處理請求消息,返回響應消息 /// </summary> /// <returns>返回響應消息</returns> private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage) { ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName, DateTime.Now, string.Format("自動回覆,請求內容以下:\r\n{0}", requestMessage)); response.Content += "\r\n<a href=\"http://www.cnblogs.com\">博客園</a>"; return response; }
固然了,正常狀況下,咱們須要兵來將擋水來土掩,根據不一樣的請求,回覆對應的響應。若是須要對請求排隊,再一一回復客服消息,能夠先直接回復空字符串。回覆客服消息的方法請看後面的文章。
4 微信公衆號類庫簡介
xrwang.weixin.PublicAccount是一套簡化微信公衆號開發的類庫,由王先榮開發,而且正在添磚加瓦中。採用MIT開源協議,你們能夠隨便用,別刪掉個人名字就能夠啦。
源代碼的地址是:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount
若是發現BUG,請在博客中留言,或者給我發電子郵件:xrwang(a)126.com。
千萬不要用QQ或者阿里旺旺聊天,打擾我玩遊戲,我會罵人的 >.<
5 體驗測試號
下面分別是個人測試號和公衆號,您能夠對照文章來體驗哦。
測試號 |
|
測試號權限多,幾乎能夠測試公衆平臺的全部功能。 |
個人公衆號 xrwang |
|
我的訂閱號,功能較少,不過我會特別優化。 |
好了,感謝您看完本文,但願對您有所幫助。本文來自xrwang的博客http://xrwang/cnblogs.com,歡迎在不篡改做者的前提下轉載以傳播知識。