接入微信公衆平臺開發,開發者須要按照以下步驟完成:java
一、填寫服務器配置git
二、驗證服務器地址的有效性安全
三、依據接口文檔實現業務邏輯服務器
下面詳細介紹這3個步驟。微信
流程圖微信開發
登陸微信公衆平臺官網後,在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。 app
消息解密類型選擇推薦兼容,方便調試和開發。微信公衆平臺
若是選擇安全模式,返回的xml是進行加密,解密方式參考 文檔工具
若是沒有域名 推薦使用內網穿透工具 小花生或者 ngrok 等微信支付
詳細 請看 ngrok 教程: https://blog.csdn.net/weixin_...官網 : https://www.ngrok.cc
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。
若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 timestamp 時間戳 nonce 隨機數 echostr 隨機字符串
代碼以下:
@GetMapping("getToken") @ResponseBody public String getToken(HttpServletRequest request) { String signature = request.getParameter("signature"); String timestamp= request.getParameter("timestamp"); String nonce= request.getParameter("nonce"); String echostr = request.getParameter("echostr"); logger.info(signature); logger.info(timestamp); logger.info(nonce); logger.info(echostr); //校驗請求 boolean check = RequestParamType.check(timestamp, nonce ,signature); if (check) { logger.info("接入成功。。"); return echostr; }else{ logger.info("接入失敗。。"); return null; } }
check工具類:
//token private final static String token = "test"; //獲取token驗證 public static boolean check( String timestamp, String nonce,String signature){ /** * 1)將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信 */ logger.info("token = "+token); String [] strings = new String[] {token,timestamp,nonce}; Arrays.sort(strings); String sha1Str = strings[0] + strings[1] + strings[2]; //sha1加密 String string2Sha1 = Sha1Util.getSha1(sha1Str); logger.info("加密前:" + signature); logger.info("加密後:"+string2Sha1); //signature 與生成的signature 對比 if (string2Sha1 != null && string2Sha1.equalsIgnoreCase(signature)){ return true; } return false; }
sha1加密 工具類 :
/** * sha1加密 * @param str 返回加密字符串 * @return */ public static String getSha1(String str) { if (str == null || str.length() == 0) { return null; } char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { MessageDigest mdTemp = MessageDigest.getInstance("sha1"); mdTemp.update(str.getBytes("UTF-8")); byte[] md = mdTemp.digest(); int j = md.length; char buf[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; buf[k++] = hexDigits[byte0 & 0xf]; } return new String(buf); } catch (Exception e) { logger.error(" sha1 加密異常!" + e); e.getStackTrace(); return null; } }
驗證URL有效性成功後即接入生效,成爲開發者。你能夠在公衆平臺網站中申請微信認證,認證成功後,將得到更多接口權限,知足更多業務需求。 成爲開發者後,用戶每次向公衆號發送消息、或者產生自定義菜單、或產生微信支付訂單等狀況時,開發者填寫的服務器配置URL將獲得微信服務器推送過來的消息和事件,開發者能夠依據自身業務邏輯進行響應,如回覆消息。 公衆號調用各接口時,通常會得到正確的結果,具體結果可見對應接口的說明。返回錯誤時,可根據返回碼來查詢錯誤緣由。全局返回碼說明 用戶向公衆號發送消息時,公衆號方收到的消息發送者是一個OpenID,是使用用戶微信號加密後的結果,每一個用戶對每一個公衆號有一個惟一的OpenID。 此外,因爲開發者常常有需在多個平臺(移動應用、網站、公衆賬號)之間共通用戶賬號,統一賬號體系的需求,微信開放平臺(open.weixin.qq.com)提供了UnionID機制。開發者可經過OpenID來獲取用戶基本信息,而若是開發者擁有多個應用(移動應用、網站應用和公衆賬號,公衆賬號只有在被綁定到微信開放平臺賬號下後,纔會獲取UnionID),可經過獲取用戶基本信息中的UnionID來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號,用戶的UnionID是惟一的。換句話說,同一用戶,對同一個微信開放平臺賬號下的不一樣應用,UnionID是相同的。詳情請在微信開放平臺的資源中心-移動應用開發-微信登陸-受權關係接口調用指引-獲取用戶我的信息(UnionID機制)中查看。
url接入成功後,就能夠進行微信開發了,用戶經過微信發送消息時,微信服務器會將此消息簡單的簡單包裝成xml數據包格式,而後推送到你本身的服務器上(也就是你填入的url 控制器中),經過這個url獲取到用戶的消息,而後處理相應的業務邏輯!
一圖勝千言 流程圖以下:
另請注意,微信公衆號接口必須以http://或https://開頭,分別支持80端口和443端口。