RcbSignatureUtils.java 2.07 KB
package com.diligrp.cashier.pipeline.util;

import com.diligrp.cashier.shared.security.HexUtils;
import com.diligrp.cashier.shared.util.ObjectUtils;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

/**
 * 安徽农商行的聚合支付文档中并未提到验签功能
 */
public final class RcbSignatureUtils {
    public static String sign(Map<String, String> params, String key) {
        String data = map2String(params).concat("&key=").concat(key);
        MessageDigest md5;
        try {
            md5 = MessageDigest.getInstance("MD5");
            md5.update(data.getBytes(StandardCharsets.UTF_8));
            return HexUtils.encodeHexStr(md5.digest(), false);
        } catch (NoSuchAlgorithmException ex) {
            // Never happened
            throw new RuntimeException(ex);
        }
    }

    public static boolean verify(Map<String, String> params, String key, String signature) {
        String data = sign(params, key);
        return data.equals(signature);
    }

    public static boolean verify(String params, String key, String signature) {
        String data = params.concat("&key=").concat(key);
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            md5.update(data.getBytes(StandardCharsets.UTF_8));
            String toBeSigned = HexUtils.encodeHexStr(md5.digest(), false);
            return toBeSigned.equals(signature);
        } catch (NoSuchAlgorithmException ex) {
            // Never happened
            throw new RuntimeException(ex);
        }

    }

    public static String map2String(Map<String, String> params) {
        TreeMap<String, String> data = new TreeMap<>(Comparator.naturalOrder());
        data.putAll(params);
        return data.entrySet().stream().filter(e -> ObjectUtils.isNotEmpty(e.getValue()))
            .map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&", "", ""));
    }
}