• 媒体宣传报道重庆日报 王国平:扮靓重庆两江四岸” 让城市有机更新 2019-04-26
  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06
  • 频道栏目
    神奇公式秒杀全国11选5 > 微信学院 > 微信公众平台开发 > 正文
    微信公众号开发步骤(缩减版)
    2017-12-05 13:35:31         来源:weixin_38628548的博客  
    收藏   我要投稿

    神奇公式秒杀全国11选5 www.2zfa.com 使用框架:wx-tools

    构建工具:maven

    一.项目搭建

    maven

    org.apache.httpcomponents

    httpclient

    4.3.6

    org.apache.httpcomponents

    httpmime

    4.3.6

    org.codehaus.jackson

    jackson-mapper-asl

    1.9.13

    com.thoughtworks.xstream

    xstream

    1.4.7

    commons-io

    commons-io

    2.4

    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 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 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 class="brush:java;"> * 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文档。讲得详细。

    点击复制链接 与好友分享!回本站首页
    上一篇:微信小程序video组件播放不了问题如何解决?
    下一篇:微信公众平台使用JSSDK网页调起扫码并获取扫码数据(PHP实现)
    相关文章
    图文推荐
    点击排行

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 媒体宣传报道重庆日报 王国平:扮靓重庆两江四岸” 让城市有机更新 2019-04-26
  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06