微信公眾號java sdk技術選型
微信公眾號java sdk技術選型
基於上述基本要求,我們從可選的java sdk中挑選以下這些符合上述條件的。
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884
訊息內容:
純文字加密訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884&encrypt_type=aes&msg_signature=8a108f7c79acbe6303c90698bc535f71fc350b0e
訊息內容:
按鈕點選訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884
訊息內容:
30執行緒迴圈100次兩次請求間隔0
50執行緒迴圈100次兩次請求間隔0
100執行緒迴圈100次兩次請求間隔0.
200執行緒迴圈100次兩次請求間隔0.
jmeter執行過程中控制檯報警告,資訊是:2015/04/19 20:43:32 WARN - com.atlantbh.jmeter.plugins.rest.RestSampler: Address already in use: connect
根據上述測試結果對比分析出以下結論:
它的優點有這些:
對於大多數的場景我都推薦使用weixin-java-mp作為基礎開發框架,它相對而言確實是一個更好的選擇。
https://git.oschina.net/ywbrj042/weixin-java-mp-test
https://git.oschina.net/ywbrj042/fastweixin-test
摘要: 微信公眾平臺由於沒有提供針對語言的開發包,只公佈了一個基於Http協議的介面和加解密的演算法sdk,這樣給微信公眾號的開發者帶來很多工作量,除了實現業務邏輯外,還需要自己處理底層的介面協議細節,因此選擇一個良好的sdk能夠節省這樣的工作量,而目前已經有不少的開源sdk可供使用,java語言的微信公眾號sdk也有不少,那麼作為java開發者我們應該如何選擇呢?本文將對java開源的一些微信公眾號的sdk進行各方面的對比分析,為讀者選擇適合自己的sdk包提供一些幫助。
背景介紹
微信公眾平臺由於沒有提供針對語言的開發包,只公佈了一個基於Http協議的介面和加解密的演算法sdk,這樣給微信公眾號的開發者帶來很多工作量,除了實現業務邏輯外,還需要自己處理底層的介面協議細節,因此選擇一個良好的sdk能夠節省這樣的工作量,而目前已經有不少的開源sdk可供使用,java語言的微信公眾號sdk也有不少,那麼作為java開發者我們應該如何選擇呢?本文將對java開源的一些微信公眾號的sdk進行各方面的對比分析,為讀者選擇適合自己的sdk包提供一些幫助。初選篩選
面對技術選型,首先要找到可供選擇的這些sdk,再對它們進行對比分析,首先我們從中國最大最活躍的開源社群oschina上查詢可選的那些sdk。它們必須要滿足這樣一些基本條件。- 開源免費。不解釋。
- 良好的擴充套件性。微信的api也是不斷升級的,sdk必須能夠具有良好的擴充套件性以支援升級。
- 質量可靠。這是基本要求。
- 通用性強。依賴儘可能少,即使有也一定要非常通用才可以。
A | B | C | D |
---|---|---|---|
名稱 | 介紹 | 網址 | 選擇理由 |
fastweixin |
fastweixin —— 快速搭建微信公眾平臺伺服器 簡單封裝了所有與微信伺服器互動的訊息:文字訊息、圖片訊息、圖文訊息等等 1.0版本提供了一個基於springmvc的控制器,整合了微信伺服器繫結、監聽所有型別訊息的方法 使用時繼承,重寫即可,十分方便 |
http://git.oschina.net/pyinjava/fastweixin | oschina活躍度排名第一,已經發布了16個版本。專案活躍度很高。 |
微信公眾平臺是騰訊公司在微信的基礎上新增的功能模組,通過這一平臺,個人和企業都可以打造一個微信的公眾號,並實現和特定群體的文字、圖片、語音的全方位溝通、互動。 微信公共平臺開發模式(JAVA) SDK 實現MessageProcessingHandler介面,配置wechat.properties 在web.xml配置過濾器 |
http://git.oschina.net/gson/wechat | oschina活躍度排名第三。 | |
weixin-java-tools |
本專案特性: 不依賴任何mvc框架 也不依賴servlet,僅僅作為工具使用,可輕鬆嵌入到任何系統裡(可能會有gson,httpclient的版本衝突問題,但是要比依賴spring mvc、struts、或者其他第三方框架好很多) 同時支援企業號和公眾號 支援Session,實現了類似於HttpSession的WxSession。 weixin-java-tools 微信公眾號、企業號Java SDK(支援Session)。 從1.0.3開始,本專案拆分成3個部分: weixin-java-common,公共lib weixin-java-cp,企業號SDK weixin-java-mp,公眾號(訂閱號、服務號)SDK |
https://github.com/chanjarster/weixin-java-tools | oschina活躍度排名第五,已經發布了11個版本。專案活躍度很高。 |
靜態對比分析
根據專案的文件及介紹資訊進行初步對比。A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|
sdk元件名稱 | 功能特性 | 依賴 | 活躍度(資料來源於oschina) | 釋出版本數 | 文件 | 通用性 | 單元測試 | 程式碼結構 | 專案收錄時間 |
fastweixin |
1.微信公眾號 2.處理文字、語音、圖片、視訊、圖文訊息以及關注、取消關注事件 3.實現token過期自動重新整理機制 4.支援微信訊息安全模式 5.js-sdk支援 6.微信資料統計介面API支援 |
1.spring-context 2. spring-context-support 3.spring-web 4.spring-webmvc 5.fastjson 6.httpmime 7.slf4j-api 8.logback-classic |
249收藏,2使用,4回覆 | 16 | 少 | 中 | 少 | 一般 | 2014年09月16日 |
1.現和特定群體的文字、圖片、語音的全方位溝通、互動。 (無更加詳細的描述) |
1.async-http-client 2.xpp3 3.log4j 4.xstream 5.fastjson 6.commons-lang 7.commons-codec |
130收藏,4使用,20回覆 | 無 | 無 | 中 | 無 | 一般 | 2013年08月06日 | |
weixin-java-tools |
1.微信公眾號 2.微信企業號 3.處理文字、語音、圖片、視訊、圖文訊息以及關注、取消關注事件 4.支援微信訊息安全模式 5.js-sdk支援 6.支援使用者、分組和多媒體資源管理 7.支援群發訊息。 8.支援自定義選單管理。 9.支援二維碼、短連線管理。 10.支援傳送模板訊息。 |
1.slf4j-api 2.logback-classic 3.fluent-hc 4.httpmime 5.gson 6.commons-codec 7.commons-io |
179收藏,2使用,4回覆 | 11 | 多 | 高 | 多 | 好 | 2014年08月26日 |
效能對比分析
通過上述靜態對比分析可以看出來wechat這個專案雖然做得時間早,但是功能較少,文件很少,活躍度低,因此這個專案就不作為效能對比分析的物件。接下來基於fastweixin和weixin-java-tools兩個專案開發一個具有相同功能的測試公眾號,對這個公眾號的服務進行效能測試,分析測試資料。fastweixin
使用該技術元件實測過程中,發現了一個問題,暫時還沒有解決,我測試基於該框架接受微信訊息的時候,使用了微信官方的純文字訊息傳送給該框架的Servlet,竟然報空指標的異常,訊息內容如下: <xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
除錯基於fastweixin開發的服務端竟然報如下異常資訊:
java.lang.NullPointerException
at com.github.sd4324530.fastweixin.servlet.WeixinServletSupport.processRequest(WeixinServletSupport.java:146)
at com.github.sd4324530.fastweixin.servlet.WeixinServletSupport.doPost(WeixinServletSupport.java:125)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
因此還未解決該問題,暫時停止對於該元件的測試。說明該元件有一些基本的質量問題。
weixin-java-tools
集中精力只測試該元件的效能表現。測試思路分析
- 本次測試的目的僅僅是測試sdk本身程式碼的效能,因此訊息的傳送和接受的業務程式碼使用最簡單的處理方式;
- 傳送訊息和其它管理微信的功能的效能嚴重依賴於微信公眾平臺服務端,而且介面的呼叫測試有很多約束,因此本文只測試基於sdk開發的接受和處理各種訊息(純文字、圖文、事件等)的效能表現;
- 由於無法控制微信公眾號服務端的呼叫頻次和行為。因此藉助jmeter2.13模擬微信公眾平臺服務端傳送訊息給微信公眾號服務端。
詳細測試案例描述
純文字明文訊息URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884
訊息內容:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[這是測試訊息內容,你能收到嗎?請查詢我的帳號資訊]]></Content>
<MsgId>99999999999999</MsgId>
</xml>
純文字加密訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884&encrypt_type=aes&msg_signature=8a108f7c79acbe6303c90698bc535f71fc350b0e
訊息內容:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<Encrypt><![CDATA[xmuDW87hRd25CNoF+QE5Y3s7DeIpX2vP7yQEgEJU6Ze4yLqj4rvfSgMa/KeKD9fhQvMSSUERCHgMQEUaArh0OSDJ23IfYE1TQ+Cfc3ECYALES2BYA8xruHmTVkCG7GQBma/3Etn7bXntyXANelgUL+xGTTOTU62eGTK9cimaH5u+guKM4mm3j7rt5BrwqMnSR1NjRYY033aYiEm4PLpZjvxHylLVDgLCe0z8p313BXsXPdUDbRnxfAdReqHeA5S415KigVZOTvMg4tElqatnO5O1OGF1FW5T0Ze0X3HQXqmexMHAiU4+Y7QFJmHkfAXJa/M0GOSpu1+IJi++/97/8CFHbnHH1+n99gY+TUP4dh3fo+8x/REwXfV0Bd25a4cq5IX1wd3b4ttDdxX2Y0dQ7hMVmeZ3UNC5K/qnN/CHk1E6YR7qKHPO6HyXB3MPuy+8mJyGV1bjSyeMBWgN93w+nmBwAxjerwiszrUb2rf8gYMPAN++muMs/EBikffybrhM]]></Encrypt>
</xml>
按鈕點選訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj×tamp=1429441884
訊息內容:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[文章]]></EventKey>
</xml>
效能測試結果
10執行緒迴圈100次兩次請求間隔030執行緒迴圈100次兩次請求間隔0
50執行緒迴圈100次兩次請求間隔0
100執行緒迴圈100次兩次請求間隔0.
200執行緒迴圈100次兩次請求間隔0.
jmeter執行過程中控制檯報警告,資訊是:2015/04/19 20:43:32 WARN - com.atlantbh.jmeter.plugins.rest.RestSampler: Address already in use: connect
測試結果對比分析
A | B | C | D |
---|---|---|---|
執行緒數(迴圈100次) | 吞吐量(請求數/秒) | 平均響應時間 | 失敗率 |
10 | 426 | 5 | 0 |
30 | 535 | 6 | 0 |
50 | 531 | 5 | 0 |
100 | 434 | 6 | 0 |
200 | 189 | 8 | 10.88% |
- 該測試在30-50個併發執行緒的時候吞吐量最高,200個執行緒的時候出現了大量的客戶端異常導致失敗,吞吐量開始下降。
- 使用AES對訊息解密和加密的安全措施對於效能的損耗較小。因此接收和傳送訊息使用加密的策略對於效能的損耗較小。
- 總體平均響應時間在6毫秒左右,基於weixin-java-mp元件開發的服務端效能不錯,在併發的情況下未見服務端異常。
分析總結
經過靜態分析對比、使用測試和效能測試綜合分析,我認為在java平臺中開發微信公眾號服務端基於weixin-java-mp開源框架是最值得推薦的開源sdk.它的優點有這些:
- 功能強大;包括公眾號和企業號兩個元件,公眾號幾乎所有的api都支援,若不知的還可以呼叫高階介面。
- 擴充套件性強;weixin-java-mp的程式碼結構設計合理,預留了較多擴充套件點,很容易自行擴充套件。
- 程式碼質量高;看了一些weixin-java-mp的程式碼,感覺該元件的質量非常高,設計精良,而且有大量的單元測試更加對該元件質量信心;
- 效能良好;上述測試結果表明該元件自身程式碼在多執行緒併發測試的場景下並未發現效能和質量問題;
- 通用性強;weixin-java-mp元件的第三方依賴較小,不依賴任何IOC、MVC容器,也不依賴於servlet,只是一個基礎的微信api包裝服務,可以在任何java專案中整合。
- 有非常詳細的文件,見:https://github.com/chanjarster/weixin-java-tools/wiki
- 缺少與Servlet和Spring等同用框架的整合,給開發者增加了更高的學習和使用成本,應該基於weixin-java-mp開發一些快速上手的一些模組,以提高開發者使用效率;
相關資源
上述測試的原始碼及指令碼請參考如下地址:https://git.oschina.net/ywbrj042/weixin-java-mp-test
https://git.oschina.net/ywbrj042/fastweixin-test
© 著作權歸作者所有
相關文章
- 微信sdk 公眾號 微信支付 NFC 坑&筆記筆記
- 微信公眾號選單的配置
- 微信公眾號自動回覆_JavaJava
- 微信公眾號更新新增選單
- 【Java】微信公眾號開發筆記Java筆記
- 微信公眾平臺SDK for node
- TNW-微信公眾號自定義選單TNW
- 微信公眾號開發 2 : weixin-JS-sdk 的使用JS
- 微信公眾號智慧回答
- 微信公眾號開發
- 微信公眾號系統
- 微信公眾號--入門
- 微信公眾號的資料怎麼分析?新媒體技術
- 冰河技術微信公眾號終於可以留言了(文末領福利)!!
- 微信公眾號投票活動製作教程 微信公眾號投票怎麼弄?
- 微信公眾號Java開發記錄(一)接入Java
- 【Awesome-WeChat】技術類乾貨微信公眾號合集(持續更新)
- 微信公眾號-點選選單回覆圖片二維碼
- 微信公眾號開發-分享
- 微信公眾號 檢視地址
- 微信公眾號介面導讀
- .net開發微信公眾號
- 微信公眾號支付全解析
- 【前端】微信公眾號推薦前端
- 微信開發之公眾號
- vue中使用微信公眾號js-sdk踩坑記錄(2)VueJS
- 微信公眾號開發(二)識別訊息型別型別
- 微信公眾號支付開發全過程(Java 版)Java
- Java微信公眾號推送模版訊息的方法示例Java
- uni-app微信公眾號web JS-SDK開發之一接入APPWebJS
- Python 抓取微信公眾號賬號資訊Python
- [微信公眾號] 配置與應用
- 【微信公眾號】配置與應用
- 爬取微信公眾號文章工具
- 微信公眾號-入門的坑
- 微信公眾號下發紅包 -- PHPPHP
- Nodejs微信公眾號開發NodeJS
- 微信公眾號支付踩坑記