參考:http://www.cnblogs.com/fengzheng/p/5023678.htmlhtml
http://www.cnblogs.com/xdp-gacl/p/5151857.htmljava
一:先在微信測試公衆號網址申請一個測試帳號:web
https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index數組
二:配置內網穿透。ngrok安全
https://natapp.cn/服務器
下載。而後配置,有個受權碼微信
輸入命令:app
natapp - -authtoken 受權碼 80測試
以後再啓動,雙擊ngrok.exe便可,啓動後輸入命令將本機映射到外網,將本地8080端口下的web服務映射到外網80端口,命令以下:ui
ngrok http 8080
三:書寫代碼
package com.wx.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * Created by xdp on 2016/1/25. * 使用@WebServlet註解配置WxServlet,urlPatterns屬性指明瞭WxServlet的訪問路徑 */ @WebServlet(urlPatterns="/WxServlet") public class WxServlet extends HttpServlet { /** * Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性) * 好比這裏我將Token設置爲gacl */ private final String TOKEN = "gacl"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("開始校驗簽名"); /** * 接收微信服務器發送請求時傳遞過來的4個參數 */ String signature = request.getParameter("signature");//微信加密簽名signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 String timestamp = request.getParameter("timestamp");//時間戳 String nonce = request.getParameter("nonce");//隨機數 String echostr = request.getParameter("echostr");//隨機字符串 //排序 String sortString = sort(TOKEN, timestamp, nonce); //加密 String mySignature = sha1(sortString); //校驗簽名 if (mySignature != null && mySignature != "" && mySignature.equals(signature)) { System.out.println("簽名校驗經過。"); //若是檢驗成功輸出echostr,微信服務器接收到此輸出,纔會確認檢驗完成。 //response.getWriter().println(echostr); response.getWriter().write(echostr); } else { System.out.println("簽名校驗失敗."); } } /** * 排序方法 * * @param token * @param timestamp * @param nonce * @return */ public String sort(String token, String timestamp, String nonce) { String[] strArray = {token, timestamp, nonce}; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } return sb.toString(); } /** * 將字符串進行sha1加密 * * @param str 須要加密的字符串 * @return 加密後的內容 */ public String sha1(String str) { try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字節數組轉換爲 十六進制 數 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); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } }
而後在微信公衆號中配置URL和token
若是提交成功:控制檯會打印以下
我在配置的時候出現的錯誤:配置失敗。緣由是沒有寫 ngrok http 8080這一步。致使內網沒有穿透出去。