2023-05-16 16:24:26 +08:00
|
|
|
|
package com.jsowell.common.util;
|
|
|
|
|
|
|
2023-07-05 14:10:05 +08:00
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
2023-05-16 16:24:26 +08:00
|
|
|
|
import java.math.BigDecimal;
|
2024-01-26 10:55:40 +08:00
|
|
|
|
import java.math.RoundingMode;
|
2023-07-05 14:13:50 +08:00
|
|
|
|
import java.nio.charset.StandardCharsets;
|
2023-07-05 14:10:05 +08:00
|
|
|
|
import java.security.KeyFactory;
|
|
|
|
|
|
import java.security.PrivateKey;
|
|
|
|
|
|
import java.security.PublicKey;
|
|
|
|
|
|
import java.security.Signature;
|
|
|
|
|
|
import java.security.spec.PKCS8EncodedKeySpec;
|
|
|
|
|
|
import java.security.spec.X509EncodedKeySpec;
|
2023-05-16 16:24:26 +08:00
|
|
|
|
import java.text.DecimalFormat;
|
2023-07-05 14:10:05 +08:00
|
|
|
|
import java.util.Base64;
|
2023-05-16 16:24:26 +08:00
|
|
|
|
|
2023-05-16 16:31:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 汇付支付的工具类
|
|
|
|
|
|
*/
|
2023-07-05 14:10:05 +08:00
|
|
|
|
@Slf4j
|
2023-05-16 16:24:26 +08:00
|
|
|
|
public class AdapayUtil {
|
2023-05-16 16:31:23 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 格式化数字 保留两位小数,不足补0
|
|
|
|
|
|
* @param amount
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-16 16:24:26 +08:00
|
|
|
|
public static String formatAmount(String amount) {
|
2024-01-26 10:55:40 +08:00
|
|
|
|
return formatAmount(new BigDecimal(amount));
|
2023-05-16 16:24:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-16 16:31:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 格式化数字 保留两位小数,不足补0
|
2024-11-29 17:45:34 +08:00
|
|
|
|
* @param amount 单位:元
|
2023-05-16 16:31:23 +08:00
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-16 16:24:26 +08:00
|
|
|
|
public static String formatAmount(BigDecimal amount) {
|
2024-01-26 10:55:40 +08:00
|
|
|
|
return formatAmount(amount, 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 格式化数字 保留n位小数,不足补0
|
|
|
|
|
|
* @param amount
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String formatAmount(BigDecimal amount, int n) {
|
2024-01-26 10:58:58 +08:00
|
|
|
|
//保留n位小数 没有四舍五入
|
2024-01-26 10:55:40 +08:00
|
|
|
|
double d = amount.setScale(n, RoundingMode.DOWN).doubleValue();
|
|
|
|
|
|
//不足则补0
|
|
|
|
|
|
StringBuilder pattern = new StringBuilder("0");
|
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
|
if (i == 0) {
|
|
|
|
|
|
pattern.append(".");
|
|
|
|
|
|
}
|
|
|
|
|
|
pattern.append("0");
|
|
|
|
|
|
}
|
|
|
|
|
|
DecimalFormat decimalFormat = new DecimalFormat(pattern.toString());
|
|
|
|
|
|
return decimalFormat.format(d);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
|
BigDecimal bigDecimal = new BigDecimal("1236.8369");
|
|
|
|
|
|
System.out.println(formatAmount(bigDecimal, 0));
|
|
|
|
|
|
System.out.println(formatAmount(bigDecimal, 2));
|
|
|
|
|
|
System.out.println(formatAmount(bigDecimal, 4));
|
2023-05-16 16:24:26 +08:00
|
|
|
|
}
|
2023-07-05 14:10:05 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* RSA私钥签名:签名方式SHA256WithRSA
|
|
|
|
|
|
* @param data 待签名字符串
|
|
|
|
|
|
* @param privateKeyBase64 私钥(Base64编码)
|
|
|
|
|
|
* @return 签名byte[]
|
|
|
|
|
|
* @throws Exception
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String sign(String data, String privateKeyBase64) {
|
|
|
|
|
|
// Base64 --> Key
|
|
|
|
|
|
try {
|
|
|
|
|
|
byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
|
|
|
|
|
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
|
|
|
|
|
|
KeyFactory keyFactory;
|
|
|
|
|
|
keyFactory = KeyFactory.getInstance("RSA");
|
|
|
|
|
|
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
|
|
|
|
|
|
// Sign
|
|
|
|
|
|
Signature signature = Signature.getInstance("SHA256WithRSA");
|
|
|
|
|
|
signature.initSign(privateKey);
|
2023-07-05 14:13:50 +08:00
|
|
|
|
signature.update(data.getBytes(StandardCharsets.UTF_8));
|
2023-07-05 14:10:05 +08:00
|
|
|
|
return Base64.getEncoder().encodeToString(signature.sign());
|
|
|
|
|
|
} catch (Exception e) {
|
2023-07-05 14:14:44 +08:00
|
|
|
|
log.error("sign Exception", e);
|
2023-07-05 14:10:05 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 使用汇付RSA公钥验签
|
|
|
|
|
|
* @param data 待签名字符串
|
|
|
|
|
|
* @param publicKeyBase64 公钥(Base64编码)
|
|
|
|
|
|
* @return 验签结果
|
|
|
|
|
|
* @throws Exception
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static boolean verify(String data, String publicKeyBase64, String sign) {
|
|
|
|
|
|
// Base64 --> Key
|
|
|
|
|
|
try {
|
|
|
|
|
|
byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
|
|
|
|
|
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
|
|
|
|
|
|
KeyFactory keyFactory;
|
|
|
|
|
|
keyFactory = KeyFactory.getInstance("RSA");
|
|
|
|
|
|
PublicKey publicKey = keyFactory.generatePublic(keySpec);
|
|
|
|
|
|
// verify
|
|
|
|
|
|
Signature signature = Signature.getInstance("SHA256WithRSA");
|
|
|
|
|
|
signature.initVerify(publicKey);
|
2023-07-05 14:13:50 +08:00
|
|
|
|
signature.update(data.getBytes(StandardCharsets.UTF_8));
|
2023-07-05 14:10:05 +08:00
|
|
|
|
return signature.verify(Base64.getDecoder().decode(sign));
|
|
|
|
|
|
} catch (Exception e) {
|
2023-07-05 14:14:44 +08:00
|
|
|
|
log.error("verify Exception", e);
|
2023-07-05 14:10:05 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-16 16:24:26 +08:00
|
|
|
|
}
|