咳咳,間隔了這麼久,如今終於有時間繼續了。廢話很少說,接上篇微信公衆號開發引言。java
說明:博主使用的開發工具爲IntelliJ IDEA,開發語言爲JAVA。 環境搭建部分就不在這裏多說什麼了。使用IDEA建立一個SpringBoot項目,以後咱們就進入開發階段吧~
1.修改公衆號的服務器配置
URL處填寫能從公網訪問到你本機的一個地址,博主在這裏選用的是花生殼內網穿透版,可是因爲最近實名認證,博主尚未來得及認證[由於博主的花生殼是14年就購置的,很久不用了。在最近才知道要認證]。具體使用方式,博主過些日子認證一下在介紹吧。反正很容易的~web
Token處填寫的是自定義字符串,不過要注意!!!此處填寫的Token必定要和程序中所設置的同樣!此處博主寫的是「DeveloperHome」。 而後不要點提交~由於此時提交是確定會說Token驗證失敗的~~接下來請看:
2.驗證消息來自微信服務器spring
首先,從官網的文檔中能夠看到,驗證大約分爲三個步驟。服務器
若能確認此GET請求來自微信服務器,則原樣返回echor參數內容。
步驟知道了,如今就開始擼代碼吧。微信
在項目中添加一個類ValidateWeChatapp
ValidateWeChat.java代碼工具
package org.yyx.study.wechat.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.yyx.study.config.WeChatConfig; import javax.annotation.Resource; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 驗證工具類 * Created by 葉雲軒 on 2017/6/20-11:50 * Concat ycountjavaxuan@outlook.com */ @Component public class ValidateWeChat { private Logger logger = LoggerFactory.getLogger(ValidateWeChat.class); /** * 1)將token、timestamp、nonce三個參數進行字典序排序 * 2)將三個參數字符串拼接成一個字符串進行sha1加密 * 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信 */ @Resource private WeChatConfig weChatConfig; /** * 對參數進行排序與加密 * * @param timestamp 時間戳 * @param nonce 隨機字符串 */ private String sortParams(String timestamp, String nonce) { logger.info("排序...."); String[] array = new String[]{weChatConfig.getDeafultAccessToken(), timestamp, nonce}; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0, length = array.length; i < length; i++) { sb.append(array[i]); } String sortString = sb.toString(); try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(sortString.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } logger.info("排序完成..."); return hexstr.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } public boolean validate(String signature, String timestamp, String nonce) { String s = sortParams(timestamp, nonce); return signature.equals(s); } }
以後呢,在controller包中建立一個類,用於驗證消息.
AccessEntrance.java代碼開發工具
package org.yyx.study.wechat.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.yyx.study.wechat.util.ValidateWeChat; import javax.annotation.Resource; /** * 接入微信服務器入口 * Created by 葉雲軒 on 2017/6/20-10:59 * Concat ycountjavaxuan@outlook.com */ @RestController public class AccessEntrance { private Logger logger = LoggerFactory.getLogger(AccessEntrance.class); /** * 驗證工具類 */ @Resource private ValidateWeChat validateWeChat; /** * 驗證消息來自微信服務器方法 * * @param signature 微信加密簽名 * @param timestamp 時間戳 * @param nonce 隨機數 * @param echostr 隨機字符串 * @return 驗證結果 */ @GetMapping("/") public String accessGet(@RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce, @RequestParam String echostr) { logger.info("method invoke..."); logger.info("參數[signature]={},[timestamp]={},[nonce]={},[echostr]={}", signature, timestamp, nonce, echostr); boolean validate = validateWeChat.validate(signature, timestamp, nonce); if (validate) { logger.info("驗證成功..."); return echostr; } logger.info("驗證失敗..."); return "wrong"; } } 在AccessEntrance類中,有一個accessGet方法用於接收從微信服務器轉發的GET請求,其中有四個必填參數,符合微信公衆號開發文檔的要求。如今啓動咱們的項目。 此時,咱們回到微信公衆號的服務器配置界面,點擊提交按鈕,則會在頁面上方彈出提交成功的字樣,以下圖:
而咱們的開發服務器則會輸出以下圖所示的日誌信息:
至此,微信公衆號接入三方服務器成功。加密
項目包結構見下圖: