公共類java
package com.bdqn.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class SignUtil { private final static String TOKEN= "填寫在公衆號設置的token"; /** * 校驗簽名 * @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; } }
註釋的地方爲servlet開發方式,解開後參數修改成HttpServletRequest和HttpServletResponsegit
import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; @RestController public class TokenController { @RequestMapping("checkToken") public String token(String signature,String timestamp,String nonce,String echostr)throws IOException { //token驗證代碼段 try{ System.out.println("請求已到達,開始校驗token"); if (StringUtils.isNotBlank(signature)) { /* String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr");*/ // System.out.println("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr); if (SignUtil.checkSignature(signature, timestamp, nonce)) { // System.out.println("數據源爲微信後臺,將echostr[{}]返回!", echostr); // response.getOutputStream().println(echostr); return echostr; } } }catch (Exception e){ System.out.println("校驗出錯"); e.printStackTrace(); } return null; } }