<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              频道栏目
              首页 > 微信学院 > 微信公众平台开发 > 正文
              微信公众号开发步骤£¨缩减版£©
              2017-12-05 13:35:31         来源£ºweixin_38628548的博客  
              收藏   我要投稿

              使用框架: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 £¨接口£© 消息处理器

              这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理¡£

              其中£¬以上三个是接口£¬开发者可实现并构建自己的匹配器£¬拦截器£¬处理器¡£

              ?#36865;â£?#36824;有几个类需要注意一下

              WxConsts 类

              封装所有微信公众平台API的常量类型£¬包括接口请求路径£¬事件等¡£WxConfig 类

              基本配置库¡£里面包含了AppId£¬AppSecret等信息¡£wx-tools已经提供了个基于内存管理的配置库¡£暂不支持自行拓展£¬如有需要持久化到数据库£¬需要自己实现¡£注意?#21495;?#32622;库对于整个程序是单例的¡£WxService 类

              微信统一的API Service入口£¬?#22363;Ð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());// 因为是明文£¬所以不用?#29992;?/a>£¬直接返回给用户¡£
                      } catch (Exception e) {
                          e.printStackTrace();
                      } finally {
                          out.close();
                      }
                  }
              }

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

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

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

              关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报?#34892;?/a>

              版权所有: 红黑联盟--致力于做实用的IT技术学习网站

              ¼«ËÙ·ÉͧºÃ¼Ù
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>