JXNXSPayUtil.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package com.chuanghai.smartschool.tuitionpayment.utils;
  2. import org.springframework.boot.configurationprocessor.json.JSONObject;
  3. import org.springframework.util.StringUtils;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import java.security.MessageDigest;
  7. import java.util.Arrays;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import java.util.TreeMap;
  11. /**
  12. * 农商行支付工具类
  13. *
  14. * Description
  15. * Create 2017-03-07 14:01:23
  16. *
  17. * @author Benny.YEE
  18. */
  19. public class JXNXSPayUtil {
  20. public static String SHA1(String decript) {
  21. try {
  22. MessageDigest digest = MessageDigest.getInstance("SHA-1");
  23. digest.update(decript.getBytes("UTF-8"));
  24. byte[] messageDigest = digest.digest();
  25. StringBuilder hexString = new StringBuilder();
  26. for (byte message : messageDigest) {
  27. String shaHex = Integer.toHexString(message & 0xFF);
  28. if (shaHex.length() < 2)
  29. hexString.append(0);
  30. hexString.append(shaHex);
  31. }
  32. return hexString.toString();
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. return "";
  37. }
  38. /**
  39. * 签名
  40. *
  41. * @param data
  42. * @return
  43. */
  44. public static String sign(Map<String, String> data) {
  45. String sign = null;
  46. try {
  47. // A~z排序 (加上open_key)
  48. Set<String> keySet = data.keySet();
  49. String[] keyArray = keySet.toArray(new String[keySet.size()]);
  50. Arrays.sort(keyArray);
  51. StringBuilder sb = new StringBuilder();
  52. for (String k : keyArray) {
  53. if (k.equals("sign")) { // 删除sign节点
  54. continue;
  55. }
  56. sb.append(k).append("=").append(data.get(k).trim()).append("&");
  57. }
  58. String sbStr = sb.toString();
  59. String sortStr = sbStr.substring(0, sbStr.length() - 1);
  60. // sha1加密(小写)
  61. String sha1 = SHA1(sortStr).toLowerCase();
  62. // md5加密(小写)
  63. MessageDigest md5 = MessageDigest.getInstance("MD5");
  64. byte[] digest = md5.digest(sha1.getBytes("utf-8"));
  65. String resultString = byte2hex(digest);
  66. sign = resultString.toLowerCase();
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. }
  70. return sign;
  71. }
  72. /**
  73. * AES加密,再二进制转十六进制(bin2hex)
  74. * @param dataJsonStr 需要加密的字符串
  75. * @param key key
  76. * @throws Exception
  77. */
  78. public static String handleEncrypt(String dataJsonStr, String key) throws Exception {
  79. SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("ASCII"), "AES");
  80. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  81. cipher.init(1, skeySpec);
  82. byte[] encrypted = cipher.doFinal(dataJsonStr.getBytes("UTF-8"));
  83. return byte2hex(encrypted);
  84. }
  85. public static String decrypt(String sSrc, String sKey) throws Exception {
  86. SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes("ASCII"), "AES");
  87. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  88. cipher.init(2, skeySpec);
  89. byte[] encrypted1 = hex2byte(sSrc);
  90. byte[] original = cipher.doFinal(encrypted1);
  91. return new String(original, "UTF-8");
  92. }
  93. /**
  94. * 验签
  95. *
  96. * @param params
  97. * @param key 农商openKey
  98. * @return
  99. */
  100. public static Boolean verifySign(Map<String, String> params, String key) {
  101. String respSign = params.get("sign");
  102. if (StringUtils.hasText(respSign)) {
  103. params.put("open_key", key);
  104. String veriSign = sign(params);
  105. if (respSign.equals(veriSign)) {
  106. return true;
  107. }
  108. }
  109. return false;
  110. }
  111. /**
  112. * byte数组转十六进制字符串
  113. */
  114. public static String byte2hex(byte[] result) {
  115. StringBuffer sb = new StringBuffer(result.length * 2);
  116. for (int i = 0; i < result.length; i++) {
  117. int hight = ((result[i] >> 4) & 0x0f);
  118. int low = result[i] & 0x0f;
  119. sb.append(hight > 9 ? (char) ((hight - 10) + 'a') : (char) (hight + '0'));
  120. sb.append(low > 9 ? (char) ((low - 10) + 'a') : (char) (low + '0'));
  121. }
  122. return sb.toString();
  123. }
  124. /**
  125. * 十六进制字符串转byte数组
  126. */
  127. public static byte[] hex2byte(String strhex) {
  128. if (strhex == null)
  129. return null;
  130. int l = strhex.length();
  131. if (l % 2 == 1)
  132. return null;
  133. byte[] b = new byte[l / 2];
  134. for (int i = 0; i != l / 2; ++i)
  135. b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16);
  136. return b;
  137. }
  138. }