接入微信公眾平台開發,開發者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據接口文檔實現業務邏輯
資料准備:
1、一個可以訪問的外網,即80的訪問端口,因為微信公眾號接口只支持80接口。(環境配置)
3、編寫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開發微信公眾號(二)---開啟開發者模式,接入微信公眾平台開發
(三)Java開發微信公眾號(三)---微信服務器請求消息,響應消息,事件消息以及工具處理類的封裝
(四)Java開發微信公眾號(四)---微信服務器post消息體的接收及消息的處理