微信公衆號開發總結

官網是最好的文檔來源。html

1、明確結構

首先,須要搞清楚三個實體:python

  • 微信服務器
  • 個人服務器
  • 用戶

這三個實體之間的關係以下所示:微信服務器至關於一個代理、一箇中轉站。nginx

一旦明確了三者之間的關係,其它問題就變得天然而然了:git

  • 微信服務器和個人服務器之間如何進行數據交換?
    以什麼樣的格式進行通訊?XML、JSON等格式
  • 微信服務器怎麼知道個人服務器在哪裏?
    即如何經過微信公衆號綁定個人服務器?
  • 如何保證安全性?
    爲了防止別人冒充個人服務器,個人服務器跟微信服務器進行交互時必須攜帶一些憑證。
  • 如何傳遞多媒體數據?

2、帳號類型與權限

微信公衆號分爲訂閱號、服務號、企業號三種。申請服務號和企業號須要相關資質證實,訂閱號我的就能夠申請。
目前,不少我的訂閱號都是人工操做的,它們並無綁定服務器,沒有自動回覆功能。可是能夠手動回覆圖片、文本等消息。
對於我的訂閱號來講,綁定服務器後,個人服務器和微信服務器之間的交互很是有限,好比不能發送客服消息、不能發送圖片。這一點,我認爲微信太封閉了。github

功能最豐富的是測試號,測試號包含微信公衆號的一切功能。數據庫

3、消息類型

個人服務器和微信服務器之間的消息分爲兩種:被動回覆消息和客服消息。
對於被動回覆消息的處理,須要編寫Web接口來處理請求。若是使用Java語言,能夠編一個Servlet或者使用SpringMVC框架;若是使用Python語言,能夠用Flask或者Django。對於這部份內容,能夠參考這篇博客:Flask接通微信公衆號緩存

對於客服消息,須要編寫代碼向微信服務器發送HTTP請求。客服消息是個人服務器主動向微信服務器發送的。若是使用Java語言,可使用HttpClient庫;若是使用Python語言,固然要使用requests庫。安全

對於微信服務器向個人服務器發送的消息(也就是用戶向微信服務器發送的消息),有兩種方式:get方式和post方式。服務器

  • get方式
    僅僅用來完成綁定「個人服務器」時的握手操做
  • post方式
    用來發送用戶消息。實際上,咱們所要作的就是解析post來的數據,而後按照官網規定的格式回覆之。

因此,跟微信服務器打交道用到的就是Http請求:回覆Http請求和發送Http請求。微信

4、關於accessToken

個人服務器向微信服務器發送客服消息(也就是發起HTTP請求,主動發送消息)時,必須攜帶憑證,這個憑證就是accessToken。試想,若是沒有這個憑證,張三的服務器也能夠冒充個人服務器向微信服務器發送一堆垃圾消息,進而發送給了個人微信公衆號的用戶,那對個人公衆號將是毀滅性的災難。
accessToken的獲取須要依賴兩樣東西:

  • appId:標誌着你的公衆號的id,不一樣公衆號不同,這個是公開的
  • appSecret:app密鑰,這個密鑰是騰訊隨機生成的,這個是私有的,打死不能告訴別人

有了這兩樣東西,咱們就能夠經過發送HTTP請求來獲取accessToken了。

注意,accessToken是臨時生成的,只在一段時間內有效(3天時間),過時以後就須要從新像微信服務器請求新的accessToken。
這個過程最佳實踐是這樣的:當向微信服務器發送HTTP請求失敗的時候,檢查錯誤碼,看看是否是由於accessToken,若是是,那麼更新accessToken。一言以蔽之,accessToken只在必要的時候才更新,這是一種懶惰加載的機制。對於微信服務器返回的錯誤碼,官方文檔介紹很是詳細。
要注意,不能夠每次發送HTTP請求前都得到新的accessToken,這對於微信服務器和個人服務器來講都是一種浪費,正由於如此,微信服務器限制天天容許獲取的accessToken個數不超過2000個。

5、關於Session

衆所周知,Session和Cookie是Web技術中重要的存儲方式。可是,由於有了微信服務器從中攪和,個人服務器再也沒法在Session和Cookie中存放消息了。由於對於個人服務器來說,只有一個用戶,那就是微信服務器。我存儲的Cookie和Session跟我微信公衆號實際的用戶半毛錢關係都沒有。
因而,本身實現Session機制可能在有些應用中是必需的。這能夠經過Redis來實現。由於Redis自己就是緩存數據庫,調用簡單。

6、重要的開發實踐:使用日誌

在微信服務器開發過程當中,須要不斷更改代碼,而後上傳到服務器。在開發過程當中,這個過程是繁瑣的,拋出異常以後,必需要很快定位錯誤,所以,編寫的程序必須創建打印日誌。
當微信接口調試好了以後,在開發中就不要經過微信來檢查程序了,而要用本地命令行充當用戶,調用程序進行處理。這樣省去不少部署過程。

7、使用微信框架

不管是Java語言仍是Python語言,開源社區早就已經退出了完善的微信框架。使用框架的好處在於:咱們能夠集中精力與業務邏輯,而沒必要關注與微信服務器之間的交互。
Java微信框架有:

Python微信框架有:

固然,使用框架也有必定的壞處:若是不瞭解框架細節,出了問題很差定位。若是學習框架用法比學習直接實現微信接口更難,不如直接本身實現。
即使是不使用框架,本身實現,代碼量也不會超過200行,在只使用微信公衆號部分功能的的狀況下尤其如此。本身實現的過程其實就是實現協議的過程,這個過程只須要參考着文檔來實現,並無什麼技術難度。

8、綁定個人服務器

登陸微信服務器以後,在左側導航欄找到「開發/基本配置」,綁定個人服務器的全部操做都在此頁完成。

這三項肯定以後,就能夠發送客服消息了。前兩項appId和appSecret用於從服務器獲取accessToken,這樣微信服務器纔會搭理你。第三項是IP白名單,只有在IP白名單中的IP才能夠給微信服務器發送消息。

而後在「修改配置」中,綁定URL,填寫token,根據本身狀況看看是否須要加密

關於「修改配置」強調三點:

  • 綁定URL:URL必須是http或者https開頭,必須是80端口(可使用nginx配置轉發規則,從而實現多個應用共用80端口)
  • 輸入token:這個token用於跟「個人服務器」之間的第一次握手。對於第一次握手,過程詳見微信開發者文檔。原理就是:微信服務器給你幾個字符串,你對這幾個字符串排序、加密、驗證一下這幾個字符串,而後返回echostr。這個過程的意義在於:讓「個人服務器」認識微信服務器,若是「個人服務器」不能作到這一點(也就是個人服務器上那個URL不能正常工做),則沒法提交修改後的配置信息。
  • 加密:對於重要的公衆號,能夠選擇消息加密,這樣一來消息傳遞過程當中即便消息被截獲敵手也破解不了。

9、官網很重要

不管學什麼東西,官方資料都是最權威、最全面的第一手資料。至少要從頭至尾瀏覽一遍,這樣遇到問題以後知道去哪裏去查。 至於別人的博客、框架之類的,都是前人的經驗,頗有可能比官網更突出重點、寫得更詳細,可是時效性差(官網變了前人經驗就沒用了)、權威性差(前人不必定對)。

相關文章
相關標籤/搜索