微信公众号开发: 微信接入(一)
下面列举接入代码:
/** * @author lishupeng * @Description * @Date 2017/12/14 14:04 * * 微信接入对象 * */ @Data public class WxCheckDto implements Serializable{ private static final long serialVersionUID = -548862843699476264L; String signature ; //微信加密签名 String timestamp ; //时间戳 String nonce ; //随机数 String echostr ; //随机字符串 }
/** * @author lishupeng * @Description * @Date 2017/12/14 13:46 */ public class CheckoutUtil { // 与接口配置信息中的Token要一致 private static String token = "xxxxxxxxxxxx"; /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[]{token, timestamp, nonce}; // 将token、timestamp、nonce三个参数进行字典序排序 // Arrays.sort(arr); 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(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static 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; } public static void sort(String a[]) { for (int i = 0; i < a.length - 1; i++) { for (int j = i + 1; j < a.length; j++) { if (a[j].compareTo(a[i]) < 0) { String temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } }
/** * 微信接入 * * * @return * @throws Exception */ @GetMapping("/weixinTest") @ResponseBody public String weixinTest(WxCheckDto dto) throws Exception{ log.info("开始签名校验:"+ JSON.toJSONString(dto)); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (dto.getSignature() != null && CheckoutUtil.checkSignature(dto.getSignature(), dto.getTimestamp(), dto.getNonce())) { log.info("签名校验通过"); return dto.getEchostr() ; } return ""; }