1、準備環境git
一、JDK1.6及以上版本web
二、MyEclipse服務器
三、Tomcat微信
四、Ngrok(搭建本地服務器)微信開發
2、具體操做步驟app
1.訪問微信公衆平臺開發者手冊 https://mp.weixin.qq.com/wiki 以下是接入規則(來自開發者手冊):微信公衆平臺
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數以下表所示:ide
參數 | 描述 |
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。加密/校驗流程以下:測試
1)將token、timestamp、nonce三個參數進行字典序排序加密 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信 |
二、接入微信開發者模式開始
咱們細細品味微信提供的規則:若確認這次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.微信公衆號測試號調試配置
設置完成以後點擊提交,提示配置成功就能夠了。