十三:微信公衆平臺開發模式啓用及接口配置

此篇文章爲轉載

可能圖片與現在的不符。

編輯模式與開發模式

微信公衆帳號申請成功後,要想接收處理用戶的請求,就必須要在“高級功能”裏進行配置,點擊“高級功能”,將看到如下界面:


從上圖中可以看到,高級功能包含兩種模式:編輯模式和開發模式,並且這兩種模式是互斥關係,即兩種模式不能同時開啓。那兩種模式有什麼區別呢?作爲開發人員到底要開啓哪一種呢?

編輯模式:主要針對非編程人員及信息發佈類公衆帳號使用。開啓該模式後,可以方便地通過界面配置“自定義菜單”和“自動回覆的消息”。

開發模式:主要針對具備開發能力的人使用。開啓該模式後,能夠使用微信公衆平臺開放的接口,通過編程方式實現自定義菜單的創建、用戶消息的接收/處理/響應。這種模式更加靈活,建議有開發能力的公司或個人都採用該模式。


啓用開發模式(上)

微信公衆帳號註冊完成後,默認開啓的是編輯模式。那麼該如何開啓開發模式呢?操作步驟如下:

1)點擊進入編輯模式,將右上角的編輯模式開關由“開啓”切換到“關閉”,如下圖所示:



2)點擊高級功能進入到開發模式,將右上角的開發模式開關由“關閉”切換到“開啓”,但在切換時會遇到如下提示:


提示需要我們先成爲開發者,才能開啓開發模式。那就先點擊下圖所示的“成爲開發者”按鈕:


如果提示資料不全,那就先補齊資料再回來繼續操作。需要補全的資料有公衆帳號頭像、描述和運營地區。

資料補全後,再次點擊“成爲開發者”,這時將看到接口配置信息界面,如下圖所示:


這裏需要填寫URL和Token兩個值。URL指的是能夠接收處理微信服務器發送的GET/POST請求的地址,並且是已經存在的,現在就能夠在瀏覽器訪問到的地址,這就要求我們先把公衆帳號後臺處理程序開發好(至少應該完成了對GET請求的處理)並部署在公網服務器上。Token後面會詳細說明。

也就是說要完成接口配置,只需要先完成微信服務器的GET請求處理就可以?是的。 那這是爲什麼呢?因爲這是微信公衆平臺接口中定義的。具體請參考API文檔-消息接口-消息接口指南中的網址接入部分。點此進入

面寫的很清楚,其實你只要能理解上面在說什麼就OK了,至於怎麼編寫相關代碼,我已經幫你完成了,請繼續往下看。


創建公衆帳號後臺接口程序

創建一個Java Web工程,並新建一個能夠處理請求的Servlet,命名任意,我在這裏將其命名爲org.liufeng.course.servlet.CoreServlet,代碼如下:

[java] view plaincopy
  1. package org.liufeng.course.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.liufeng.course.util.SignUtil;  
  12.   
  13. /** 
  14.  * 核心請求處理類 
  15.  *  
  16.  * @author liufeng 
  17.  * @date 2013-05-18 
  18.  */  
  19. public class CoreServlet extends HttpServlet {  
  20.     private static final long serialVersionUID = 4440739483644821986L;  
  21.   
  22.     /** 
  23.      * 確認請求來自微信服務器 
  24.      */  
  25.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         // 微信加密簽名  
  27.         String signature = request.getParameter("signature");  
  28.         // 時間戳  
  29.         String timestamp = request.getParameter("timestamp");  
  30.         // 隨機數  
  31.         String nonce = request.getParameter("nonce");  
  32.         // 隨機字符串  
  33.         String echostr = request.getParameter("echostr");  
  34.   
  35.         PrintWriter out = response.getWriter();  
  36.         // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗  
  37.         if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
  38.             out.print(echostr);  
  39.         }  
  40.         out.close();  
  41.         out = null;  
  42.     }  
  43.   
  44.     /** 
  45.      * 處理微信服務器發來的消息 
  46.      */  
  47.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  48.         // TODO 消息的接收、處理、響應  
  49.     }  
  50.   
  51. }  
可以看到,代碼中只完成了doGet方法,它的作用正是確認請求是否來自於微信服務器;而doPost方法不是我們這次要講的內容,並且完成接口配置也不需要管doPost方法,就先空在那裏。

在doGet方法中調用了org.liufeng.course.util.SignUtil.checkSignature方法,SignUtil.java的實現如下:

[java] view plaincopy
  1. package org.liufeng.course.util;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import java.util.Arrays;  
  6.   
  7. /** 
  8.  * 請求校驗工具類 
  9.  *  
  10.  * @author liufeng 
  11.  * @date 2013-05-18 
  12.  */  
  13. public class SignUtil {  
  14.     // 與接口配置信息中的Token要一致  
  15.     private static String token = "weixinCourse";  
  16.   
  17.     /** 
  18.      * 驗證簽名 
  19.      *  
  20.      * @param signature 
  21.      * @param timestamp 
  22.      * @param nonce 
  23.      * @return 
  24.      */  
  25.     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
  26.         String[] arr = new String[] { token, timestamp, nonce };  
  27.         // 將token、timestamp、nonce三個參數進行字典序排序  
  28.         Arrays.sort(arr);  
  29.         StringBuilder content = new StringBuilder();  
  30.         for (int i = 0; i < arr.length; i++) {  
  31.             content.append(arr[i]);  
  32.         }  
  33.         MessageDigest md = null;  
  34.         String tmpStr = null;  
  35.   
  36.         try {  
  37.             md = MessageDigest.getInstance("SHA-1");  
  38.             // 將三個參數字符串拼接成一個字符串進行sha1加密  
  39.             byte[] digest = md.digest(content.toString().getBytes());  
  40.             tmpStr = byteToStr(digest);  
  41.         } catch (NoSuchAlgorithmException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.   
  45.         content = null;  
  46.         // 將sha1加密後的字符串可與signature對比,標識該請求來源於微信  
  47.         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
  48.     }  
  49.   
  50.     /** 
  51.      * 將字節數組轉換爲十六進制字符串 
  52.      *  
  53.      * @param byteArray 
  54.      * @return 
  55.      */  
  56.     private static String byteToStr(byte[] byteArray) {  
  57.         String strDigest = "";  
  58.         for (int i = 0; i < byteArray.length; i++) {  
  59.             strDigest += byteToHexStr(byteArray[i]);  
  60.         }  
  61.         return strDigest;  
  62.     }  
  63.   
  64.     /** 
  65.      * 將字節轉換爲十六進制字符串 
  66.      *  
  67.      * @param mByte 
  68.      * @return 
  69.      */  
  70.     private static String byteToHexStr(byte mByte) {  
  71.         char[] Digit = { '0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F' };  
  72.         char[] tempArr = new char[2];  
  73.         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
  74.         tempArr[1] = Digit[mByte & 0X0F];  
  75.   
  76.         String s = new String(tempArr);  
  77.         return s;  
  78.     }  
  79. }  
這裏唯一需要注意的就是SignUtil類中的成員變量token,這裏賦予什麼值,在接口配置信息中的Token就要填寫什麼值,兩邊保持一致即可,沒有其他要求,建議用項目名稱、公司名稱縮寫等,我在這裏用的是項目名稱weixinCourse。

最後再來看一下web.xml中,CoreServlet是怎麼配置的,web.xml中的配置代碼如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.     <servlet>  
  7.         <servlet-name>coreServlet</servlet-name>  
  8.         <servlet-class>  
  9.             org.liufeng.course.servlet.CoreServlet  
  10.         </servlet-class>  
  11.     </servlet>  
  12.   
  13.     <!-- url-pattern中配置的/coreServlet用於指定該Servlet的訪問路徑 -->  
  14.     <servlet-mapping>  
  15.         <servlet-name>coreServlet</servlet-name>  
  16.         <url-pattern>/coreServlet</url-pattern>  
  17.     </servlet-mapping>  
  18.   
  19.     <welcome-file-list>  
  20.         <welcome-file>index.jsp</welcome-file>  
  21.     </welcome-file-list>  
  22. </web-app>  
到這裏,所有編碼都完成了,就是這麼簡單。接下來就是將工程發佈到公網服務器上,如果沒有公網服務器環境,可以去了解下BAE、SAE或阿里雲。發佈到服務器上後,我們在瀏覽器裏訪問CoreServlet,如果看到如下界面就表示我們的代碼沒有問題:


啊,代碼都報空指針異常了還說證明沒問題?那當然了,因爲直接在地址欄訪問coreServlet,就相當於提交的是GET請求,而我們什麼參數都沒有傳,在驗證的時候當然會報空指針異常。

接下來,把coreServlet的訪問路徑拷貝下來,再回到微信公衆平臺的接入配置信息界面,將coreServlet的訪問路徑粘貼到URL中,並將SignUtil類中指定的token值weixinCourse填入到Token中,填寫後的結果如下圖所示:

在寫這篇教程的時候是使用的BAE環境,如果想學習微信公衆帳號開發又沒有公網服務器環境的,建議可以試試,註冊使用都很方便,如果有問題我們還可以交流。

接着點擊“提交”,如果程序寫的沒問題,並且URL、Token都填寫正確,可以在頁面最上方看到“提交成功”的提示,並會再次跳轉到開發模式設置界面,而且能夠看到“你已成爲開發者”的提示,如下圖所示:




啓用開發模式(下)

這個時候就已經成爲開發者了,百般周折啊,哈哈,到這裏還沒有完哦,還有最後一步工作就是將開發模式開啓。將右上角的開發模式開關由“關閉”切換到“開啓”,如下圖所示:



到這裏,接口配置、開發模式的開啓就都完成了,本章節的內容也就講到這裏。接下來要章節要講的就是如何接收、處理、響應由微信服務器轉發的用戶發送給公衆帳號的消息,也就是完成CoreServlet中doPost方法的編寫。


如果覺得文章對你有所幫助,請留言支持或關注微信公衆帳號xiaoqrobot支持柳峯哦!


謝謝柳峯老師。轉載地址:http://blog.csdn.net/lyq8479/article/details/8944988

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章