掃碼登錄微信公衆號平臺,此時默認的是編輯模式,須要修改成開發者模式。php
找到開發--->基本配置,java
設置AppId以及APPSecret,並填寫IP白名單(在線ip查詢:http://www.ip138.com/)。git
下面進行服務器配置,這裏須要進行token的驗證,會根據你填寫的url進行token的匹配驗證,官網描述的很清楚:https://mp.weixin.qq.com/wiki...spring
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數以下表所示:數組
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。加密/校驗流程以下:tomcat
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信springboot
官網也給出了校驗實例,可是是php的,須要咱們轉換成java。具體步驟以下:服務器
建立springboot項目,添加依賴微信
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.9</version> </dependency>
建立WechatIndexController類,實現一個get請求方法:app
@RestController @RequestMapping("/index") public class WechatIndexController { private static final Logger LOGGER = LoggerFactory.getLogger(WechatIndexController.class); @RequestMapping(method = RequestMethod.GET) public void get(HttpServletRequest request, HttpServletResponse response) { // 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 String signature = request.getParameter("signature"); // 時間戳 String timestamp = request.getParameter("timestamp"); // 隨機數 String nonce = request.getParameter("nonce"); // 隨機字符串 String echostr = request.getParameter("echostr"); PrintWriter out = null; try { out = response.getWriter(); // 經過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,不然接入失敗 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } } catch (IOException e) { e.printStackTrace(); } finally { out.close(); out = null; } } }
SignUtil類:
public class SignUtil { //token能夠本身進行定義,必須爲英文或者是數字,長度爲3-32字符,這個token要跟服務器配置中的token一致 private static String token = "woshiyigetokenaaa123qqq"; /** * 校驗簽名 * @param signature 簽名 * @param timestamp 時間戳 * @param nonce 隨機數 * @return 布爾值 */ public static boolean checkSignature(String signature,String timestamp,String nonce){ String checktext = null; if (null != signature) { //對ToKen,timestamp,nonce 按字典排序 String[] paramArr = new String[]{token,timestamp,nonce}; Arrays.sort(paramArr); //將排序後的結果拼成一個字符串 String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]); try { MessageDigest md = MessageDigest.getInstance("SHA-1"); //對接後的字符串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); checktext = byteToStr(digest); } catch (NoSuchAlgorithmException e){ e.printStackTrace(); } } //將加密後的字符串與signature進行對比 return checktext !=null ? checktext.equals(signature.toUpperCase()) : false; } /** * 將字節數組轉化我16進制字符串 * @param byteArrays 字符數組 * @return 字符串 */ private static String byteToStr(byte[] byteArrays){ String str = ""; for (int i = 0; i < byteArrays.length; i++) { str += byteToHexStr(byteArrays[i]); } return str; } /** * 將字節轉化爲十六進制字符串 * @param myByte 字節 * @return 字符串 */ private static String byteToHexStr(byte myByte) { char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] tampArr = new char[2]; tampArr[0] = Digit[(myByte >>> 4) & 0X0F]; tampArr[1] = Digit[myByte & 0X0F]; String str = new String(tampArr); return str; } }
先啓動ngrok,再啓動tomcat項目,將外網地址/index填入對應url,token按照剛纔定義的書寫,加密祕鑰隨機生成便可:
提交成功!!
固然,若是有本身的外網服務器,只須要將項目打包發佈到外網,url和token根據本身定義的來書寫,也沒有什麼問題。注意,必定要保證切換到開發者模式。
服務器配置成功以後,就能夠進行後續開發啦,下面會介紹如何訂閱回覆圖文消息。