1. 程式人生 > >weixin4j微信開發-零開發新手接入

weixin4j微信開發-零開發新手接入

其實在weixin4j中,已經為大家提供了一個預設的訊息接入Filter,大家只需要將jar包引入,然後配置一下web.xml和weixin4j.properties,然後部署web專案,也可以實現新手接入。

首先先展示一下預設的Filter原始碼

[java] view plain copy print?
  1. /* 
  2.  * 微信公眾平臺(JAVA) SDK 
  3.  * 
  4.  * Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved. 
  5.  *  
  6.  * http://www.weixin4j.org/sdk/ 
  7.  * 
  8.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  9.  * you may not use this file except in compliance with the License. 
  10.  * You may obtain a copy of the License at 
  11.  * 
  12.  *      http://www.apache.org/licenses/LICENSE-2.0 
  13.  * 
  14.  * Unless required by applicable law or agreed to in writing, software
     
  15.  * distributed under the License is distributed on an "AS IS" BASIS, 
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  17.  * See the License for the specific language governing permissions and 
  18.  * limitations under the License. 
  19.  */
  20. package org.weixin4j;  
  21. import org.weixin4j.message.Articles;  
  22. import org.weixin4j.message.OutputMessage;  
  23. import org.weixin4j.message.TextOutputMessage;  
  24. import org.weixin4j.message.Video;  
  25. import org.weixin4j.message.VideoOutputMessage;  
  26. import org.weixin4j.spi.IMessageHandler;  
  27. import org.weixin4j.spi.InputMessage;  
  28. import org.weixin4j.util.TokenUtil;  
  29. import org.weixin4j.util.XStreamFactory;  
  30. import com.thoughtworks.xstream.XStream;  
  31. import java.io.IOException;  
  32. import java.lang.reflect.Field;  
  33. import java.lang.reflect.Method;  
  34. import java.util.Date;  
  35. import javax.servlet.Filter;  
  36. import javax.servlet.FilterChain;  
  37. import javax.servlet.FilterConfig;  
  38. import javax.servlet.ServletException;  
  39. import javax.servlet.ServletInputStream;  
  40. import javax.servlet.ServletRequest;  
  41. import javax.servlet.ServletResponse;  
  42. import javax.servlet.http.HttpServletRequest;  
  43. import javax.servlet.http.HttpServletResponse;  
  44. /** 
  45.  * <p>Title: 微信公眾平臺接受訊息攔截器</p> 
  46.  * 
  47.  * <p>Description: 攔截Url http://www.weixin4j.org/api/vzhanqun</p> 
  48.  * 
  49.  * @author weixin4j<[email protected]> 
  50.  */
  51. publicclass WeixinUrlFilter implements Filter {  
  52.     private String _token;  
  53.     privatestatic IMessageHandler messageHandler = null;  
  54.     privatestatic String defaultHandler = "org.weixin4j.spi.DefaultMessageHandler";  
  55.     @Override
  56.     publicvoid init(FilterConfig config) throws ServletException {  
  57.         if (Configuration.isDebug()) {  
  58.             System.out.println("WeixinUrlFilter啟動成功!");  
  59.         }  
  60.     }  
  61.     @Override
  62.     publicvoid doFilter(ServletRequest req, ServletResponse res, FilterChain chain)   
  63.             throws IOException, ServletException {  
  64.         HttpServletRequest request = (HttpServletRequest) req;  
  65.         HttpServletResponse response = (HttpServletResponse) res;  
  66.         //微信伺服器將傳送GET請求到填寫的URL上,這裡需要判定是否為GET請求
  67.         boolean isGet = request.getMethod().toLowerCase().equals("get");  
  68.         if (Configuration.isDebug()) {  
  69.             System.out.println("獲得微信請求:" + request.getMethod() + " 方式");  
  70.             System.out.println("微信請求URL:" + request.getServletPath());  
  71.         }  
  72.         if (isGet) {  
  73.             String path = request.getServletPath();  
  74.             //1.驗證訊息真實性
  75.             //http://mp.weixin.qq.com/wiki/index.php?title=驗證訊息真實性
  76.             //URL為http://www.weixin4j.org/api/公眾號
  77.             //Token為weixin4j.properties中配置的Token
  78.             //獲取微信公眾號
  79.             String gongzonghao = path.substring(path.lastIndexOf("/"));  
  80.             //如果獲取不到公眾號,則向伺服器發生錯誤資訊
  81.             if (gongzonghao == null) {  
  82.                 response.getWriter().write("error");  
  83.             } else {  
  84.                 //根據公眾號,算出對應的Token,然後進行驗證
  85.                 gongzonghao = gongzonghao.substring(1);  
  86.                 //算出公眾號的Token
  87.                 _token = TokenUtil.get(gongzonghao);  
  88.                 if (Configuration.isDebug()) {  
  89.                     System.out.println("取出公眾號加密後的Token:" + _token);  
  90.                 }  
  91.                 //token為空,則請求地址錯誤
  92.                 if (!_token.equals("")) {  
  93.                     //成為開發者驗證
  94.                     doGet(request, response);  
  95.                 }  
  96.             }  
  97.         } else {  
  98.             //使用者每次向公眾號傳送訊息、或者產生自定義選單點選事件時,響應URL將得到推送
  99.             doPost(request, response);  
  100.         }  
  101.     }  
  102.     //開發者提交資訊後,微信伺服器將傳送GET請求到填寫的URL上
  103.     privatevoid doGet(HttpServletRequest request, HttpServletResponse response)   
  104.             throws IOException {  
  105.         String signature = request.getParameter("signature");// 微信加密簽名
  106.         String timestamp = request.getParameter("timestamp");// 時間戳
  107.         String nonce = request.getParameter("nonce");// 隨機數
  108.         String echostr = request.getParameter("echostr");//
  109.         //確認此次GET請求來自微信伺服器,原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗
  110.         if (TokenUtil.checkSignature(_token, signature, timestamp, nonce)) {  
  111.             response.getWriter().write(echostr);  
  112.         }  
  113.     }  
  114.     //當普通微信使用者向公眾賬號發訊息時,微信伺服器將POST訊息的XML資料包到開發者填寫的URL上
  115.     //使用者在關注與取消關注公眾號時,微信會把這個事件推送到開發者填寫的URL
  116.     //使用者每次傳送語音給公眾號時,微信會在推送的語音訊息XML資料包中,增加一個Recongnition欄位
  117.     privatevoid doPost(HttpServletRequest request, HttpServletResponse response)   
  118.             throws IOException {  
  119.         InputMessage inputMsg = null;  
  120.         OutputMessage outputMsg = null;  
  121.         try {  
  122.             response.setCharacterEncoding("UTF-8");  
  123.             response.setContentType("text/xml");  
  124.             if (messageHandler == null) {  
  125.                 try {  
  126.                     //獲取
  127.                     defaultHandler = Configuration.getProperty("weixin4j.handler", defaultHandler);  
  128.                     if (Configuration.isDebug()) {  
  129.                         System.out.println("微信接受訊息處理Hanle:" + defaultHandler);  
  130.                     }  
  131.                     // 載入處理器
  132.                     Class<?> clazz = Class.forName(defaultHandler);  
  133.                     try {  
  134.                         messageHandler = (IMessageHandler) clazz.newInstance();  
  135.                     } catch (Exception ex) {  
  136.                         System.out.println("初始化 MessageHandler 異常:");  
  137.                         ex.printStackTrace();  
  138.                     }  
  139.                 } catch (ClassNotFoundException ex) {  
  140.                     System.out.println("找不到: " + defaultHandler + " 類!");  
  141.                     ex.printStackTrace();  
  142.                     throw ex;  
  143.                 }  
  144.             }  
  145.             if (Configuration.isDebug()) {  
  146.                 System.out.println("IMessageHandler建立成功!");  
  147.             }  
  148.             //獲取POST流
  149.             ServletInputStream in = request.getInputStream();  
  150.             if (Configuration.isDebug()) {  
  151.                 System.out.println("獲取POST流成功!");  
  152.             }  
  153.             //將POST流轉換為XStream物件
  154.             XStream xs = XStreamFactory.init(false);  
  155.             if (Configuration.isDebug()) {  
  156.                 System.out.println("將POST流轉換為XStream物件成功!");  
  157.             }  
  158.             //將指定節點下的xml節點資料轉換為物件
  159.             xs.alias("xml", InputMessage.class);  
  160.             if (Configuration.isDebug()) {  
  161.                 System.out.println("將指定節點下的xml節點資料轉換為物件成功!");  
  162.             }  
  163.             //將流轉換為字串
  164.             String xmlMsg = XStreamFactory.inputStream2String(in);  
  165.             if (Configuration.isDebug()) {  
  166.                 System.out.println("獲取POST的訊息:[" + xmlMsg + "]");  
  167.             }  
  168.             //將xml內容轉換為InputMessage物件
  169.             inputMsg = (InputMessage) xs.fromXML(xmlMsg);  
  170.             // 取得訊息型別
  171.             String MsgType = inputMsg.getMsgType();  
  172.             if (Configuration.isDebug()) {  
  173.                 System.out.println("POST的訊息型別:[" + MsgType + "]");  
  174.             }  
  175.             //獲取訊息處理方法
  176.             Method mt = messageHandler.getClass().getMethod(MsgType + "TypeMsg", InputMessage.class);  
  177.             //呼叫處理方法,返回輸出流物件
  178.             outputMsg = (OutputMessage) mt.invoke(messageHandler, inputMsg);  
  179.             //如果輸出流為null,則說明內部異常
  180.             if (outputMsg == null) {  
  181.                 //告知使用者錯誤資訊
  182.                 outputMsg = new TextOutputMessage();  
  183.                 ((TextOutputMessage) outputMsg).setContent("系統錯誤,請聯絡管理員!");  
  184.             }  
  185.         } catch (Exception ex) {  
  186.             ex.printStackTrace();  
  187.             outputMsg = new TextOutputMessage();  
  188.             ((TextOutputMessage) outputMsg).setContent("系統錯誤!");  
  189.         }  
  190.         try {  
  191.             setOutputMsgInfo(outputMsg, inputMsg);  
  192.         } catch (Exception e1) {  
  193.             e1.printStackTrace();  
  194.         }  
  195.         // 把傳送傳送物件轉換為xml輸出
  196.         XStream xs = XStreamFactory.init(true);  
  197.         xs.alias("xml", outputMsg.getClass());  
  198.         xs.alias("item", Articles.class);  
  199.         String xml = xs.toXML(outputMsg);  
  200.         if (Configuration.isDebug()) {  
  201.             System.out.println("POST輸出訊息:[" + xml + "]");  
  202.         }  
  203.         response.getWriter().write(xml);  
  204.     }  
  205.     //設定詳細資訊
  206.     privatestaticvoid setOutputMsgInfo(OutputMessage oms, InputMessage msg)   
  207.             throws Exception {  
  208.         // 設定傳送資訊
  209.         Class<?> outMsg = oms.getClass().getSuperclass();  
  210.         Field CreateTime = outMsg.getDeclaredField("CreateTime");  
  211.         Field ToUserName = outMsg.getDeclaredField("ToUserName");  
  212.         Field FromUserName = outMsg.getDeclaredField("FromUserName");  
  213.         ToUserName.setAccessible(true);  
  214.         CreateTime.setAccessible(true);  
  215.         FromUserName.setAccessible(true);  
  216.         CreateTime.set(oms, new Date().getTime());  
  217.         ToUserName.set(oms, msg.getFromUserName());  
  218.         FromUserName.set(oms, msg.getToUserName());  
  219.     }  
  220.     @Override
  221.     publicvoid destroy() {  
  222.     }  
  223. }  

原始碼大家可以看,也可以不看。

下面教大家,直接在web.xml中,加一個Filter即可。

[html] view plain copy print?
  1. <!-- 預設Filter方式 微信接入配置 -->
  2. <servlet>
  3.     <servlet-name>wechatFilter</servlet-name>
  4.     <servlet-class>org.weixin4j.WeixinUrlFilter</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7.     <servlet-name>wechatFilter</servlet-name>
  8.     <url-pattern>/api/*</url-pattern>
  9. </servlet-mapping>

最後,將專案打包,釋出到伺服器,就可以在微信公眾號平臺中,進行開發者接入認證了。

祝你部署成功,生活愉快!

明天會有更精彩的內容,別走開,馬上回來!

您可以加入我們的官方QQ群:365736353,專業人為您解答各種技術問題。

轉載至:http://www.weixin4j.org/article/weixin4j-servlet.html
更多文章,請關注:http://www.weixin4j.org/

其他文章推薦

相關推薦

weixin4j開發-開發新手接入

其實在weixin4j中,已經為大家提供了一個預設的訊息接入Filter,大家只需要將jar包引入,然後配置一下web.xml和weixin4j.properties,然後部署web專案,也可以實現新手接入。 首先先展示一下預設的Filter原始碼 [java]

新手入門寶典:從開始做小程式開發

微信小程式聯盟出品.jpg 開發前必讀簡要 基於大量無效開發,無法上線的案例,所以開發前部分知識十分重要;| 連結 微信小程式個人註冊簡單步驟 開啟mp.weixin.qq.com,點選右上角立即註冊,進入小程式註冊| 連結 微信開發者工具【專案】詳解 為什麼我的小程式通過稽核,但是搜

公眾平臺開發 - 接入及配置常見問題

配置 nes 寫法 同時 重要 open 無法 ani 多個參數 1.redirect_uri 參數錯誤 微信安全登陸“抱歉,出錯了” 微信公眾平臺換了服務器,域名也換了,所以要改一下配置,基礎配置都改完之後,調用自定義菜單接口,微信服務器始終登錄不上,就是因為這裏的網頁授

開始搭建硬件開發環境全過程——1小時掌握硬件開發流程

sdn 流程 第三方服務 ota 必須 air 開發板 port pen 筆者決定在嵌入式企鵝圈2016年的首篇文章中,發表微信硬件物聯領域極具實踐價值的文章,它將

2018年最新小程序開發 基礎

頁面布局 col In cnblogs 開發 www IT 什麽是 http 第一季 1節 什麽是微信小程序2節 計算器實戰頁面布局3節 計算器實戰業務實現4節 實戰開發之天氣APP5節 天氣App頁面布局 第二季2018年最新微信小程序開發 零基礎

公眾號開發紀要(2)-公眾號接入

來源 mes Once tle RoCE ech 技術 odin exceptio 當搭建好微信公眾號開發環境後,先要和微信公眾號建立聯系。從本質上來說,微信公眾號開發就是如何讓自己的服務器與微信服務器進行交互的一個過程。 微信服務

小遊戲開發新手常見問題整理

cal 歷史 alt 整理 引擎 錯誤 出錯 sta 第三方 微信小遊戲一經推出就受到了許多開發者的關註,目前已有2000多款作品上線。我們也在第一時間推出了微信小遊戲適配解決方案,並持續優化改進,同時整理發布了多篇關於使用白鷺引擎開發微信小遊戲的FAQ文章(詳情可查看白鷺

基礎入門小程式開發

注:本文來源於:《零基礎入門微信小程式開發》 課程介紹 本達人課是一個系列入門教程,目標是從 0 開始帶領讀者上手實戰,課程以微信小程式的核心概念作為主線,介紹配置檔案、頁面樣式檔案、JavaScript 的基本知識並以指南針為例對基本知識進行擴充套件,另外加上開發工具的安裝、小程式釋出等內容,共 9

《從開始學小程式開發》.pdf

書籍簡介: 《從零開始學微信小程式開發》共分3篇12章,第1篇介紹微信小程式的基礎知識,包括微信小程式開發工具、微信小程式架構分析;第2篇介紹微信小程式的常用模組,通過一些小案例詳細介紹了微信小程式提供的各種元件的使用、API函式的使用,訪問手機硬體的函式;第3篇是綜合案例,以微天氣、微音

開始學小程式開發---2、小程式專案的建立、相關檔案的作用及小程式IDE

一、建立一個小程式專案 1、下載安裝微信web開發者工具,目前最新版本是1.02.1811141。 2、開啟,掃碼登入, 3、選擇小程式專案 4、點選專案管理旁邊的+ 5、如果你有小程式賬號會有一個APPID,詳情見小程式簡易教程申請賬號那一節,如果還沒有,可以

開始學小程式開發---1、初識小程式

最近在學小程式,記錄並分享一下學習過程,如有謬誤,還請指出! 什麼是小程式? 微信小程式(Mini Program),又稱應用號,它執行在微信客戶端,原始碼打包後不超過1MB(是的,你沒看錯,我也沒寫錯),按照張小龍對小程式的定義,它是一種不需要下載安裝即可使用的應用(其實要經過下載安裝包-

開始學前端第十七講--小程式開發入門

修真院Web工程師零基礎全能課   本節課內容 微信小程式開發入門   主講人介紹 沁修,葡萄藤技術總監 專案經驗豐富,擅長H5移動專案開發。 專注技術選型、底層開發、最佳程式碼實踐規範總結與推廣。     直播

開始學小程式開發---3、小程式靜態啟動頁面的製作

現在正式開始編碼啦!~ 我的IDE版本: 首先,新建一個小程式專案,然後建立所需要的檔案以及目錄: 然後在index.wxml中編寫小程式的頁面骨架: <!-- index.wxml是編寫小程式骨架的檔案,相當於HTML --> <!-- <view&g

開始學小程式開發---4、新聞列表頁面的製作(列表渲染)

今天,我們要構建一個如下圖所示的新聞列表頁面(手機截不了長圖,大家將就看吧QAQ): 首先,在pages同級目錄建立一個news目錄,用於放有關新聞列表頁面的各種檔案,然後建立news.wxml,news.wxss,news.js,news.json四個檔案: 然後在app

開始學小程式開發---5、小程式頁面跳轉

我們接下來要實現的是:點選“按鈕”,跳轉到另一個頁面 如下圖,當我們點選“開啟小程式之旅”的時候,就會跳轉到news頁面                 首先我們將啟動頁放回pages配置項的第一項

【Node.js+Express公眾號開發】第一步:服務搭建及接入

一、前言 此前微信開發,都比較依賴後端。然而有時候後端小夥伴特別忙,最近又學習了一下node的基礎知識,索性就想著自己用node整一遍。 本教程環境為linux系統centOs7系統 二、準備工作 1. 伺服器 伺服器我使用的是搬瓦工的,目前19.9美元那款,網上有

小程式開發教程--從開始

從零開始小程式 今天一不小心拿到了小程式的內測資格,為了不辜負微信團隊的信任,我決定十一奮鬥一把!不過話說我可是一個Android工程師啊!所以就讓我們從零開始! 所以本文非常適合非前端工程師學習!哈哈!都說小程式出來前端會搶移動端飯碗,但是據我所知現在好多學習的都是移動開

公眾平臺開發2-接入指南(驗證伺服器地址有效性)

接入指南 一、填寫伺服器配置  在測試號管理中填寫介面配置資訊  伺服器地址URL,URL是開發者用來接收微信訊息和事件的介面URL;  Token可以任意填寫;  這是測試時填寫的,真實專案的填寫還要填寫EncodingAESKey,可以由開發者手動填寫或隨機生成,將

開始學小程式開發(一)

從我學習開發小程式到現在,已經有好幾款上線了。雖然都是一些益智類的小程式,不難,但是也從裡面學到了一些知識。 1.準備工作 首先需要去官網註冊一個小程式的帳號。註冊好賬號以後,就可以設定補充小程式的資訊

ThinkPHP5.0公眾號開發公眾號接入

ThinkPHP5.0 微信公眾號接入 第一步:準備工作 首先,要有自己的公眾號(這句是廢話),個人可以申請微信公眾號的訂閱號,企業才可以申請服務號,其次要有云空間或者伺服器,並且將伺服器IP新增至微信公眾號開發配置中的IP白名單,這只是基礎的準備工作 第二步: