一、填寫服務器配置html
二、驗證服務器地址的有效性java
三、依據接口文檔實現業務邏輯 web
一、一個能夠訪問的外網,即80的訪問端口,由於微信公衆號接口只支持80接口。(環境配置)算法
二、申請一個微信公衆號測試帳號。spring
三、編寫Java基本代碼。瀏覽器
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:服務器
參數 | 描述 |
---|---|
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。微信
signature驗證結合了token,和請求中的timestamp參數,nonce參數微信開發
加密/校驗流程以下: 1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
(1)建立一個Java Maven Web工程或者java Web工程,並新建一個可以處理請求的Controller,命名任意,我用的架構是(SSM),微信開發者接入驗證接口代碼:架構
package com.webchat.controller.webchat; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.webchat.util.weixin.WebChatUtil; /** * 微信開發者接入 * * @author Administrator * */ @Controller @RequestMapping(value="/weixin/mywebchat") public class WebChatController { // 開發者接入驗證 確認請求來自微信服務器 @RequestMapping(method = RequestMethod.GET) public void get(HttpServletRequest request, HttpServletResponse response) throws IOException { //消息來源可靠性驗證 String signature = request.getParameter("signature");// 微信加密簽名 String timestamp = request.getParameter("timestamp");// 時間戳 String nonce = request.getParameter("nonce"); // 隨機數 String echostr = request.getParameter("echostr");//成爲開發者驗證 //確認這次GET請求來自微信服務器,原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗 PrintWriter out = response.getWriter(); if(WebChatUtil.checkSignature(signature, timestamp, nonce)){ System.out.println("=======請求校驗成功======" + echostr); out.print(echostr); } out.close(); out = null; } public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO 消息的接收、處理、響應 } }
能夠看到,代碼中只完成了get方法,它的做用正是確認請求是否來自於微信服務器;而post方法不是咱們此次要講的內容,而且完成接口配置也不須要管post方法,就先空在那裏。
(2)WebChatUtil.checkSignature代碼實現
package com.webchat.util.weixin; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * 微信公衆平臺請求算法工具類 * @author Administrator * */ public class WebChatUtil { //private static String token = ConfigUtil.getProperty("wx_token"); private static String token = "mywebchat"; /** * 驗證簽名的方法 * @param token * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { List<String> params = new ArrayList<String>(); params.add(token); params.add(timestamp); params.add(nonce); // 1. 將token、timestamp、nonce三個參數進行字典序排序 Collections.sort(params, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 2.將三個參數字符串拼接成一個字符串進行sha1加密 String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2)); // 3. 將sha1加密後的字符串可與signature對比,標識該請求來源於微信 return temp.equals(signature); } }
(3)SHA1 算法的實現
package com.webchat.util.weixin; import java.security.MessageDigest; /** * SHA1算法 * @author Administrator * */ public class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; // 把密文轉換成十六進制的字符串形式 private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文轉換成十六進制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } }
開發者接入驗證 確認請求來自微信服務器的基本代碼已經完成,下面讓咱們來測試一下吧
用咱們上節講到的內容,把映射的本地地址公網域名 加上咱們的項目名和接口輸入瀏覽器
此時說明是對的,由於咱們沒有傳入任何參數,報空指針正常啦,下面講一下再微信公衆號裏面的配置
登陸微信公衆平臺官網後,在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey。
以上配置須要認證後纔會獲得相應的權限。若是開發階段,咱們能夠申請開發者測試帳號。
爲何要申請測試帳號?
主要是由於測試帳號比咱們沒有認證的微信帳號權限大一點。足夠測試咱們的接口了。
接下來,把瀏覽器的訪問路徑拷貝下來,再回到微信公衆平臺的接入配置信息界面,將拷貝的訪問路徑粘貼到URL中,並將WebChatUtil類中指定的token值mywebchat填入到Token中,填寫後的結果以下圖所示:
點擊提交出現;則說明配置成功了
到此,咱們就完成了與微信服務器的校驗。
若是在操做過程當中有問題,歡迎隨時討論^.^
其餘文章關聯
(一)Java開發微信公衆號(一)---初識微信公衆號以及環境搭建
(二)Java開發微信公衆號(二)---開啓開發者模式,接入微信公衆平臺開發