一、准備環境
1、JDK1.6及以上版本
2、MyEclipse
3、Tomcat
4、Ngrok(搭建本地服務器)
二、具體操作步驟
1.訪問微信公眾平台開發者手冊 https://mp.weixin.qq.com/wiki 如下是接入規則(來自開發者手冊):
開發者提交信息后,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:
| 參數 | 描述 |
| signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
| timestamp | 時間戳 |
| nonce | 隨機數 |
| echostr | 隨機字符串 |
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:
| 1)將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信 |
2、接入微信開發者模式開始
我們細細品味微信提供的規則:若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗
我們索性就在get方法中獲取echostr直接返回,按照此規則,我先來創建一個web項目,並創建一個Servlet,代碼如下:
1 public class WeixinServlet extends HttpServlet{ 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { 4 String signature = req.getParameter("signature"); 5 String timestamp = req.getParameter("timestamp"); 6 String nonce = req.getParameter("nonce"); 7 String echostr = req.getParameter("echostr"); 8 9 PrintWriter out = resp.getWriter(); 10 if(CheckUtil.checkSignature(signature, timestamp, nonce)){ 11 out.print(echostr); 12 } 13 } 14 15 @Override 16 protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { 17 doGet(req, resp); 18 }
因為我們現在用的是servlet需要在web.xml中添加配置信息,代碼如下:
1 <servlet> 2 <servlet-name>weixinServlet</servlet-name> 3 <servlet-class>com.weixin.servlet.WeixinServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>weixinServlet</servlet-name> 7 <url-pattern>/wx.do</url-pattern> 8 </servlet-mapping>
將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
檢驗signature的Java示例代碼:
1 public class CheckUtil { 2 private static final String token = "icon";//token是在驗證的時候進行配置的 3 public static boolean checkSignature(String signature,String timestamp,String nonce){ 4 String[] arr = new String[]{token,timestamp,nonce}; 5 //排序 6 Arrays.sort(arr); 7 //生成字符串 8 StringBuffer content = new StringBuffer(); 9 for(int i=0;i<arr.length;i++){ 10 content.append(arr[i]); 11 } 12 //sha1加密 13 String temp = getSha1(content.toString()); 14 return temp.equals(signature); 15 } 16 public static String getSha1(String str){ 17 if (null == str || 0 == str.length()){ 18 return null; 19 } 20 char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 21 'a', 'b', 'c', 'd', 'e', 'f'}; 22 try { 23 MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); 24 mdTemp.update(str.getBytes("UTF-8")); 25 26 byte[] md = mdTemp.digest(); 27 int j = md.length; 28 char[] buf = new char[j * 2]; 29 int k = 0; 30 for (int i = 0; i < j; i++) { 31 byte byte0 = md[i]; 32 buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; 33 buf[k++] = hexDigits[byte0 & 0xf]; 34 } 35 return new String(buf); 36 } catch (Exception e) { 37 return null; 38 } 39 } 40 }
3.微信公眾號測試號調試配置

設置完成之后點擊提交,提示配置成功就可以了。

