package com.oying.modules.hwc.utils; import com.oying.exception.BadRequestException; import com.oying.modules.security.config.SwiftPassProperties; import com.oying.utils.enums.PayTypeEnum; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import java.nio.charset.StandardCharsets; import java.util.Map; /** * @author zeming.fan@swiftpass.cn */ @Slf4j public class SignUtil { /** * 请求时根据不同签名方式去生成不同的sign */ public static String getSign(String signType, String preStr, SwiftPassProperties properties, PayTypeEnum status) { if ("RSA_1_256".equals(signType)) { try { return SignUtil.sign(preStr, "RSA_1_256", properties.getMchPrivateKey()); } catch (Exception e1) { log.error(e1.getMessage(), e1); throw new BadRequestException(e1.getMessage()); } } else { switch (status) { case HWC: return MD5.sign(preStr, "&key=" + properties.getKey(), "utf-8"); case HWC2: return MD5.sign(preStr, "&key=" + properties.getKey2(), "utf-8"); } throw new BadRequestException("汇旺财类型错误"); } } /** * 对返回参数的验证签名 */ public static boolean verifySign(String sign, String signType, Map resultMap, SwiftPassProperties properties, PayTypeEnum status) throws Exception { if ("RSA_1_256".equals(signType)) { Map params = SignUtils.paraFilter(resultMap); StringBuilder builder = new StringBuilder((params.size() + 1) * 10); SignUtils.buildPayParams(builder, params, false); String preStr = builder.toString(); return !SignUtil.verifySign(preStr, sign, "RSA_1_256", properties.getPlatPublicKey()); } else if ("MD5".equals(signType)) { switch (status) { case HWC: return !SignUtils.checkParam(resultMap, properties.getKey()); case HWC2: return !SignUtils.checkParam(resultMap, properties.getKey2()); } throw new BadRequestException("汇旺财类型错误"); } return true; } /** * RSA_1_256 验证签名 */ public static boolean verifySign(String preStr, String sign, String signType, String platPublicKey) throws Exception { // 调用这个函数前需要先判断是MD5还是RSA // 商户的验签函数要同时支持MD5和RSA RSAUtil.SignatureSuite suite; if ("RSA_1_1".equals(signType)) { suite = RSAUtil.SignatureSuite.SHA1; } else if ("RSA_1_256".equals(signType)) { suite = RSAUtil.SignatureSuite.SHA256; } else { throw new Exception("不支持的签名方式"); } return RSAUtil.verifySign(suite, preStr.getBytes(StandardCharsets.UTF_8), Base64.decodeBase64(sign.getBytes(StandardCharsets.UTF_8)), platPublicKey); } /** * RSA_1_256生成不同的sign */ public static String sign(String preStr, String signType, String mchPrivateKey) throws Exception { RSAUtil.SignatureSuite suite; if ("RSA_1_1".equals(signType)) { suite = RSAUtil.SignatureSuite.SHA1; } else if ("RSA_1_256".equals(signType)) { suite = RSAUtil.SignatureSuite.SHA256; } else { throw new Exception("不支持的签名方式"); } byte[] signBuf = RSAUtil.sign(suite, preStr.getBytes(StandardCharsets.UTF_8), mchPrivateKey); return new String(Base64.encodeBase64(signBuf), StandardCharsets.UTF_8); } }