package cn.iocoder.yudao.module.system.util.pay;

import java.io.ByteArrayInputStream;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Base64;

public class CertUtils {

    /**
     * 从 PEM 格式的证书字符串中提取证书序列号（微信支付格式：十六进制大写，无冒号）
     * @param certPem 证书 PEM 字符串，例如 "-----BEGIN CERTIFICATE-----\nMII...\n-----END CERTIFICATE-----"
     * @return 序列号（大写十六进制字符串）
     * @throws Exception 解析失败时抛出异常
     */
    public static String getMerchantSerialNumberFromPem(String certPem) throws Exception {
        // 1. 移除 PEM 头尾标记和所有空白字符（换行、空格等）
        String base64Cert = certPem
                .replace("-----BEGIN CERTIFICATE-----", "")
                .replace("-----END CERTIFICATE-----", "")
                .replaceAll("\\s", "");

        // 2. Base64 解码得到 DER 格式的字节数组
        byte[] derCert = Base64.getDecoder().decode(base64Cert);

        // 3. 使用 CertificateFactory 生成 X509Certificate 对象
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(derCert));

        // 4. 获取序列号（BigInteger），转换为十六进制字符串并转为大写
        String serialNumber = cert.getSerialNumber().toString(16).toUpperCase();

        return serialNumber;
    }
}
