package com.chuanghai.smartschool.tuitionpayment.utils; import org.springframework.boot.configurationprocessor.json.JSONObject; import org.springframework.util.StringUtils; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * 农商行支付工具类 * * Description * Create 2017-03-07 14:01:23 * * @author Benny.YEE */ public class JXNXSPayUtil { public static String SHA1(String decript) { try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(decript.getBytes("UTF-8")); byte[] messageDigest = digest.digest(); StringBuilder hexString = new StringBuilder(); for (byte message : messageDigest) { String shaHex = Integer.toHexString(message & 0xFF); if (shaHex.length() < 2) hexString.append(0); hexString.append(shaHex); } return hexString.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } /** * 签名 * * @param data * @return */ public static String sign(Map data) { String sign = null; try { // A~z排序 (加上open_key) Set keySet = data.keySet(); String[] keyArray = keySet.toArray(new String[keySet.size()]); Arrays.sort(keyArray); StringBuilder sb = new StringBuilder(); for (String k : keyArray) { if (k.equals("sign")) { // 删除sign节点 continue; } sb.append(k).append("=").append(data.get(k).trim()).append("&"); } String sbStr = sb.toString(); String sortStr = sbStr.substring(0, sbStr.length() - 1); // sha1加密(小写) String sha1 = SHA1(sortStr).toLowerCase(); // md5加密(小写) MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] digest = md5.digest(sha1.getBytes("utf-8")); String resultString = byte2hex(digest); sign = resultString.toLowerCase(); } catch (Exception e) { e.printStackTrace(); } return sign; } /** * AES加密,再二进制转十六进制(bin2hex) * @param dataJsonStr 需要加密的字符串 * @param key key * @throws Exception */ public static String handleEncrypt(String dataJsonStr, String key) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("ASCII"), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(1, skeySpec); byte[] encrypted = cipher.doFinal(dataJsonStr.getBytes("UTF-8")); return byte2hex(encrypted); } public static String decrypt(String sSrc, String sKey) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes("ASCII"), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(2, skeySpec); byte[] encrypted1 = hex2byte(sSrc); byte[] original = cipher.doFinal(encrypted1); return new String(original, "UTF-8"); } /** * 验签 * * @param params * @param key 农商openKey * @return */ public static Boolean verifySign(Map params, String key) { String respSign = params.get("sign"); if (StringUtils.hasText(respSign)) { params.put("open_key", key); String veriSign = sign(params); if (respSign.equals(veriSign)) { return true; } } return false; } /** * byte数组转十六进制字符串 */ public static String byte2hex(byte[] result) { StringBuffer sb = new StringBuffer(result.length * 2); for (int i = 0; i < result.length; i++) { int hight = ((result[i] >> 4) & 0x0f); int low = result[i] & 0x0f; sb.append(hight > 9 ? (char) ((hight - 10) + 'a') : (char) (hight + '0')); sb.append(low > 9 ? (char) ((low - 10) + 'a') : (char) (low + '0')); } return sb.toString(); } /** * 十六进制字符串转byte数组 */ public static byte[] hex2byte(String strhex) { if (strhex == null) return null; int l = strhex.length(); if (l % 2 == 1) return null; byte[] b = new byte[l / 2]; for (int i = 0; i != l / 2; ++i) b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16); return b; } }