mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-22 03:55:17 +08:00
107 lines
3.0 KiB
Java
107 lines
3.0 KiB
Java
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;
|
||
}
|
||
}
|
||
|
||
}
|