[027] 微信公众帐号开发教程第3篇-开发模式启用及接口配置
編輯模式與開發模式
微信公眾帳號申請成功后,要想接收處理用戶的請求,就必須要在“高級功能”里進行配置,點擊“高級功能”,將看到如下界面:
從上圖中可以看到,高級功能包含兩種模式:編輯模式和開發模式,并且這兩種模式是互斥關系,即兩種模式不能同時開啟。那兩種模式有什么區別呢?作為開發人員到底要開啟哪一種呢?
編輯模式:主要針對非編程人員及信息發布類公眾帳號使用。開啟該模式后,可以方便地通過界面配置“自定義菜單”和“自動回復的消息”。
開發模式:主要針對具備開發能力的人使用。開啟該模式后,能夠使用微信公眾平臺開放的接口,通過編程方式實現自定義菜單的創建、用戶消息的接收/處理/響應。這種模式更加靈活,建議有開發能力的公司或個人都采用該模式。
啟用開發模式(上)
微信公眾帳號注冊完成后,默認開啟的是編輯模式。那么該如何開啟開發模式呢?操作步驟如下:
1)點擊進入編輯模式,將右上角的編輯模式開關由“開啟”切換到“關閉”,如下圖所示:
2)點擊高級功能進入到開發模式,將右上角的開發模式開關由“關閉”切換到“開啟”,但在切換時會遇到如下提示:
提示需要我們先成為開發者,才能開啟開發模式。那就先點擊下圖所示的“成為開發者”按鈕:
如果提示資料不全,那就先補齊資料再回來繼續操作。需要補全的資料有公眾帳號頭像、描述和運營地區。
待資料補全后,再次點擊“成為開發者”,這時將看到接口配置信息界面,如下圖所示:
這里需要填寫URL和Token兩個值。URL指的是能夠接收處理微信服務器發送的GET/POST請求的地址,并且是已經存在的,現在就能夠在瀏覽器訪問到的地址,這就要求我們先把公眾帳號后臺處理程序開發好(至少應該完成了對GET請求的處理)并部署在公網服務器上。Token后面會詳細說明。
也就是說要完成接口配置,只需要先完成微信服務器的GET請求處理就可以?是的。 那這是為什么呢?因為這是微信公眾平臺接口中定義的。具體請參考API文檔-消息接口-消息接口指南中的網址接入部分。點此進入。
上面寫的很清楚,其實你只要能理解上面在說什么就OK了,至于怎么編寫相關代碼,我已經幫你完成了,請繼續往下看。
創建公眾帳號后臺接口程序
創建一個Java Web工程,并新建一個能夠處理請求的Servlet,命名任意,我在這里將其命名為org.liufeng.course.servlet.CoreServlet,代碼如下:
package org.liufeng.course.servlet;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.liufeng.course.util.SignUtil;/*** 核心請求處理類* * @author liufeng* @date 2013-05-18*/ public class CoreServlet extends HttpServlet {private static final long serialVersionUID = 4440739483644821986L;/*** 確認請求來自微信服務器*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 微信加密簽名String signature = request.getParameter("signature");// 時間戳String timestamp = request.getParameter("timestamp");// 隨機數String nonce = request.getParameter("nonce");// 隨機字符串String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();// 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}/*** 處理微信服務器發來的消息*/public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO 消息的接收、處理、響應}} 可以看到,代碼中只完成了doGet方法,它的作用正是確認請求是否來自于微信服務器;而doPost方法不是我們這次要講的內容,并且完成接口配置也不需要管doPost方法,就先空在那里。在doGet方法中調用了org.liufeng.course.util.SignUtil.checkSignature方法,SignUtil.java的實現如下:
package org.liufeng.course.util;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays;/*** 請求校驗工具類* * @author liufeng* @date 2013-05-18*/ public class SignUtil {// 與接口配置信息中的Token要一致private static String token = "weixinCourse";/*** 驗證簽名* * @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[] { token, timestamp, nonce };// 將token、timestamp、nonce三個參數進行字典序排序Arrays.sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 將三個參數字符串拼接成一個字符串進行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 將sha1加密后的字符串可與signature對比,標識該請求來源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 將字節數組轉換為十六進制字符串* * @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 將字節轉換為十六進制字符串* * @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;} } 這里唯一需要注意的就是SignUtil類中的成員變量token,這里賦予什么值,在接口配置信息中的Token就要填寫什么值,兩邊保持一致即可,沒有其他要求,建議用項目名稱、公司名稱縮寫等,我在這里用的是項目名稱weixinCourse。最后再來看一下web.xml中,CoreServlet是怎么配置的,web.xml中的配置代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>coreServlet</servlet-name><servlet-class>org.liufeng.course.servlet.CoreServlet</servlet-class></servlet><!-- url-pattern中配置的/coreServlet用于指定該Servlet的訪問路徑 --><servlet-mapping><servlet-name>coreServlet</servlet-name><url-pattern>/coreServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app> 到這里,所有編碼都完成了,就是這么簡單。接下來就是將工程發布到公網服務器上,如果沒有公網服務器環境,可以去了解下BAE、SAE或阿里云。發布到服務器上后,我們在瀏覽器里訪問CoreServlet,如果看到如下界面就表示我們的代碼沒有問題:
啊,代碼都報空指針異常了還說證明沒問題?那當然了,因為直接在地址欄訪問coreServlet,就相當于提交的是GET請求,而我們什么參數都沒有傳,在驗證的時候當然會報空指針異常。
接下來,把coreServlet的訪問路徑拷貝下來,再回到微信公眾平臺的接入配置信息界面,將coreServlet的訪問路徑粘貼到URL中,并將SignUtil類中指定的token值weixinCourse填入到Token中,填寫后的結果如下圖所示:
我在寫這篇教程的時候是使用的BAE環境,如果想學習微信公眾帳號開發又沒有公網服務器環境的,建議可以試試,注冊使用都很方便,如果有問題我們還可以交流。
接著點擊“提交”,如果程序寫的沒問題,并且URL、Token都填寫正確,可以在頁面最上方看到“提交成功”的提示,并會再次跳轉到開發模式設置界面,而且能夠看到“你已成為開發者”的提示,如下圖所示:
啟用開發模式(下)
這個時候就已經成為開發者了,百般周折啊,哈哈,到這里還沒有完哦,還有最后一步工作就是將開發模式開啟。將右上角的開發模式開關由“關閉”切換到“開啟”,如下圖所示:
到這里,接口配置、開發模式的開啟就都完成了,本章節的內容也就講到這里。接下來要章節要講的就是如何接收、處理、響應由微信服務器轉發的用戶發送給公眾帳號的消息,也就是完成CoreServlet中doPost方法的編寫。
如果覺得文章對你有所幫助,請留言支持或關注微信公眾帳號xiaoqrobot支持柳峰哦!
總結
以上是生活随笔為你收集整理的[027] 微信公众帐号开发教程第3篇-开发模式启用及接口配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java GC编程
- 下一篇: 智能家居系列——灯光篇