微信測試號開發之一 接入微信公衆號

原文連接:https://blog.csdn.net/qq_37936542/article/details/78337701前端

一:微信公衆號的類型有哪些?java

普通服務號、認證服務號、普通訂閱號、認證訂閱號,其之間主要區別在於權限不一樣。git


二:準備服務器web

微信開發時項目路徑必須在公網上能夠訪問,且必須是80端口,所以須要準備服務器或者是外網映射工具。編程

推薦一下方式小程序

(一)雲主機微信小程序

(二)BAE(百度雲開發)、SAE(新浪雲)數組

(三)免費的外網映射工具 ngrok、natapp瀏覽器


ngrok操做步驟參考個人博客  外網映射工具之ngrok服務器



三:準備微信測試號

微信測試號的權限比沒有認證的普通號權限要大一點,若是僅僅是測試的話,推薦使用測試號。

網址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login



四:新建web項目,完成微信認證

使用ngrok將127.0.0.1:80映射成外網地址,用外網地址訪問本身的web項目是否能夠成功訪問。


微信服務器第一次會發送GET請求到指定的URL,其中有四個參數

signature:微信加密簽名,結合了開發者填寫的token參數和請求中的timestamp、nonce參數加密生成。

timestamp:時間戳

nonce:隨機數

echostr:隨機字符串


signature加密流程:

1.將token、timestamp和nonce進行字典排序

2.將三個參數拼接成一個參數進行sha1加密

3.將加密後的字符串和signature進行對比


後臺經過對signature驗證來檢驗消息是否來自微信,確認則原樣返回echostr,接入成功,不然接入失敗。


封裝加密工具類:

[java] view plain copy
  1. import java.security.MessageDigest;  
  2. import java.security.NoSuchAlgorithmException;  
  3. import java.util.Arrays;  
  4.   
  5.   
  6. public class StringUtils {  
  7.   
  8.   
  9. // 與微信公衆號配置的一致  
  10. private static String token = "intmote2017";  
  11.   
  12.   
  13. /** 
  14. * 方法名:驗證簽名 
  15.  
  16. * @param signature 
  17. * @param timestamp 
  18. * @param nonce 
  19. * @return 
  20. * @throws 
  21. */  
  22. public static boolean checkSignature(String signature, String timestamp,  
  23. String nonce) {  
  24. // 1.將token、timestamp、nonce三個參數進行字典序排序  
  25. String[] arr = new String[] { token, timestamp, nonce };  
  26. Arrays.sort(arr);  
  27.   
  28.   
  29. // 2. 將三個參數字符串拼接成一個字符串進行sha1加密  
  30. StringBuilder content = new StringBuilder();  
  31. for (int i = 0; i < arr.length; i++) {  
  32. content.append(arr[i]);  
  33. }  
  34. MessageDigest md = null;  
  35. String tmpStr = null;  
  36. try {  
  37. md = MessageDigest.getInstance("SHA-1");  
  38. // 將三個參數字符串拼接成一個字符串進行sha1加密  
  39. byte[] digest = md.digest(content.toString().getBytes());  
  40. tmpStr = byteToStr(digest);  
  41. catch (NoSuchAlgorithmException e) {  
  42. e.printStackTrace();  
  43. }  
  44.   
  45.   
  46. content = null;  
  47. // 3.將sha1加密後的字符串可與signature對比,標識該請求來源於微信  
  48. return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
  49. }  
  50.   
  51.   
  52. /** 
  53. * 方法名:將字節數組轉換爲十六進制字符串 
  54.  
  55. * @param byteArray 
  56. * @return 
  57. * @throws 
  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.  
  71. * @param mByte 
  72. * @return 
  73. * @throws 
  74. */  
  75. private static String byteToHexStr(byte mByte) {  
  76. char[] Digit = { '0''1''2''3''4''5''6''7''8''9''A',  
  77. 'B''C''D''E''F' };  
  78. char[] tempArr = new char[2];  
  79. tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
  80. tempArr[1] = Digit[mByte & 0X0F];  
  81. String s = new String(tempArr);  
  82. return s;  
  83. }  
  84.   
  85.   
  86. }  


編寫CoreController來接收微信請求


[java] view plain copy
  1. @Controller  
  2. public class CoreController {  
  3.   
  4. @RequestMapping(value="handle",method=RequestMethod.GET)  
  5. public void linkHandle(HttpServletRequest request,HttpServletResponse response) throws IOException{  
  6. // 微信加密簽名  
  7.         String signature = request.getParameter("signature");  
  8.         // 時間戳  
  9.         String timestamp = request.getParameter("timestamp");  
  10.         // 隨機數  
  11.         String nonce = request.getParameter("nonce");  
  12.         // 隨機字符串  
  13.         String echostr = request.getParameter("echostr");  
  14.           
  15.         //獲取輸出流  
  16.         PrintWriter out = response.getWriter();  
  17.           
  18.         //若是驗證消息是來自微信,返回echostr  
  19.         boolean check = StringUtils.checkSignature(signature, timestamp, nonce);  
  20.         if(check){  
  21.         out.print(echostr);;  
  22.         }  
  23.   
  24.         out.close();  
  25.         out = null;  
  26. }  
  27.   
  28. /** 
  29. * 消息的處理和響應 
  30. * @param request 
  31. * @param response 
  32. * @throws Exception  
  33. */  
  34. @RequestMapping(value="handle",method=RequestMethod.POST)  
  35. public void messageHandle(HttpServletRequest request,HttpServletResponse response) throws Exception{  
  36.     //將請求、響應的編碼設置爲utf-8  
  37. request.setCharacterEncoding("UTF-8");  
  38. response.setCharacterEncoding("UTF-8");  
  39.   
  40. //調用核心業務邏輯  
  41. //String respXml = CoreService.processRequest(request);  
  42.   
  43. }  
  44. }  


五:修改接口配置信息


將映射後的handle方法訪問路徑配置到URL中,token要和StringUtils中的token保持一致。

點擊提交,不出意外,提示配置成功


注意:若是直接在瀏覽器上訪問配置的路徑會直接報500的錯誤,由於沒有參數!!!




六:微信的業務邏輯,好比回覆消息和自定義菜單等,都在post請求,所以在handler的post方法中完成

文末福利:

福利一:前端,Java,產品經理,微信小程序,Python等10G資源合集大放送:jianshu.com/p/e8197d4d9

福利二:微信小程序入門與實戰全套詳細視頻教程。


【領取方法】

關注 【編程微刊】微信公衆號:

回覆【小程序demo】一鍵領取130個微信小程序源碼demo資源。

回覆【領取資源】一鍵領取前端,Java,產品經理,微信小程序,Python等資源合集10G資源大放送。





原文做者:祈澈姑娘
原文連接:jianshu.com/u/05f416aef
創做不易,轉載請告知

90後前端妹子,愛編程,愛運營,愛折騰。堅持總結工做中遇到的技術問題,堅持記錄工做中所所思所見,歡迎你們一塊兒探討交流。

相關文章
相關標籤/搜索