Visión general #
Verifique los eventos que Wooshpay envía a sus puntos finales de webhook.
Encabezado de la firma Wooshpay #
En Wooshpay-Firma
incluido en cada evento firmado contiene una marca de tiempo y una firma.
El prefijo de la marca de tiempo es t=
y cada firma lleva como prefijo v1
.
Por ejemplo:
Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4
Clave secreta del webhook #
Wooshpay genera un único clave secreta para cada webhook. whsec_
Antes de verificar las firmas, debe recuperar el secreto de su webhook de webhook.secreto
en el objeto webhook.
Verificación de firmas #
Comparando el firma en la cabecera a la firma esperadaPuede verificar que los pares fueron enviados por Wooshpay y no por un tercero.
Para verificar la firma paso a paso, puede seguir la siguiente guía:
Paso 1: Extraer la marca de tiempo y las firmas de la cabecera #
Dividir la cabecera, utilizando la tecla ,
como separador, para obtener una lista de elementos. A continuación, dividir cada elemento, utilizando el =
como separador, para obtener un par de prefijo y valor.
El valor del prefijo t
corresponde a la marca de tiempo, y v1
corresponde a la firma. Puede descartar todos los demás elementos.
Por ejemplo:
t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4
Paso 2: Preparar el carga_firmada
cadena #
En carga_firmada
se crea concatenando:
- La marca de tiempo (en forma de cadena)
- El personaje
.
- La carga útil JSON real (el cuerpo de la solicitud)
Por ejemplo:
1687845304
+.
+Carga útil JSON
1687845304.{
"id": "evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
"object": "event",
"api_version": "2022-11-15",
"created": 1687845303,
"data": {
"objeto": {
"id": "prod_O9oUVgsSaordCT",
"object": "producto",
"active": true,
"livemode": true,
"name": "test",
"type": "service",
"livemode": true,
"pending_webhooks": 1,
"type": "producto.creado"
}
Paso 3: Determinar la firma prevista #
Calcula un HMAC con la función hash SHA256.
- Utilice el secreto del webhook del endpoint como el claveque puede obtener en
webhook.secreto
en objeto webhook - Utiliza el
carga_firmada
como la cadena mensaje que ya preparó en el paso 2.
A través de la clave + mensajese puede calcular una cadena HMAC, que es firma esperada
Por ejemplo:
public static void main(String[] args) {
String webhookSecret = "whsec_261V2mfsXt1BsOjJbHaQOxnTzhWZKrUE";
String timestamp = "1687845304";
String requestBody = "{\"id\":\"evt_1NNUrjL6kclEVx6Mb1x5dKJ3\",\"object\":\"event\",\"api_version\":\"2022-11-15\",\"created\":1687845303,\"data\":{\"object\":{\"id\":\"prod_O9oUVgsSaordCT\",\"object\":\"product\",\"active\":true,\"livemode\":true,\"name\":\"test\",\"type\":\"service\",\"livemode\":true,\"pending_webhooks\":1,\"type\":\"product.created"}";
String signedPayload = timestamp+". "+requestBody;
String signature = hmacSha256(webhookSecret,signedPayload);
String WooshpaySignature = "t="+timestamp+",v1="+firma;
}
/**
* HMAC-SHA256
*/
public static String hmacSha256(String secreto, String mensaje) {
String res;
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
mac.init(secretKey);
byte[] hash = mac.doFinal(message.getBytes());
res = Hex.encodeHexString(hash);
} catch (Exception e) {
return null;
}
return res;
}
Paso 4: Comparar las firmas #
Compare el firma en la cabecera a la firma esperada.
Para una coincidencia de igualdad, calcule la diferencia entre el hora actual y el hora de recepcióny luego decide si la diferencia está dentro de tu tolerancia.
Para protegerse de los ataques de sincronización, puede utilizar una comparación de cadenas en tiempo constante para comparar la firma esperada con cada una de las firmas recibidas.