微信開發之自動回復


  今天跟大家分享一下微信自動回復功能開發,在這這次需要准備好自己的服務器(可以在外網上面訪問的),以及在公眾號上面進行服務器認證(可以參考上一篇文章),並且開啟服務器配置。

  用戶在給公眾號發生消息的時候,微信會把這些消息以xml格式的形式發送到開發者服務器對應的url上面;開發者接收到xml信息之后,可以對其進行解析,然后根據消息的內容回發對應的內容給用戶,回復的消息也是要以xml格式發送出去的。這里面有一個需要注意的就是,微信向開發者服務器發送請求的等待時間是5秒鍾,如果開發者服務器5秒內不能回復,微信會重新發送請求(最多三次),三次之后還是不能再5秒內回復或者回復的內容微信無法進行解析,就會顯示“該公眾號無法提供服務”。如果無法保證在5秒內回復,可以回復一個空字符串,微信不會對這個消息做任何處理。

  因為微信發送到開發者服務器的消息類型比較多樣化,有普通消息,關注事件,取消關注事件,按鈕點擊事件等。所以在設計自動回復功能的時候要充分考慮到程序的靈活性、可擴展性以及可維護性。

  這里我使用了“責任鏈設計模式”,定義一個處理接口,讓每一個消息處理程序都實現這個接口;接收到請求的時候,把該請求傳遞到第一個處理程序類,每一個請求類里面都包含下一個處理程序類的引用;如果請求可以在該類里面處理則直接返回處理結果,否則流向下一個處理程序類,直至該請求被處理完畢。該模式的特點是,把處理請求的步驟進行分解,可以對復雜的判斷條件進行分解,同時每一個處理程序都只有一個單一的職責,對其進行修改不會影響到其他處理程序類。另外,將每一個請求類以xml文件的格式配置好,應用程序啟動的時候,使用反射+IOC注入的方式實例化每一個處理程序類。

 

  因為代碼比較多,全部貼上來比較麻煩,下面貼上一下關鍵代碼:

 

  1、先看看責任鏈這里的設計:

  

  

  IResponsibility是接口層,Models下面的是實體,分別為,請求對象實體、返回對象實體以及環節信息實體(保存處理當前請求的“環節”的一些基本信息,包括它的當前環節名稱,下一個環節名稱,環節類的類型等),

CommandInitilizableBase是一個抽象類,里面只有一個方法,用於初始化責任鏈。CommandRequestBase是環節抽象基類,里面有一個ResponsibilityModel屬性用於獲取當前“環節”的環節信息實體、一個GetNextCommand方法,用戶獲取下一個環節處理類的實例,如果沒有則返回null。

   ResponsibilityModule是IResponsibility的實現,CommandRequestBuilder用於對鏈進行初始化,也提供了一個SetCommandInitilizableBase方法,可以自定義初始化責任鏈的實現類。

  Command文件夾下有兩個繼承了CommandRequestBase實現類,分別是:

  TextCommandRequest 主要功能是處理用戶發送的文本信息;

  SubscriptCommandRequest  是對關注事件的處理。

  Initilizable文件夾下的類是CommandInitilizableBase的實現類,用於處理責任鏈的初始化(其實就是解析xml,生成每個處理類的實例)。

 

  2、接收並解析xml,根據實體產生xml

  

  

    這里說的接收並解析xml,主要是針對密文模式進行講解(明文模式這個就不多講,因為明文模式下的xml比較簡單明了,可以參考下圖)。

  明文模式下接收到微信服務器發送的xml文件格式

  解密的過程就不啰嗦了,下面發一下解密代碼,這個在微信公眾平台上面也是可以找得到源代碼的:

  

  

  解密需要用到,encodingkey以及appid

  解密完成之后得到的xml跟明文模式下的xml內容完全一致,接下來的就是體力活...把對應節點的內容賦值給實體即可。

  解密完成之后,就是對用戶發送消息的處理了,這里面我用的是Autofac依賴注入框架(關於這個框架的使用,可以參考我的另一篇博客^_^,這里附上英文文檔一個,別問我有沒有中文,我也沒找到T_T||)。

處理請求完畢之后就是根據返回的實體生成xml,然后對這個xml進行加密,加密代碼如下:

  

  

  這里需要注意的是,加密之后還需要做小小處理:

  

  

  還需要重新拼接成一個新的xml

  這些都完成之后,剩下的就是將這個xml發回去給微信服務器了,

  只需要很簡單一步:

return Content(xmlContent, "text/xml");

  即可。

  下面是運行效果圖:

   由於本人比較懶,就是簡單地介紹了下,其實我本人覺得如果想要有進步還是應該多去看別人的代碼,理解別人的,才能將別人的變成自己的。下面貼上項目鏈接。

  點這里

 


免責聲明!

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



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