Files
jsowell-charger-web/jsowell-common/src/main/java/com/jsowell/common/util/AdapayUtil.java
2023-07-05 14:14:44 +08:00

107 lines
3.0 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.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 {
public static void main(String[] args) {
String amount = "1110.5309";
String s = formatAmount(amount);
System.out.println(s);
BigDecimal bigDecimal = new BigDecimal(amount);
String s2 = formatAmount(bigDecimal);
System.out.println(s2);
}
/**
* 格式化数字 保留两位小数不足补0
* @param amount
* @return
*/
public static String formatAmount(String amount) {
//保留2位小数
double d = new BigDecimal(amount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//不足两位则补0
DecimalFormat decimalFormat = new DecimalFormat("0.00#");
return decimalFormat.format(d);
}
/**
* 格式化数字 保留两位小数不足补0
* @param amount
* @return
*/
public static String formatAmount(BigDecimal amount) {
return formatAmount(amount.toString());
}
/**
* 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;
}
}
}