.net微信公眾號開發——快速入門


作者:王先榮

    最近在學習微信公眾號開發,將學習的成果做成了一個類庫,方便重復使用。

    現在微信公眾號多如牛毛,開發微信的高手可以直接無視這個系列的文章了。

    使用該類庫的流程及寥寥數行代碼得到的結果如下。

  

    本文的源代碼主要在: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.asax

1 引用微信公眾號類庫

    引用xrwang.weixin.PublicAccount。

 

2 添加公眾號信息

    添加提供服務的公眾號的信息,包括:原始id、AppId、AppSecret、EncodingAESKey。代碼如下:

AccountInfoCollection.SetAccountInfo(new AccountInfo("YourOriginalId", "AppId", "AppSecret", "Token", "EncodingAESKey"));

    如果需要同時給多個公眾號提供服務,重復上面這行代碼就可以了。

    注:由於微信服務器的原因,如果在一個站點中要同時給多個公眾號提供服務,有兩種方法:如果用同一頁面處理多個公眾號,那么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");

    }
處理GET請求

(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,歡迎在不篡改作者的前提下轉載以傳播知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM