微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节,因此选择一个良好的sdk能够节省这样的工作量,而目前已经有不少的开源sdk可供使用,java语言的微信公众号sdk也有不少,那么作为Java开发者我们应该如何选择呢?本文将对java开源的一些微信公众号的sdk进行各方面的对比分析,为读者选择适合自己的sdk包提供一些帮助。
面对技术选型,首先要找到可供选择的这些sdk,再对它们进行对比分析,首先我们从中国最大最活跃的开源社区oschina上查找可选的那些sdk。它们必须要满足这样一些基本条件。
开源免费。不解释。
良好的扩展性。微信的API也是不断升级的,sdk必须能够具有良好的扩展性以支持升级。
质量可靠。这是基本要求。
通用性强。依赖尽可能少,即使有也一定要非常通用才可以。
基于上述基本要求,我们从可选的java sdk中挑选以下这些符合上述条件的。
A | B | C | D |
---|---|---|---|
名称 | 介绍 | 网址 | 选择理由 |
fastweixin | fastweixin —— 快速搭建微信公众平台服务器 简单封装了所有与微信服务器交互的消息:文本消息、图片消息、图文消息等等 1.0版本提供了一个基于springmvc的控制器,集成了微信服务器绑定、监听所有类型消息的方法 使用时继承,重写即可,十分方便 | http://git.oschina.net/pyinjava/fastweixin | oschina活跃度排名第一,已经发布了16个版本。项目活跃度很高。 |
wechat | 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。 微信公共平台开发模式(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日 |
wechat | 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两个项目开发一个具有相同功能的测试公众号,对这个公众号的服务进行性能测试,分析测试数据。
使用该技术组件实测过程中,发现了一个问题,暂时还没有解决,我测试基于该框架接受微信消息的时候,使用了微信官方的纯文本消息发送给该框架的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)
因此还未解决该问题,暂时停止对于该组件的测试。说明该组件有一些基本的质量问题。
集中精力只测试该组件的性能表现。
本次测试的目的仅仅是测试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次两次请求间隔0
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
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开发一些快速上手的一些模块,以提高开发者使用效率;
对于大多数的场景我都推荐使用weixin-java-mp作为基础开发框架,它相对而言确实是一个更好的选择。