一、說明
* 本示例根據(jù)微信開發(fā)文檔:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )進行開發(fā)演示。
* 編輯平臺:myeclipse10.7+win32+jdk1.7+tomcat7.0
* 服務器:阿里云 windows server 2008 64bits
* 平臺要求:servlet使用注解方式,平臺要求:j2ee6.0+、jdk6.0+、tomcat7.0+
* 演示更加注重于api解析。
* 為了便于測試說明,每個測試用例為獨立,不依賴于其它方法。對于封裝,不多加考慮。
* 演示盡可能按照API要求進行,目的:了解文檔使用方式,達到舉一反三的效果。
* 知識要求:牢固的java基礎、了解http網(wǎng)絡通信知識、對于javaweb有足夠了解、json解析
* 當前時間:4/3/2016 5:32:57 PM ,以該時間為準。
二、文檔原文(摘要)
文檔地址:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
接入微信公眾平臺開發(fā),開發(fā)者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據(jù)接口文檔實現(xiàn)業(yè)務邏輯
三、文檔理解
驗證服務器地址的有效性
1、api這樣介紹:
開發(fā)者提交信息后,微信服務器將發(fā)送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數(shù):signature、timestamp、nonce、echostr
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。
若確認此次GET請求來自微信服務器,請原樣返回echostr參數(shù)內容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗流程如下:
1)、將token、timestamp、nonce三個參數(shù)進行字典序排序
2)、將三個參數(shù)字符串拼接成一個字符串進行sha1加密
3)、開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信
2、理解
說明該請求是“GET”方式,并且訪問該請求會返回四個參數(shù):signature、timestamp、nonce、echostr。
我們需要接受這幾個參數(shù),然后進行處理。如果驗證成功,返回接收到的“echostr”,否則驗證失敗。
驗證方式是對接受到的token、timestamp、nonce三個參數(shù)進行字典序排序,然后進行sha1加密,最后和signature對比。
*加密后的字符串可與signature對比,如果相等【該處api可能解釋不是太明白】,返回“echostr”,驗證成功。
3、實現(xiàn)
創(chuàng)建一個servlet CoreServlet實現(xiàn)HttpServlet,重載doGet方法。
參數(shù)準備
1
2
3
4
5
6
7
8
|
// 設置一個全局的token,開發(fā)者自己設置。api這樣解釋:Token可由開發(fā)者可以任意填寫, // 用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性) String token = "wgyscsf" ; // 根據(jù)api說明,獲取上述四個參數(shù) String signature = req.getParameter( "signature" ); String timestamp = req.getParameter( "timestamp" ); String nonce = req.getParameter( "nonce" ); String echostr = req.getParameter( "echostr" ); |
根據(jù)api所說的三步驟進行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
// 第一步:將token、timestamp、nonce三個參數(shù)進行字典序排序 String[] parms = new String[] { token, timestamp, nonce }; // 將需要字典序排列的字符串放到數(shù)組中 Arrays.sort(parms); // 按照api要求進行字典序排序【百度:什么是字典序排序】 // 第二步:將三個參數(shù)字符串拼接成一個字符串進行sha1加密【百度:java sha1加密】 // 拼接字符串 String parmsString = "" ; // 注意,此處不能=null。 for ( int i = 0 ; i < parms.length; i++) { parmsString += parms[i]; } // sha1加密 String mParms = null ; // 加密后的結果 ... //該地方是sha1加密的實現(xiàn),不再貼代碼 mParms = hexString.toString(); // 加密結果 /* * api要求: 若確認此次GET請求來自微信服務器,請原樣返回echostr參數(shù)內容, 則接入生效, 成為開發(fā)者成功,否則接入失敗。 */ // 第三步: 開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信接入成功。 System.out.println(TAG + ":" + mParms + "---->" + signature); if (mParms.equals(signature)) { // System.out.println(TAG + ":" + mParms + "---->" + signature); printWriter.write(echostr); } else { // 接入失敗,不用回寫 // System.out.println(TAG + "接入失敗"); } |
4、填寫服務器配置
1)、包括內容
服務器配置主要是當我們寫好自己的接入微信開發(fā)平臺的代碼之后要配置的服務器和微信接入接口。
2)、服務器操作
打開服務器的tomcat,將寫好的代碼放到webapps文件下。
3)、微信公眾平臺操作
*申請微信測試賬號(直接用微信掃一掃即可以登錄):http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
*打開微信公眾平臺測試號,配置接口配置信息。配置如下
URL:http://ip/WeixinApiDemo/CoreServlet
Token:wgyscsf
*提交,配置成功和失敗均會有提醒。
該部分所有操作源碼,可以直接使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
package com.gist.servlet; import java.io.IOException; import java.io.PrintWriter; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author 高遠</n> 郵箱:[email protected]</n> 博客 http://blog.csdn.net/wgyscsf</n> * 編寫時期 2016-4-3 下午4:34:05 */ @WebServlet ( "/CoreServlet" ) public class CoreServlet extends HttpServlet { String TAG = "CoreServlet" ; /* * 第二步:驗證服務器地址的有效性 開發(fā)者提交信息后,微信服務器將發(fā)送GET請求到填寫的服務器地址URL上, * GET請求攜帶四個參數(shù):signature、timestamp、nonce、echostr * 開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。 若確認此次GET請求來自微信服務器,請原樣返回echostr參數(shù)內容, * 則接入生效, 成為開發(fā)者成功,否則接入失敗。 * * 加密/校驗流程如下: 1. 將token、timestamp、nonce三個參數(shù)進行字典序排序 2. * 將三個參數(shù)字符串拼接成一個字符串進行sha1加密 3. 開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信 */ /* * 字典排序(lexicographical * order)是一種對于隨機變量形成序列的排序方法。其方法是,按照字母順序,或者數(shù)字小大順序,由小到大的形成序列。 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 設置編碼 req.setCharacterEncoding("utf-8"); resp.setContentType("html/text;charset=utf-8"); resp.setCharacterEncoding("utf-8"); // 獲取輸出流 PrintWriter printWriter = resp.getWriter(); // 設置一個全局的token,開發(fā)者自己設置。api這樣解釋:Token可由開發(fā)者可以任意填寫, // 用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性) String token = "wgyscsf"; // 根據(jù)api說明,獲取上述四個參數(shù) String signature = req.getParameter("signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); String echostr = req.getParameter("echostr"); // // temp:臨時打印,觀看返回參數(shù)情況 // System.out.println(TAG + ":signature:" + signature + ",timestamp:" // + timestamp + ",nonce:" + nonce + ",echostr:" + echostr); // 根據(jù)api所說的“加密/校驗流程”進行接入。共計三步 // 第一步:將token、timestamp、nonce三個參數(shù)進行字典序排序 String[] parms = new String[] { token, timestamp, nonce };// 將需要字典序排列的字符串放到數(shù)組中 Arrays.sort(parms);// 按照api要求進行字典序排序 // 第二步:將三個參數(shù)字符串拼接成一個字符串進行sha1加密 // 拼接字符串 String parmsString = "";// 注意,此處不能=null。 for (int i = 0; i < parms.length; i++) { parmsString += parms[i]; } // sha1加密 String mParms = null;// 加密后的結果 MessageDigest digest = null; try { digest = java.security.MessageDigest.getInstance("SHA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } digest.update(parmsString.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字節(jié)數(shù)組轉換為 十六進制 數(shù) for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } mParms = hexString.toString();// 加密結果 /* * api要求: 若確認此次GET請求來自微信服務器,請原樣返回echostr參數(shù)內容, 則接入生效, 成為開發(fā)者成功,否則接入失敗。 */ // 第三步: 開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信接入成功。 System.out.println(TAG + ":" + mParms + "---->" + signature); if (mParms.equals(signature)) { // System.out.println(TAG + ":" + mParms + "---->" + signature); printWriter.write(echostr); } else { // 接入失敗,不用回寫 // System.out.println(TAG + "接入失敗"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } |
java微信開發(fā)API的第一篇內容就為大家介紹到這里,希望大家繼續(xù)關注之后的更新內容,謝謝!