WareSysSignUtils.java 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.kmall.admin.haikong.utils;
  2. import cn.hutool.core.map.MapUtil;
  3. import org.apache.commons.lang.StringUtils;
  4. import java.io.UnsupportedEncodingException;
  5. import java.math.BigDecimal;
  6. import java.nio.charset.StandardCharsets;
  7. import java.security.MessageDigest;
  8. import java.util.Arrays;
  9. import java.util.Map;
  10. /**
  11. * 仓库系统签名工具类
  12. * @author lhm
  13. * @createDate 2021-11-01
  14. */
  15. public class WareSysSignUtils {
  16. private WareSysSignUtils() {}
  17. private static Map<String, String> formatUrl(String url) {
  18. Map<String, String> map = MapUtil.newHashMap();
  19. if (org.springframework.util.StringUtils.isEmpty(url)) {
  20. return map;
  21. }
  22. int i = url.lastIndexOf("?");
  23. String paramStr = url.substring(i+1);
  24. String[] strings = paramStr.split("&");
  25. for (String string : strings) {
  26. int j = string.indexOf("=");
  27. String key = string.substring(0, j);
  28. if (!"sign".equalsIgnoreCase(key)) {
  29. String value = string.substring(j + 1);
  30. map.put(key, value);
  31. }
  32. }
  33. return map;
  34. }
  35. public static String getSignRequest(String url, String body, String secretKey) throws Exception {
  36. String sign = signRequest(formatUrl(url), body, secretKey);
  37. return url + "&sign=" + sign;
  38. }
  39. public static String signRequest(Map<String,String> params, String body, String secretKey) throws Exception {
  40. // 1. 第一步,确保参数已经排序
  41. String[] keys = params.keySet().toArray(new String[0]);
  42. Arrays.sort(keys);
  43. // 2. 第二步,把所有参数名和参数值拼接在一起(包含body体)
  44. String joinedParams = joinRequestParams(params, body, secretKey, keys);
  45. // 3. 第三步,使用加密算法进行加密(目前仅支持md5算法)
  46. byte[] abstractMesaage = digest(joinedParams);
  47. // 4. 把二进制转换成大写的十六进制
  48. return byte2Hex(abstractMesaage);
  49. }
  50. private static String byte2Hex(byte[] bytes) {
  51. char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  52. int j = bytes.length;
  53. char[] str = new char[j * 2];
  54. int k = 0;
  55. for (byte byte0 : bytes) {
  56. str[k++] = hexDigits[byte0 >>> 4 & 0xf];
  57. str[k++] = hexDigits[byte0 & 0xf];
  58. }
  59. return new String(str);
  60. }
  61. private static byte[] digest(String message) throws Exception {
  62. MessageDigest md5Instance = MessageDigest.getInstance("MD5");
  63. md5Instance.update(message.getBytes(StandardCharsets.UTF_8));
  64. return md5Instance.digest();
  65. }
  66. private static String joinRequestParams(Map<String, String> params, String body, String secretKey, String[] sortedKes) {
  67. StringBuilder sb = new StringBuilder(secretKey); // 前面加上secretKey
  68. for (String key : sortedKes) {
  69. if ("sign".equals(key)) {
  70. continue; // 签名时不计算sign本身
  71. } else {
  72. String value = params.get(key);
  73. if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(value)) {
  74. sb.append(key).append(value);
  75. }
  76. }
  77. }
  78. // 拼接body体
  79. sb.append(body);
  80. // 最后加上secretKey
  81. sb.append(secretKey);
  82. return sb.toString();
  83. }
  84. }