微信公衆賬號開發教程第3篇-開發模式啓用及接口配置

編輯模式與開發模式 php

微信公衆賬號申請成功後,要想接收處理用戶的請求,就必需要在「高級功能」裏進行配置,點擊「高級功能」,將看到以下界面: java

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

編輯模式:主要針對非編程人員及信息發佈類公衆賬號使用。開啓該模式後,能夠方便地經過界面配置「自定義菜單」和「自動回覆的消息」。 web

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


啓用開發模式(上) 數組

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

1)點擊進入編輯模式,將右上角的編輯模式開關由「開啓」切換到「關閉」,以下圖所示: 服務器

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

提示須要咱們先成爲開發者,才能開啓開發模式。那就先點擊下圖所示的「成爲開發者」按鈕: app

若是提示資料不全,那就先補齊資料再回來繼續操做。須要補全的資料有公衆賬號頭像、描述和運營地區。

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

這裏須要填寫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支持柳峯哦!

相關文章
相關標籤/搜索