原文連接: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,接入成功,不然接入失敗。
封裝加密工具類:
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Arrays;
-
-
- public class StringUtils {
-
-
-
- private static String token = "intmote2017";
-
-
-
-
-
-
-
-
-
-
-
- public static boolean checkSignature(String signature, String timestamp,
- String nonce) {
-
- String[] arr = new String[] { token, timestamp, nonce };
- Arrays.sort(arr);
-
-
-
- StringBuilder content = new StringBuilder();
- for (int i = 0; i < arr.length; i++) {
- content.append(arr[i]);
- }
- MessageDigest md = null;
- String tmpStr = null;
- try {
- md = MessageDigest.getInstance("SHA-1");
-
- byte[] digest = md.digest(content.toString().getBytes());
- tmpStr = byteToStr(digest);
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
-
-
- content = null;
-
- return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
- }
-
-
-
-
-
-
-
-
-
- private static String byteToStr(byte[] byteArray) {
- String strDigest = "";
- for (int i = 0; i < byteArray.length; i++) {
- strDigest += byteToHexStr(byteArray[i]);
- }
- return strDigest;
- }
-
-
-
-
-
-
-
-
-
- private static String byteToHexStr(byte mByte) {
- char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
- 'B', 'C', 'D', 'E', 'F' };
- char[] tempArr = new char[2];
- tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
- tempArr[1] = Digit[mByte & 0X0F];
- String s = new String(tempArr);
- return s;
- }
-
-
- }
編寫CoreController來接收微信請求
- @Controller
- public class CoreController {
-
- @RequestMapping(value="handle",method=RequestMethod.GET)
- public void linkHandle(HttpServletRequest request,HttpServletResponse response) throws IOException{
-
- String signature = request.getParameter("signature");
-
- String timestamp = request.getParameter("timestamp");
-
- String nonce = request.getParameter("nonce");
-
- String echostr = request.getParameter("echostr");
-
-
- PrintWriter out = response.getWriter();
-
-
- boolean check = StringUtils.checkSignature(signature, timestamp, nonce);
- if(check){
- out.print(echostr);;
- }
-
- out.close();
- out = null;
- }
-
-
-
-
-
-
-
- @RequestMapping(value="handle",method=RequestMethod.POST)
- public void messageHandle(HttpServletRequest request,HttpServletResponse response) throws Exception{
-
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
-
-
-
-
- }
- }
五:修改接口配置信息
將映射後的handle方法訪問路徑配置到URL中,token要和StringUtils中的token保持一致。
點擊提交,不出意外,提示配置成功
注意:若是直接在瀏覽器上訪問配置的路徑會直接報500的錯誤,由於沒有參數!!!
六:微信的業務邏輯,好比回覆消息和自定義菜單等,都在post請求,所以在handler的post方法中完成
文末福利:
福利一:前端,Java,產品經理,微信小程序,Python等10G資源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入門與實戰全套詳細視頻教程。
【領取方法】
關注 【編程微刊】微信公衆號:
回覆【小程序demo】一鍵領取130個微信小程序源碼demo資源。
回覆【領取資源】一鍵領取前端,Java,產品經理,微信小程序,Python等資源合集10G資源大放送。
原文做者:祈澈姑娘
原文連接:https://www.jianshu.com/u/05f416aefbe1
創做不易,轉載請告知
90後前端妹子,愛編程,愛運營,愛折騰。堅持總結工做中遇到的技術問題,堅持記錄工做中所所思所見,歡迎你們一塊兒探討交流。