剛剛開始處理處理小程序消息推送的時候有點懵,處理完之后也是豁然開朗,所以貼上代碼給大家分享。說明一下,我用的是SpringBoot。
實現功能分別用了三個類:1、entity:WeChatMessage.java、2、controller:WeChatMessageController.java、3、service:WeCharMessageService.java
直接上代碼: 首先是entity
1 public class WeChatMessage { 2 3 //微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數 4 private String signature; 5 6 //時間戳 7 private String timestamp; 8 9 //隨機數 10 private String nonce; 11 12 //隨機字符串 13 private String echostr; 14 15 public String getSignature() { 16 return signature; 17 } 18 19 public void setSignature(String signature) { 20 this.signature = signature; 21 } 22 23 public String getTimestamp() { 24 return timestamp; 25 } 26 27 public void setTimestamp(String timestamp) { 28 this.timestamp = timestamp; 29 } 30 31 public String getNonce() { 32 return nonce; 33 } 34 35 public void setNonce(String nonce) { 36 this.nonce = nonce; 37 } 38 39 public String getEchostr() { 40 return echostr; 41 } 42 43 public void setEchostr(String echostr) { 44 this.echostr = echostr; 45 } 46 47 }
其次是controller
@RestController public class WeChatMessageController { @Autowired private WeChatMessageService service; @RequestMapping(value="/getMessage.do", method=RequestMethod.GET) public String getMessage(WeChatMessage message) { return service.checkSignature(message); } }
最后是service:
@Service public class WeChatMessageService { public String checkSignature(WeChatMessage message) { String signature = message.getSignature(); String timestamp = message.getTimestamp(); String nonce = message.getNonce(); String token = "XXXXXXX"; //必須與請求參數中的token一致 //將token、timestamp、nonce三個參數進行字典排序 String[] arr = new String[] {token, timestamp, nonce}; Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 將三個參數字符串拼接成一個字符串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) ? message.getEchostr() : "" : ""; } /** * 將字節數組轉換為十六進制字符串 * @param byteArray * @return */ private String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 將字節轉換為十六進制字符串 * @param mByte * @return */ private String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } }
以上代碼親測可用,有不好的地方請朋友們多多指正。