Files
jsowell-charger-web/jsowell-common/src/main/java/com/jsowell/common/util/AdapayUtil.java

121 lines
3.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.jsowell.common.util;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
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;
import java.text.DecimalFormat;
import java.util.Base64;
/**
* 汇付支付的工具类
*/
@Slf4j
public class AdapayUtil {
/**
* 格式化数字 保留两位小数不足补0
* @param amount
* @return
*/
public static String formatAmount(String amount) {
return formatAmount(new BigDecimal(amount));
}
/**
* 格式化数字 保留两位小数不足补0
* @param amount
* @return
*/
public static String formatAmount(BigDecimal amount) {
return formatAmount(amount, 2);
}
/**
* 格式化数字 保留n位小数不足补0
* @param amount
* @return
*/
public static String formatAmount(BigDecimal amount, int n) {
//保留n位小数 没有四舍五入
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));
}
/**
* 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);
signature.update(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(signature.sign());
} catch (Exception e) {
log.error("sign Exception", e);
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);
signature.update(data.getBytes(StandardCharsets.UTF_8));
return signature.verify(Base64.getDecoder().decode(sign));
} catch (Exception e) {
log.error("verify Exception", e);
return false;
}
}
}