微信公众号开发[缩减版]

使用框架:wx-tools

构建工具:maven

一.项目搭建

maven



<!-- 补全依赖 -->
<!-- HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<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 -->
<!-- http://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
<!-- IO -->
<!-- http://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>


wx.properties

在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{
  //答案是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, IService wxService)
            throws WxErrorException {
        //可以使用wxService的微信API方法
        //可以在Handler和Interceptor传递消息,使用context上下文
        //可以实现自己的业务逻辑

        //这里就不编写验证关注三天以上的用户了
        if(/*用户关注时长大于3天*/){
            return true;
        }
        return false;
    }
}


3. 创建类DemoHandler.java 实现 WxMessageHandler接口
目的:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”

/**
 * Demo 处理微信消息Handler
 * @author antgan
 */
public class DemoHandler implements WxMessageHandler {
    //wxMessage 消息 | context 上下文 | WxService API对象
    public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService 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
当然你也可以使用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;
    // 实例化 统一业务API入口
    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 {
            // 微信服务器推送过来的是XML格式。
            WxXmlMessage wx = XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
            System.out.println("消息:\n " + wx.toString());
            // 添加规则;这里的规则是所有消息都交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoHandler处理
            // 注意!!每一个规则,必须由end()或者next()结束。不然不会生效。
            // end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。
            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();
        }
    }
}

就是这么简单。通过可定制的Matcher,Interceptor,Handler可以实现更加复杂的业务需求。

对于一条来自微信服务器发来的消息,Interceptor和Handler其实定义多个来同时处理。更加灵活好用。更多详情还是得看wx-tools文档。讲得详细。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值