1. 程式人生 > >微信公眾號開發,原來這麼簡單?[java框架]

微信公眾號開發,原來這麼簡單?[java框架]

下面都是舊的教程,建議參考上面最新的教程~~

可能你不知道,有個框架叫wx-tools(小心翼翼地說)

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工程哦~

  • 注意,匯入後記得修改jar包的編碼。window下預設讀GBK,而框架本身是UTF-8。
    如果需要看原始碼的務必手動修改編碼。
    修改方式:在eclipse的工程下,對著jar包右鍵 –> Properties –> Encoding –> UTF-8

建立基本的package,如圖。
結構圖

新增wx-tools依賴的jar包。

如果使用maven構建專案,可以直接新增如下座標下載依賴jar。

<!-- 補全依賴 -->
    <!-- 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>

如果不是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{
  //答案是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文件。講得詳細。

最後效果圖。
這裡寫圖片描述

博主有話說

大學的尾巴悄悄來臨,我也順利找到了實習和工作。閒暇期間,想起wx-tools的問題還沒解決。
(舍友寫專案用了我的wx-tools出現了執行緒爆炸,難以使用,文件不全等現象。但忙於找工作就放著wx-tools不管了)
終於有時間了,靜下心來。看看別人優秀的原始碼。心想著我的wx-tools就應該是簡單易用,輕量級可拓展。於是,wx-tools-2.1.0.jar又誕生了。

相比之前的wx-tools。這個版本比較大的變化如下:

  • 更簡化的配置(wx.properties檔案來配置)。
  • 更加簡單簡約的使用方法(鏈式程式設計!酷炫!)
  • 去掉了執行緒池。(就是這玩意導致舍友專案爆炸了)
  • 去掉了雞肋的重複訊息檢查器(Checker)。(當初為什麼要加檢查重複訊息呢?黑人問號???)
  • jssdk的支援。(不支援微信小店)

哎!其實對比了幾個微信公眾平臺開發框架,wx-tools走的路線完全不同。不知道大家喜不喜歡呢~ 喜歡希望你給我star咯~wx-tools Github戳這裡!!給星星!愛你麼麼噠!

我也創了個QQ群(570937047),歡迎大家加入,討論JAVA開發或者對酒當歌。

最後!歡迎大家提BUG或者pull request!小弟能力不足!就這樣了!

博主建議使用最新版的jar。同時更新了開發文件–介面用法
- 新增群發介面及模板訊息介面。
- 支付介面測試階段。不建議使用。
-
更新與2017/4/14

啊啊啊官方把使用者組變成了用便籤管理了,wx-tools近期會更新。跟上組織的步伐。

– 更新與2017/6/20