微信公眾號開發總結


官網是最好的文檔來源。

一、明確結構

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

  • 微信服務器
  • 我的服務器
  • 用戶

這三個實體之間的關系如下所示:微信服務器相當於一個代理、一個中轉站。

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

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

二、賬號類型與權限

微信公眾號分為訂閱號、服務號、企業號三種。申請服務號和企業號需要相關資質證明,訂閱號個人就可以申請。
目前,很多個人訂閱號都是人工操作的,它們並沒有綁定服務器,沒有自動回復功能。但是可以手動回復圖片、文本等消息。
對於個人訂閱號來說,綁定服務器后,我的服務器和微信服務器之間的交互非常有限,比如不能發送客服消息、不能發送圖片。這一點,我認為微信太封閉了。

功能最豐富的是測試號,測試號包含微信公眾號的一切功能。

三、消息類型

我的服務器和微信服務器之間的消息分為兩種:被動回復消息和客服消息。
對於被動回復消息的處理,需要編寫Web接口來處理請求。如果使用Java語言,可以編一個Servlet或者使用SpringMVC框架;如果使用Python語言,可以用Flask或者Django。對於這部分內容,可以參考這篇博客:Flask接通微信公眾號

對於客服消息,需要編寫代碼向微信服務器發送HTTP請求。客服消息是我的服務器主動向微信服務器發送的。如果使用Java語言,可以使用HttpClient庫;如果使用Python語言,當然要使用requests庫。

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

  • get方式
    僅僅用來完成綁定“我的服務器”時的握手操作
  • post方式
    用來發送用戶消息。實際上,我們所要做的就是解析post來的數據,然后按照官網規定的格式回復之。

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

四、關於accessToken

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

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

有了這兩樣東西,我們就可以通過發送HTTP請求來獲取accessToken了。

注意,accessToken是臨時生成的,只在一段時間內有效(3天時間),過期之后就需要重新像微信服務器請求新的accessToken。
這個過程最佳實踐是這樣的:當向微信服務器發送HTTP請求失敗的時候,檢查錯誤碼,看看是不是因為accessToken,如果是,那么更新accessToken。一言以蔽之,accessToken只在必要的時候才更新,這是一種懶惰加載的機制。對於微信服務器返回的錯誤碼,官方文檔介紹非常詳細。
要注意,不可以每次發送HTTP請求前都獲得新的accessToken,這對於微信服務器和我的服務器來說都是一種浪費,正因為如此,微信服務器限制每天允許獲取的accessToken個數不超過2000個。

五、關於Session

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

六、重要的開發實踐:使用日志

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

七、使用微信框架

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

Python微信框架有:

當然,使用框架也有一定的壞處:如果不了解框架細節,出了問題不好定位。如果學習框架用法比學習直接實現微信接口更難,不如直接自己實現。
即便是不使用框架,自己實現,代碼量也不會超過200行,在只使用微信公眾號部分功能的的情況下尤為如此。自己實現的過程其實就是實現協議的過程,這個過程只需要參考着文檔來實現,並沒有什么技術難度。

八、綁定我的服務器

登錄微信服務器之后,在左側導航欄找到“開發/基本配置”,綁定我的服務器的所有操作都在此頁完成。

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

然后在“修改配置”中,綁定URL,填寫token,根據自己情況看看是否需要加密

關於“修改配置”強調三點:

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

九、官網很重要

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


免責聲明!

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



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