登錄微信公眾平臺官網后,在公眾平臺后臺管理頁面 - 開發者中心頁,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token和EncodingAESKey。
微信訂閱號里面的配置界面:
測試號里面的界面:
為什么要申請測試賬號,主要是因為測試賬號比我們沒有認證的微信賬號權限大一點。足夠測試我們的接口了。
這個是我的測試號:
服務器配置:
URL:是開發者用來接收微信消息和事件 的接口URL。(必須以http://開頭,目前支持80端口)
Token:可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。注意必須為英文或數字,長度為3-32字符。
EncodingAESKey:由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。(消息加密密鑰由43位字符組成,可隨機修改,字符范圍為A-Z,a-z,0-9。)
同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。
明文模式:不使用消息體加解密功能,安全系數較低
兼容模式:明文、密文將共存,方便開發者調試和維護
安全模式下:消息包為純密文,需要開發者加密和解密,安全系數高
看完上面的,還是不知道該填些什么吧,不用急,先空著,后面再填。
開發者提交信息后,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:
參數 | 描述 |
---|---|
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。
加密/校驗流程如下:1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源于微信
說明一下,我使用的是eclipse ,java語言, tomcat 7.0 環境。
這些配置可以參照我的其他博客文章進行配置,這里就不多說了。
下面我們寫程序進行校驗:
(1)新建一個名字叫 souvc 的 web項目。
(2) 選擇web.xml文件的生成。
(3)新建一個servlet類,來接收微信服務器傳來信息。
package com.souvc.weixin.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 com.souvc.weixin.util.SignUtil;/** * 類名: CoreServlet </br> * 描述: 來接收微信服務器傳來信息 </br> * 開發人員: souvc</br> * 創建時間:2015-9-29 </br> * 發布版本:V1.0 </br> */public class CoreServlet extends HttpServlet { private static final long serialVersionUID = 4323197796926899691L; /** * 確認請求來自微信服務器 */ 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 消息的接收、處理、響應 }}
(4) 加密校驗程序的工具類。
package com.souvc.weixin.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/*** 類名: SignUtil </br>* 描述: 檢驗signature 工具類 </br>* 開發人員: souvc </br>* 創建時間: 2015-9-29 </br>* 發布版本:V1.0 </br> */public class SignUtil { // 與接口配置信息中的Token要一致 private static String token = "souvcweixin"; /** * 方法名:checkSignature</br> * 詳述:驗證簽名</br> * 開發人員:souvc</br> * 創建時間:2015-9-29 </br> * @param signature * @param timestamp * @param nonce * @return * @throws */ public static boolean checkSignature(String signature, String timestamp,String nonce) { // 1.將token、timestamp、nonce三個參數進行字典序排序 String[] arr = new String[] { token, timestamp, nonce }; Arrays.sort(arr); // 2. 將三個參數字符串拼接成一個字符串進行sha1加密 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; // 3.將sha1加密后的字符串可與signature對比,標識該請求來源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 方法名:byteToStr</br> * 詳述:將字節數組轉換為十六進制字符串</br> * 開發人員:souvc </br> * 創建時間:2015-9-29 </br> * @param byteArray * @return * @throws */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 方法名:byteToHexStr</br> * 詳述:將字節轉換為十六進制字符串</br> * 開發人員:souvc</br> * 創建時間:2015-9-29 </br> * @param mByte * @return * @throws */ 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; }}
(5)配置一下訪問路徑的 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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>souvc</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>coreServlet</servlet-name> <servlet-class> com.souvc.weixin.servlet.CoreServlet </servlet-class> </servlet> <!-- url-pattern中配置的/coreServlet用于指定該Servlet的訪問路徑 --> <servlet-mapping> <servlet-name>coreServlet</servlet-name> <url-pattern>/coreServlet</url-pattern> </servlet-mapping> </web-app>
在webroot下面, 添加一個主頁index.jsp,代碼如下
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>歡迎訪問我的網站 www.souvc.com </title>
</head>
<body>
歡迎訪問我的網站 www.souvc.com
</body>
</html>
(6)把程序從BAE上面導出來。
復制svn地址
在本地新建一個weixin的文件夾,然后從服務器上checkout代碼:
如下圖,說明成功導出代碼。
(7)把我們寫的程序從eclipse里面導出來,并打包成war包。
(8)把程序提交到BAE服務器上面。
預覽并發布
訪問以下我們的鏈接: http://chiyan.duapp.com/
(9)配置微信服務器。
這里用的是測試賬號。
配置之后,會提示配置成功。
/** * 處理微信服務器發來的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO 消息的接收、處理、響應 }
這個后面再寫業務,到此,我們就完成了與微信服務器的校驗。
溫馨提醒:
有朋友直接輸入該請求:http://chiyan.duapp.com/coreServlet
是會報500空指針的錯誤,因為我們這樣訪問并沒有我們程序中要傳的參數傳過去。
新聞熱點
疑難解答