diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/CusWxController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/CusWxController.java index 215537b6e..20ba4ec37 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/CusWxController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/CusWxController.java @@ -1,21 +1,23 @@ package com.stdiet.web.controller.custom; import com.stdiet.common.core.controller.BaseController; -import com.stdiet.custom.domain.WxPush; -import org.springframework.web.bind.annotation.*; +import com.stdiet.custom.service.ISysWxService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/wx") public class CusWxController extends BaseController { - @GetMapping("/") - public boolean wxCheckAuth() { - return true; + @Autowired + public ISysWxService sysWxService; + + @GetMapping("/checkSign") + public boolean wxCheckAuth(@PathVariable String signature, @PathVariable String timestamp, @PathVariable String nonce) { + return sysWxService.wxCheckAuth(signature, timestamp, nonce); } -// -// @PostMapping("/push") -// public void msgPush(@RequestBody WxPush pushMsg) { -// -// } } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWxService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWxService.java new file mode 100644 index 000000000..f705ff49a --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWxService.java @@ -0,0 +1,13 @@ +package com.stdiet.custom.service; + +public interface ISysWxService { + /** + * 微信token验证 + * + * @param signature + * @param timestamp + * @param nonce + * @return + */ + public boolean wxCheckAuth(String signature, String timestamp, String nonce); +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxServiceImpl.java new file mode 100644 index 000000000..69fd55559 --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxServiceImpl.java @@ -0,0 +1,16 @@ +package com.stdiet.custom.service.impl; + +import com.stdiet.custom.service.ISysWxService; +import com.stdiet.custom.utils.WxTokenUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class SysWxServiceImpl implements ISysWxService { + + @Override + public boolean wxCheckAuth(String signature, String timestamp, String nonce) { + return WxTokenUtils.checkSignature(signature, timestamp, nonce); + } +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/utils/WxTokenUtils.java b/stdiet-custom/src/main/java/com/stdiet/custom/utils/WxTokenUtils.java new file mode 100644 index 000000000..d4af293c7 --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/utils/WxTokenUtils.java @@ -0,0 +1,84 @@ +package com.stdiet.custom.utils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class WxTokenUtils { + + // 与接口配置信息中的Token要一致 + private static String token = "shengtangdiet"; + + /** + * 验证签名 + * + * @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; + } + } + } + } +}