教你3分鐘快速開發微信公眾號[訂閱號][服務號]
Wx-tools是基於微信公眾平臺API的輕量級框架。 基於Wx-tools你可以開速開發一個訂閱號/服務號的web應用後臺。
博主最近終於有空!!已經更新到2.0.0啦!!
GitHub倉庫
下載wx-tools-2.0.0.jar
wx-tools開發文件
大三做過幾個基於微信公眾平臺API的專案,感覺操作太繁瑣,有時微信官方開發文件還有錯!!
所以!wx-tools誕生了!
看過很多優秀的開原始碼,特別是chanjarster的程式碼,優秀的設計思想讓我醍醐灌頂。
不多說,讓我帶你快速有效可拓展的開發一個訂閱號/服務號的後臺。
到底有多簡單?只需要3步即可~
1. 建立web工程,新增jar包及依賴
2. 配置wx.properties
3. 呼叫WxService來實現業務邏輯即可
如果有過開發過基於微信公眾平臺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
<?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>
建立完畢後,匯入wx-tools-1.0.1.jar
- 注意,匯入後記得修改jar包的編碼。window下預設讀GBK,而框架本身是UTF-8。如果需要看原始碼的務必手動修改編碼。
- 修改方式:在eclipse的工程下,對著jar包右鍵 –> Properties –> Encoding –> UTF-8
建立基本的package,如圖。
新增wx-tools依賴的jar包。
- 如果使用maven構建專案,可以直接新增如下座標下載依賴jar。
maven pom.xml
<!-- 補全依賴 -->
<!-- 1:日誌; java日誌:slf4j,log4j,logback,common-logging
slf4j介面/規範
log4j,logback,common-logging,實現
此處使用slf4j+logback -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<!-- 實現slf4j日誌 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 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
搭好專案基本框架後,在src/main/resources或者src/main/java下新建wx.properties,如上圖
#配置如下
wx.appId=wxb1bff1627d37417b
wx.appSecret=dd037d9b9b4eea00fba14167a9f3c75d
wx.token=antgan
wx.aesKey=f82PVzQsKG5d8en3DwnZ8VVEoGInkmsWz3X3HsreEqe
wx.mchId=
不要填錯了哦!注意大小寫。
三、實現業務邏輯
- 我們模擬一個業務場景:某公眾平臺進行一項活動,有獎競猜一個單詞,只有關注本公眾號大於3天的使用者才能參與。回答正確的使用者會接收到平臺回覆“恭喜你中獎了”。正確答案是:smart
這裡有必要介紹一下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, IServicewxService) 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
任務:接收微信伺服器發來的訊息,並傳入路由器中。
/**
* <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();
}
}
}
就是這麼簡單。
完成了這個活動的業務。
這裡例項講得很粗糙,可以看wx-tools的開發文件。有詳細的例項和使用講解。