頻道欄目
首頁 > 微信學院 > 微信公眾平臺開發 > 正文
微信公眾號開發步驟(縮減版)
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 (接口) 消息處理器

這四大組件構成了對微信服務器發送過來的消息進行拓展性的處理。

其中,以上三個是接口,開發者可實現并構建自己的匹配器,攔截器,處理器。

此外,還有幾個類需要注意一下

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技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

加拿大28火车判定方法