歡迎加入群:347245650 345531810 進行討論相互交流 我的微信號:572839485
圖床:沒有服務器 拖拽圖片 外網即可訪問
http://2.crazyflower.duapp.com/home
微信公眾帳號申請成功后,要想接收處理用戶的請求,就必須要在“高級功能”里進行配置,點擊“高級功能”,將看到如下界面
從上圖中可以看到,高級功能包含兩種模式:編輯模式和開發模式,並且這兩種模式是互斥關系,即兩種模式不能同時開啟。那兩種模式有什么區別呢?
編輯模式:主要針對非編程人員及信息發布類公眾帳號使用。開啟該模式后,可以方便地通過界面配置“自定義菜單”(認證的訂閱號、服務號)和“自動回復的消息”。
開發模式:主要針對具備開發能力的人使用。開啟該模式后,能夠使用微信公眾平台開放的接口,通過編程方式實現自定義菜單的創建、刪除、用戶消息的交互。這種模式更加靈活,建議有接觸過開發的人員用該模式。
編輯模式與開發模式 二者只能開啟一個
1、編輯模式請看:http://www.cnblogs.com/zyw-205520/p/3516495.html
2、開發模式
1)PHP開發者接入:http://www.cnblogs.com/zyw-205520/p/3500761.html
2)Java開發者接入如下 詳細的接口文檔說明:微信接口文檔
創建一個Java Web工程,命名任意, 代碼如下
1 package com.javen.course.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.javen.course.service.CrazyService; 12 import com.javen.course.util.SignUtil; 13 14 /** 15 * 核心請求處理類 16 * @author 簡愛微萌 17 * @Email zyw205@gmail.com 18 * 19 */ 20 public class CrazyServlet extends HttpServlet { 21 22 private static final long serialVersionUID = -5021188348833856475L; 23 @Override 24 protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 25 // 微信加密簽名 26 String signature = request.getParameter("signature"); 27 // 時間戳 28 String timestamp = request.getParameter("timestamp"); 29 // 隨機數 30 String nonce = request.getParameter("nonce"); 31 // 隨機字符串 32 String echostr = request.getParameter("echostr"); 33 PrintWriter out = response.getWriter(); 34 // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 35 if (SignUtil.checkSignature(signature, timestamp, nonce)) { 36 out.print(echostr); 37 } 38 out.close(); 39 out = null; 40 } 41 42 43 @Override 44 protected void doPost(HttpServletRequest request, HttpServletResponse response) 45 throws ServletException, IOException { 46 // TODO 消息的接收、處理、響應 47 } 48 }
代碼中只完成了doGet方法,它的作用正是確認請求是否來自於微信服務器;而doPost方法這里驗證不需要我們先放着。
在doGet方法中調用了SignUtil.java 實現代碼如下 1 package com.javen.course.util;
1 package com.javen.course.util; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 import java.util.Arrays; 6 7 /** 8 * 請求校驗工具類 9 * 10 * @author 簡愛微萌 11 * @Email zyw205@gmial.com 12 * 13 */ 14 public class SignUtil { 15 // 與接口配置信息中的Token要一致 16 private static String token = "Javen"; 17 18 /** 19 * 驗證簽名 20 * 21 * @param signature 22 * @param timestamp 23 * @param nonce 24 * @return 25 */ 26 public static boolean checkSignature(String signature, String timestamp, 27 String nonce) { 28 String[] arr = new String[] { token, timestamp, nonce }; 29 // 將token、timestamp、nonce三個參數進行字典序排序 30 //Arrays.sort(arr); 31 sort(arr); 32 StringBuilder content = new StringBuilder(); 33 for (int i = 0; i < arr.length; i++) { 34 content.append(arr[i]); 35 } 36 MessageDigest md = null; 37 String tmpStr = null; 38 39 try { 40 md = MessageDigest.getInstance("SHA-1"); 41 // 將三個參數字符串拼接成一個字符串進行sha1加密 42 byte[] digest = md.digest(content.toString().getBytes()); 43 tmpStr = byteToStr(digest); 44 } catch (NoSuchAlgorithmException e) { 45 e.printStackTrace(); 46 } 47 48 content = null; 49 // 將sha1加密后的字符串可與signature對比,標識該請求來源於微信 50 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; 51 } 52 53 /** 54 * 將字節數組轉換為十六進制字符串 55 * 56 * @param byteArray 57 * @return 58 */ 59 private static String byteToStr(byte[] byteArray) { 60 String strDigest = ""; 61 for (int i = 0; i < byteArray.length; i++) { 62 strDigest += byteToHexStr(byteArray[i]); 63 } 64 return strDigest; 65 } 66 67 /** 68 * 將字節轉換為十六進制字符串 69 * 70 * @param mByte 71 * @return 72 */ 73 private static String byteToHexStr(byte mByte) { 74 char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 75 'B', 'C', 'D', 'E', 'F' }; 76 char[] tempArr = new char[2]; 77 tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; 78 tempArr[1] = Digit[mByte & 0X0F]; 79 80 String s = new String(tempArr); 81 return s; 82 } 83 84 public static void sort(String a[]) { 85 for (int i = 0; i < a.length - 1; i++) { 86 for (int j = i + 1; j < a.length; j++) { 87 if (a[j].compareTo(a[i]) < 0) { 88 String temp = a[i]; 89 a[i] = a[j]; 90 a[j] = temp; 91 } 92 } 93 } 94 } 95 }
注意:SignUtil類中的成員變量token,這里賦予什么值,在接口配置信息中的Token就要填寫什么值,兩邊要保持一致
最后再來看一下CoreServlet是怎么配置的,web.xml中的配置代碼如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 3 <display-name></display-name> 4 <servlet> 5 <servlet-name>CrazyServlet</servlet-name> 6 <servlet-class> 7 com.javen.course.servlet.CrazyServlet 8 </servlet-class> 9 </servlet> 15 16 <servlet-mapping> 17 <servlet-name>CrazyServlet</servlet-name> 18 <url-pattern>/Javen</url-pattern> 19 </servlet-mapping> 20 24 <welcome-file-list> 25 <welcome-file>index.jsp</welcome-file> 26 </welcome-file-list> 27 </web-app>
到目前為止,所有編碼都完成了,就是這么簡單。接下來就是將工程發布到公網服務器上,如果沒有公網服務器環境,可以去了解下BAE、SAE或者租賃一個服務器。發布到服務器上后,我們在瀏覽器里訪http://你服務器的Ip或者域名/Javen(項目名)/Javen,如果看到如下界面就表示我們的代碼沒有問題:
PS:在瀏覽器中直接訪問就相當於提交的是GET請求,而我們什么參數都沒有傳,在驗證的時候當然會報空指針異常。
最好在功能>>高級功能>>開發模式中填寫對應的URL和Token即可 沒有找到頁面的可以參考 http://www.cnblogs.com/zyw-205520/p/3500761.html
我的微信公眾賬號 人臉識別、天氣查詢、公交查詢、周公解夢、星座運勢、手機歸屬地查詢、聊天嘮嗑等