package com.talentcard.server.business.payment.huifu;
|
|
import java.nio.charset.StandardCharsets;
|
import java.security.KeyFactory;
|
import java.security.PublicKey;
|
import java.security.Signature;
|
import java.security.spec.X509EncodedKeySpec;
|
import java.util.Base64;
|
|
import org.springframework.stereotype.Service;
|
|
@Service
|
public class HuifuSignatureService {
|
|
private final HuifuPaymentProperties properties;
|
|
public HuifuSignatureService(HuifuPaymentProperties properties) {
|
this.properties = properties;
|
}
|
|
public boolean verifyCallbackPayload(String payload, String signatureText) {
|
if (payload == null || payload.isBlank() || signatureText == null || signatureText.isBlank()) return false;
|
String publicKeyText = compact(properties.getPlatformPublicKey());
|
if (publicKeyText.isBlank()) return false;
|
try {
|
PublicKey publicKey = KeyFactory.getInstance("RSA")
|
.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyText)));
|
Signature signature = Signature.getInstance("SHA256WithRSA");
|
signature.initVerify(publicKey);
|
signature.update(payload.getBytes(StandardCharsets.UTF_8));
|
return signature.verify(Base64.getDecoder().decode(signatureText));
|
} catch (Exception ignored) {
|
return false;
|
}
|
}
|
|
private String compact(String value) {
|
if (value == null) return "";
|
return value.replace("-----BEGIN PUBLIC KEY-----", "")
|
.replace("-----END PUBLIC KEY-----", "")
|
.replaceAll("\\s", "");
|
}
|
}
|