Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。
博主最近终于有空!!已经更新到2.1.3啦!!
GitHub仓库
下载wx-tools-2.1.3.jar
wx-tools开发文档及demo
最近更新了开发文档,新增wx-tools接口代码写法。2017/4/14
据说看到文档最后的都是真爱粉!
不多说!讲讲使用wx-tools开发轻量级公众号到底有多简单?
简单到哭
就三步!
1. 创建web工程,添加jar包及依赖
2. 配置wx.properties
3. 调用WxService来实现业务逻辑即可
【WxService是实现了微信公众平台API入口所以调用非常简单】
如果有过开发过基于微信公众平台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>
也可以直接用eclipse创建maven工程哦~
创建完毕后,导入wx-tools-2.1.3.jar
- 注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。
如果需要看源代码的务必手动修改编码。
修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8
建立基本的package,如图。
![结构图](https://i-blog.csdnimg.cn/blog_migrate/5ebcd3e93a578734b2350be179c9f577.jpeg)
添加wx-tools依赖的jar包。
如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。
<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>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下
如果与项目中的jar包冲突或重复,只留一个就可以了~
二、 配置wx.properties
wx.properties是存放微信公众平台相关配置的。如AppId等。
搭好项目基本框架后,在src/main/resources或者src/main/Java下新建wx.properties,如上图
#配置如下,不要填错了哦!注意大小写。
wx.appId=wxb1bff1627d37417bcc
wx.appSecret=dd037d9b9b4eea00fba14167a9f3c75abc
wx.token=antgan
wx.aesKey=f82PVzQsKG5d8en3DwnZ8VVEoGInkmsWz3X3HsreEqe
wx.mchId=
wx.apiKey=
三、调用WxService来实现业务逻辑
这里有必要介绍一下wx-tools的四大组件。
- WxMessageRouter 消息路由器
- WxMessageMatcher(接口) 消息匹配器
- WxMessageInterceptor (接口) 消息拦截器
- WxMessageHandler (接口) 消息处理器
这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。
其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。
更多的详情可以查看开发文档,对组件解释比较清楚。
此外,还有几个类需要注意一下
- WxConsts 类
封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。 - WxConfig 类
基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库。暂不支持自行拓展,如有需要持久化到数据库,需要自己实现。注意:配置库对于整个程序是单例的。 - WxService 类
微信统一的API Service入口,继承IService接口,所有接口都从这里调用。 - WxErrorException 类
微信异常 - WxErrorExceptionHandler 接口
开发者可自行实现该接口,处理微信异常
理清了关系后,开始创建自定义匹配器Matcher
1. 创建DemoMatcher.java 实现 WxMessageMatcher接口
目的:拦截消息,如果是答案(答案是smart),就允许通行。否则匹配失败。不允许通过。
/**
* Demo 简单的匹配器,可以用于更加复杂的消息验证操作
* @author antgan
*/
public class DemoMatcher implements WxMessageMatcher{
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, IService wxService)
throws WxErrorException {
if(){
return true;
}
return false;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3. 创建类DemoHandler.java 实现 WxMessageHandler接口
目的:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”
/**
* Demo 处理微信消息Handler
* @author antgan
*/
public class DemoHandler implements WxMessageHandler {
public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService wxService) throws WxErrorException {
WxXmlOutMessage xmlOutMsg = null;
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
当然你也可以使用SpringMVC,是一样的。对应的是Controller【建议使用SpringMVC】
目的:接收微信服务器发来的消息,并传入指定路由器中。
/**
* <pre>
* Demo Servlet
* 如果使用的是SpringMVC,也是类似这样的写法~
*
* 注意:WxConfig请调用getInstance()
* 因为对于全局是唯一的。采用单例模式。
* </pre>
*
* @author antgan
* @date 2016/12/15
*
*/
@WebServlet("/wx")
public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private IService iService = new WxService();
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 (iService.checkSignature(signature, timestamp, nonce, echostr)) {
out.print(echostr);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
WxMessageRouter router = new WxMessageRouter(iService);
try {
WxXmlMessage wx = XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
System.out.println("消息:\n " + wx.toString());
router.rule().matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoHandler())
.end();
WxXmlOutMessage xmlOutMsg = router.route(wx);
if (xmlOutMsg != null)
out.print(xmlOutMsg.toXml());
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
就是这么简单。通过可定制的Matcher,Interceptor,Handler可以实现更加复杂的业务需求。
对于一条来自微信服务器发来的消息,Interceptor和Handler其实定义多个来同时处理。更加灵活好用。更多详情还是得看wx-tools文档。讲得详细。
最后效果图。
![这里写图片描述](https://img-blog.csdn.net/20161215220916034?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW50Z2Fu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)