接入微信公衆平臺開發,開發者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據接口文檔實現業務邏輯
第一步:填寫服務器配置
登錄微信公衆平臺官網後,在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰,推薦使用兼容模式。
第二步:驗證消息的確來自微信服務器
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。
/**
* 處理微信服務器發來的get請求,進行簽名的驗證
* <p>
* signature 微信端發來的簽名
* timestamp 微信端發來的時間戳
* nonce 微信端發來的隨機字符串
* echostr 微信端發來的驗證字符串
*/
@GetMapping(value = "wechat")
public void validate(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");
IOUtils.write(SignatureUtil.checkSignature(signature, wechatAccountConfig.getToken(), timestamp, nonce) ? echostr : null, response.getOutputStream());
}
/**
* 此處是處理微信服務器的消息轉發的
*/
@PostMapping(value = "wechat")
public void processMsg(HttpServletRequest request, HttpServletResponse response) throws Exception {
//調用核心服務類接收處理請求
defaultMsgDispose(request.getInputStream(), response.getOutputStream());
}
加密/校驗流程如下:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
/**
* SHA1加密 驗證簽名
*
* @param signature 微信簽名
* @param params token,timestamp,nonce
* @return 是否符合
*/
public static boolean checkSignature(String signature, String... params) {
Arrays.sort(params);
String str = StringUtils.join(params);
String sign = DigestUtils.sha1Hex(str);
return Objects.equals(signature, sign);
}
第三步:依據接口文檔實現業務邏輯
驗證URL有效性成功後即接入生效,成爲開發者。你可以在公衆平臺網站中申請微信認證,認證成功後,將獲得更多接口權限,滿足更多業務需求。
我沒做過相關開發,只是根本自己理解寫的邏輯
具體源碼:https://github.com/philjing/my_wechat/blob/master/src/main/java/com/phil/wechat/CoreController.java