본문으로 건너뛰기

2- 2. 서명방법

서명(서명인증이 가능합니다)

서명 생성의 일반적인 단계는 다음과 같습니다.

MD5 암호화에는 utf-8 인코딩이 필요합니다

**첫 번째 단계는 전송 또는 수신된 모든 데이터를 세트 M으로 설정하고, 세트 M의 null이 아닌 매개변수 값을 매개변수 이름의 ASCII 코드(사전식 순서)에 따라 작은 것부터 큰 것까지 정렬한 다음 URL 키-값 쌍 형식(예: key1=value1&key2=value2...)을 사용하여 문자열 stringA로 연결하는 것입니다. **

**두 번째 단계는 stringA의 최종 접합에 비밀을 적용하여 stringSignTemp 문자열을 얻고, stringSignTemp에 대해 MD5 작업을 수행하여 부호 값 signValue를 얻는 것입니다. **

서명 문자열 예: key=08SaKUwNafSOc8w7&localOrderId=2023102400684344447&localUserId=302199873005&notifyUrl=http://127.0.0.1:8080/call-back/demo/notify&secret=uRdLM5BeMobQ4SePrwqZd35lNXyXJUHh

3단계, MD5 암호화: MD5(서명할 문자열)

서명 서명 받기: 6416c9f6eb37c8a901904026c769bec0(소문자)

----java签名代码工具

private static String getListString(List<Map<String, Object>> list) {
List<String> l = new ArrayList<>();
list.forEach(item -> {
l.add(getString(item));
});
String arrStr = String.join(",", l);
return "[" + arrStr + "]";
}

private static String getListConstable(List<?> list) {
List<String> l = new ArrayList<>();
list.forEach(item -> {
l.add( String.valueOf(item) );
});
String arrStr = String.join(",", l);
return "[" + arrStr + "]";
}

public static String getString(Map<String, Object> p) {
List<String> query = new ArrayList<>();
p.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach((v) -> {
String s;
Object value = v.getValue();
if( value == null ) return ;
if (value instanceof List<?>) {
List<?> list = (List<?>) value;
if (list.isEmpty()) return;
if(list instanceof Map<?,?>){
s = getListString((List<Map<String, Object>>) list);
}else{ s = getListConstable(list);}
}else if (value instanceof Map){
s = "{" + getString( (Map<String, Object>) value ) + "}";
}else if (value instanceof Double) {
Double doubleValue = (Double) value;
s = new BigDecimal(String.valueOf(doubleValue)).stripTrailingZeros().toPlainString();
} else if (value instanceof Float) {
Float floatValue = (Float) value;
s = new BigDecimal(String.valueOf(floatValue)).stripTrailingZeros().toPlainString();
} else if (value instanceof BigDecimal) {
BigDecimal bigDecimalValue = (BigDecimal) value;
s = bigDecimalValue.stripTrailingZeros().toPlainString();
} else {
s = value.toString();
}

query.add(v.getKey() + "=" + s);
});
return String.join("&", query);
}

public static String getSignStr(Map<String, Object> p, String secret){
return getString(p) + "&secret=" + secret;
}

public static String getSign(Map<String, Object> p, String secret) {
if (p.isEmpty()) return "";
String originalSign = getSignStr(p, secret);
log.info("待签名字符串 {}", originalSign);
return DigestUtils.md5DigestAsHex(originalSign.getBytes());
}