Algoritmo de firma
En los request de operaciones existe un campo que es "sing", este campo es uno de los requisitos de seguridad para validar la identidad del comercio y el origen del request, y tomara el valor de lo generado por los siguientes pasos.
Pasos para la generación de firma
Listar todos los campos del Request.
Se deben organizar de forma alfabetica todos los campos.
Concatenar los campo y los valores asignados utilizando signo de igual "=" para separar el nombre del campo del valor, y para separar lo campos con sus valores utilizar el signo de amperson "&".
campoA=valorA&campoB=valorB
Se debe agregar el campo de key y el valor correspondiente a la llave del comercio para la API, en este ejemplo es "11111111111111111111111111111111".
campoA=valorA&campoB=valorB&key=11111111111111111111111111111111
A toda esta cadena de texto se debe aplicar una operacion de generación de hash MD5 para obtener el valor del campo sign se debe agregar al request de la operación a realizar.
Ejemplo
Por ejemplo, los parámetros de la solicitud son los siguientes:
{
"countryId": "COL",
"currency": "COP",
"customerAccount": "3720000264",
"merId": "8301000002750275",
"merOrderNo": "merOrderNo",
"nonceStr": "string",
"orderAmount": "30000",
"payProduct": "08",
"nonceStr": "4cKcL83FIsDgjAi"
}
Según las reglas, se concatena para obtener la cadena a firmar:
countryId=COL¤cy=COP&customerAccount=3720000264&merId=8301000002750275&merOrderNo=merOrderNo&nonceStr=4cKcL83FIsDgjAi&orderAmount=30000&payProduct=08&key=11111111111111111111111111111111
Resultado final de la firma:
1DD2448C750D92B3AE512F2E493F5665
Parámetros finales del request:
{
"countryId": "COL",
"currency": "COP",
"customerAccount": "3720000264",
"merId": "8301000002750275",
"merOrderNo": "merOrderNo",
"nonceStr": "string",
"orderAmount": "30000",
"payProduct": "08",
"nonceStr": "4cKcL83FIsDgjAi",
"sign": "1DD2448C750D92B3AE512F2E493F5665"
}
Uso del SDK de firma
Para descargar el SDK, consulte “Recursos del diccionario > Descargas” - “SDK de firma”.
Incorpore el archivo JAR “supefina-sign” en su proyecto.
Completa la operación de firma mediante el método com.supefina.sign.SupefinaSignUtils#sign(java.lang.Object, java.lang.String) (parámetro 1: objeto JSON de parámetros de solicitud; parámetro 2: clave del comerciante).
Demo de firma
java
public static String sign(Object data, String key) {
return sign(JSON.parseObject(JSONObject.toJSONString(data)), key);
}
public static String sign(Map<String, Object> data, String key) {
data.remove("sign");
String signedValue = getSignedValue(data);
signedValue += "key=" + key;
log.info("signedValue:{}", signedValue);
return md5(signedValue, "UTF-8").toUpperCase();
}
private static String getSignedValue(Map<String, Object> reqMap) {
Map<String, String> copy = new TreeMap<>();
reqMap.forEach((k, v) -> {
if (v != null && !"".equals(v)) {
copy.put(k, v.toString());
}
});
StringBuilder sb = new StringBuilder();
copy.forEach((k, v) -> {
if (v != null) {
sb.append(k).append("=").append(v).append("&");
}
});
return sb.toString();
}
Demo de verificación de firma
String callbackData = "{\n" + " \"countryId\": \"COL\",\n" + " \"currency\": \"COP\",\n"
+ " \"customerAccount\": \"3720000264\",\n" + " \"merId\": \"8301000002750275\",\n"
+ " \"merOrderNo\": \"merOrderNo\",\n" + " \"nonceStr\": \"string\",\n"
+ " \"orderAmount\": \"30000\",\n" + " \"payProduct\": \"08\",\n"
+ " \"nonceStr\": \"4cKcL83FIsDgjAi\",\n" + " \"sign\": \"1DD2448C750D92B3AE512F2E493F5665\"\n" + "}";
JSONObject data = JSON.parseObject(callbackData);
String sign = data.get("sign").toString();
data.remove("sign");
String signValue = SupefinaSignUtils.sign(data, "merchant key");
if (Objects.equals(sign, signValue)) {
// Verificación de firma aprobada
} else {
// Fallo
}
Última actualización