教你3分钟快速开发微信公众号[订阅号][服务号]
2016-06-20 00:48
573 查看
Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。
GitHub仓库
下载wx-tools-1.0.0.jar
API开发文档
大三做过几个基于微信公众平台API的项目,感觉操作太繁琐,有时微信官方开发文档还有错!!
所以!wx-tools诞生了!
看过很多优秀的开源代码,特别是chanjarster的代码,优秀的设计思想让我迷糊灌顶。
不多说,让我带你快速有效可拓展的开发一个订阅号/服务号的后台。
到底有多简单?只需要3步即可~
1. 创建web工程,添加jar包及依赖
2. 初始化WxConfigStorage 配置库和WxService(微信API调用接口)
3. 实现业务逻辑即可
如果有过开发过基于微信公众平台API项目的小伙伴们,应该很容易上手哦!没有也没关系,戳这里看看官方文档入门
maven创建项目指令
注意:此指令创建的web工程版本是2.3的,比较低。可以修改web.xml,变成3.0
创建完毕后,导入wx-tools-1.0.0.jar
注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。如果需要看源代码的务必手动修改编码。
修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8
建立基本的package,如图。
添加wx-tools依赖的jar包。
如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。
maven pom.xml
如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下
当然,如果web项目是由Spring管理。也可以添加相应的Bean去加载初始化。这里就不多说了。
创建类实现ServletContextListener接口
web.xml指定tomcat容器启动时执行该类
初始化配置库和注册服务已经ok了
这里有必要介绍一下wx-tools的四大组件。
WxMessageRouter 消息路由器
WxMessageMatcher(接口) 消息匹配器
WxMessageInterceptor (接口) 消息拦截器
WxMessageHandler (接口) 消息处理器
这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。
其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。
此外,还有几个类需要注意一下
WxConsts 类
封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。
WxConfigStorage 接口
基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库WxInMemoryConfigStorage。开发者可以直接使用该类作为程序的配置库,亦或者自行实现WxConfigStorage接口,构建自己的持久化配置库,注意:配置库对于整个程序是单例的。
WxService 接口
微信API Service,所有接口都从这里调用。实现类为WxServiceImpl。注意:WxServiceImpl对于整个程序是单例的。
WxMessageDuplicateChecker 接口
消息重复检查器。默认的实现类 WxMessageInMemoryDuplicateChecker,如有有需要开发者可自行实现消息检查。
WxErrorException 类
微信异常
WxErrorExceptionHandler 接口
开发者可自行实现该接口,处理微信异常。
理清了关系后,开始创建自定义匹配器Matcher
1. 创建DemoMatcher.java 实现 WxMessageMatcher接口
任务:识别是是否是smart的消息,如果是,接收;否则,不接受。
2. 创建DemoInterceptor.java 实现 WxMessageInterceptor接口
任务:拦截消息,验证用户条件,需要满足关注3天以上。
3. 创建类DemoMessageHandler.java 实现 WxMessageHandler接口
任务:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”
4. 创建servlet,名为DemoServlet.java
任务:接收微信服务器发来的消息,并传入路由器中。
就是这么简单。
完成了这个活动的业务。
最后,这个框架未实现JS-SDK相关接口。如果需要支付等接口,可以wx-tools内置的http相关接口实现。依然很简单。
GitHub持续更新!敬请期待吧!
GitHub仓库
下载wx-tools-1.0.0.jar
API开发文档
大三做过几个基于微信公众平台API的项目,感觉操作太繁琐,有时微信官方开发文档还有错!!
所以!wx-tools诞生了!
看过很多优秀的开源代码,特别是chanjarster的代码,优秀的设计思想让我迷糊灌顶。
不多说,让我带你快速有效可拓展的开发一个订阅号/服务号的后台。
到底有多简单?只需要3步即可~
1. 创建web工程,添加jar包及依赖
2. 初始化WxConfigStorage 配置库和WxService(微信API调用接口)
3. 实现业务逻辑即可
如果有过开发过基于微信公众平台API项目的小伙伴们,应该很容易上手哦!没有也没关系,戳这里看看官方文档入门
开始
一、创建web工程,添加jar包及依赖
我这里使用的是maven构建项目,可以在eclipse创建web项目。maven创建项目指令
mvn archetype:generate -DgroupId=wxtools.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
注意:此指令创建的web工程版本是2.3的,比较低。可以修改web.xml,变成3.0
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>demo</display-name> </web-app>
创建完毕后,导入wx-tools-1.0.0.jar
注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。如果需要看源代码的务必手动修改编码。
修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8
建立基本的package,如图。
添加wx-tools依赖的jar包。
如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。
maven pom.xml
<!-- HttpClient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.6</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.3.6</version> </dependency> <!-- JSON --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!-- XML --> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.7</version> </dependency> <!-- IO --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下
二、初始化WxConfigStorage 配置库和WxService
本Demo采取的初始化策略是实现ServletContextListener接口,当tomcat启动时,会初始化配置。当然,如果web项目是由Spring管理。也可以添加相应的Bean去加载初始化。这里就不多说了。
创建类实现ServletContextListener接口
/** * 初始化配置库和微信API服务 * @author antgan */ public class DemoInitListener implements ServletContextListener { //配置库 private WxConfigStorage config = null; //API Service private WxService wxService = null; public void contextInitialized(ServletContextEvent arg0) { System.out.println("------实例化config和service----------"); //调用默认基于内存的配置库WxInMemoryConfigStorage的getInstance获得实例。注意这里是单例模式 config = WxInMemoryConfigStorage.getInstance(); //设置AppId config.setAppId("wxb1bff1627d37417b"); //设置AppSecret config.setAppSecret("dd037d9b9b4eea00fba14167a9f3c75d"); //设置token config.setToken("antgan"); //设置临时资源文件存放路径 config.setTmpDirFile(new File("e://test")); //设置永久资源文件存放路径 config.setMaterialDirFile(new File("e://test")); //获得WxService实例。注意这里也是调用getInstance()方法获取唯一的业务对象。 wxService = WxServiceImpl.getInstance(); //注入配置库 wxService.setWxConfigStorage(config); } public void contextDestroyed(ServletContextEvent arg0) { //... } }
web.xml指定tomcat容器启动时执行该类
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>demo</display-name> <listener> <display-name>DemoInitListener</display-name> <listener-class>wxtools.demo.init.DemoInitListener</listener-class> </listener> </web-app>
初始化配置库和注册服务已经ok了
三、实现业务逻辑
我们模拟一个业务场景:某公众平台进行一项活动,有奖竞猜一个单词,只有关注本公众号大于3天的用户才能参与。回答正确的用户会接收到平台回复“恭喜你中奖了”。正确答案是:smart这里有必要介绍一下wx-tools的四大组件。
WxMessageRouter 消息路由器
WxMessageMatcher(接口) 消息匹配器
WxMessageInterceptor (接口) 消息拦截器
WxMessageHandler (接口) 消息处理器
这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。
其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。
此外,还有几个类需要注意一下
WxConsts 类
封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。
WxConfigStorage 接口
基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库WxInMemoryConfigStorage。开发者可以直接使用该类作为程序的配置库,亦或者自行实现WxConfigStorage接口,构建自己的持久化配置库,注意:配置库对于整个程序是单例的。
WxService 接口
微信API Service,所有接口都从这里调用。实现类为WxServiceImpl。注意:WxServiceImpl对于整个程序是单例的。
WxMessageDuplicateChecker 接口
消息重复检查器。默认的实现类 WxMessageInMemoryDuplicateChecker,如有有需要开发者可自行实现消息检查。
WxErrorException 类
微信异常
WxErrorExceptionHandler 接口
开发者可自行实现该接口,处理微信异常。
理清了关系后,开始创建自定义匹配器Matcher
1. 创建DemoMatcher.java 实现 WxMessageMatcher接口
任务:识别是是否是smart的消息,如果是,接收;否则,不接受。
/** * Demo 简单的匹配器,可以用于更加复杂的消息验证操作 * @author antgan */ public class DemoMatcher implements WxMessageMatcher{ //答案是smart,如果匹配smart返回true;反之,false。 public boolean match(WxXmlMessage message) { if(message.getContent().equals("smart")){ return true; } return false; } }
2. 创建DemoInterceptor.java 实现 WxMessageInterceptor接口
任务:拦截消息,验证用户条件,需要满足关注3天以上。
/** * Demo 拦截器,可以做身份验证,权限验证等操作。 * @author antgan */ public class DemoInterceptor implements WxMessageInterceptor{ public boolean intercept(WxXmlMessage wxMessage, Map<String, Object> context, WxService wxService) throws WxErrorException { //可以使用wxService的微信API方法 //可以在Handler和Interceptor传递消息,使用context上下文 //可以实现自己的业务逻辑 //这里就不编写验证关注三天以上的用户了 if(/*用户关注时长大于3天*/){ return true; } return false; } }
3. 创建类DemoMessageHandler.java 实现 WxMessageHandler接口
任务:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”
/** * Demo 处理微信消息Handler * @author antgan */ public class DemoMessageHandler implements WxMessageHandler { //wxMessage 消息 | context 上下文 | WxService API对象 public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, WxService wxService) throws WxErrorException { WxXmlOutMessage xmlOutMsg = null; //必须以build()作为结尾,否则不生效。 if(wxMessage.getMsgType().equals(WxConsts.XML_MSG_TEXT)){ xmlOutMsg = WxXmlOutMessage.TEXT().content("恭喜你中奖了").toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build(); } return xmlOutMsg; } }
4. 创建servlet,名为DemoServlet.java
任务:接收微信服务器发来的消息,并传入路由器中。
/** * DemoServlet * 接收微信服务器请求 * @author antgan */ @WebServlet("/wx") public class DemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; private WxConfigStorage config; private WxService service; //获取配置库和Service实例 public DemoServlet() { config = WxInMemoryConfigStorage.getInstance(); service = WxServiceImpl.getInstance(); service.setWxConfigStorage(config); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //验证服务器的有效性 PrintWriter out = response.getWriter(); String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); if(WxServiceImpl.getInstance().checkSignature(signature, timestamp, nonce, echostr)){ out.print(echostr); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //返回消息给微信服务器 PrintWriter out = null; try { out = response.getWriter(); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //微信服务器推送过来的消息是XML格式。使用XStreamTransformer来反序列成WxXmlMessage对象 WxXmlMessage wx=XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream()); System.out.println("消息:\n "+wx.toString()); //实例化一个路由器,理论上路由器在整个程序中只有一个。路由规则可以有多个。 WxMessageRouter router = new WxMessageRouter(WxServiceImpl.getInstance()); //添加规则;这里的规则是指,只接收TEXT类型,同步接收,交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoMessageHandler处理 //注意!!每一个规则,必须由end()或者next()结束。不然不会生效。 //end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。 router.rule().msgType(WxConsts.XML_MSG_TEXT).async(false).matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoMessageHandler()).end(); //把消息传递给路由器进行处理,返回值是WxXmlMessage的子类或者null xmlOutMsg = router.route(wx); if(xmlOutMsg!=null) out.print(xmlOutMsg.toXml());//返回给用户。 } catch (Exception e) { e.printStackTrace(); } finally { out.close(); } }
就是这么简单。
完成了这个活动的业务。
最后,这个框架未实现JS-SDK相关接口。如果需要支付等接口,可以wx-tools内置的http相关接口实现。依然很简单。
GitHub持续更新!敬请期待吧!
相关文章推荐
- WeMall微商城营销技巧之六:重在细节的微信营销小技巧
- 微信营销实战技巧分享
- 微信开发:接入微信入口
- 微信6.0 ActionBar样式
- 学习android笔记(9):微信SDK防混淆代码
- Java微信统一下单接口的调用--XStream为什么要替换下划线 美元符号
- 微信6.0主界面
- 读取assets目录下面的图片
- 微信公告号实现原理简单介绍;
- 微信开发之用户组
- 一元云购CMS微信分享打不开解决办法
- Android之粗仿微信6.0——微信分界面
- Android之粗仿微信6.0——微信主界面
- 高仿微信5.2.1主界面及消息提醒
- php写的微信朋友圈
- Android之粗仿微信6.0——微信6.0的欢迎界面
- C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系
- 微信分享截图
- Android中微信抢红包插件原理解析和开发实现
- WeMall微商城营销技巧之五:微信营销忘掉群发推送重视粉丝是第一位