Saltar al contenido principal

Webhook

Recibe eventos de n1co business en tu punto de conexión de webhook

Escucha eventos de tu cuenta de n1co buiness en tu punto de conexión de webhook para que tu integración pueda activar reacciones automáticas a medida que ocurren eventos en tu cuenta.

Por qué usar webhooks

Al crear integraciones con n1co Business, es posible que desees que tus aplicaciones reciban eventos a medida que ocurren en tu cuenta, para que tus sistemas de back-end puedan ejecutar las acciones necesarias.

Para habilitar los eventos de webhook, debes registrar los puntos de conexión de webhook. Después de registrarlos, n1co Business puede enviar datos de eventos en tiempo real al punto de conexión de tu aplicación cuando se produzcan eventos en tu cuenta. n1co Business utiliza HTTPS para enviar eventos de webhook a tu aplicación como una carga JSON que incluye un objeto event.

Recibir eventos de webhook es particularmente útil para escuchar eventos asincrónicos, por ejemplo, cuando se crea, paga o anula un pedido, cuando se actualiza el estado de envío de un pedido, etc.

Configuración de webhook

Para configurar un punto de conexión de webhook, debes proporcionar una URL de punto de conexión y generar una llave secreta. La URL de punto de conexión es la URL a la que n1co Business enviará eventos de webhook. La llave secreta es una cadena utilizada para firmar los eventos de webhook que se envían a tu aplicación. Puedes utilizar la llave secreta para verificar que los eventos que recibes provienen de n1co Business.

Crear un punto de conexión de webhook

Para crear un punto de conexión de webhook, sigue estos pasos:

  1. Inicia sesión en tu cuenta de n1co business
  2. En el menú de la parte superior derecha, haz clic en Configuración
  3. En la sección Opciones para desarrolladores, haz clic en Webhook
  4. Agrega la URL de tu punto de conexión de webhook y genera una llave secreta, luego haz clic en Guardar Cambios
  5. ¡Listo! Tu punto de conexión de webhook está listo para recibir eventos de n1co business

Eventos de webhook

n1co Business envía eventos de webhook a tu punto de conexión en tiempo real. Cada evento de webhook incluye un objeto event que contiene información sobre el evento que se ha producido en tu cuenta de n1co Business. Los eventos de webhook se envían como cargas JSON en una solicitud HTTPS POST a tu punto de conexión.

Objeto Event

El contract para los eventos de webhook es el siguiente:

{
"orderId": "String!",
"orderReference": "String",
"description": "String!",
"level": "String!",
"type": "String!",
"metadata": "Object"
}

La definición de los campos del objeto event es la siguiente:

orderId: String! -> identificador interno de la orden generado por el sistema de n1co
orderReference: String -> referencia de la orden proporcionada por el integrador
description: String! -> mensaje descriptivo de evento
level: String! -> nivel de severidad del evento
type: String! -> tipo de evento
metadata: Object -> key-value object que contiene información adicional sobre el evento

Niveles de severidad level

  • Info: Indica información general o eventos que no requieren atención inmediata.
  • Warning: Indica situaciones que podrían requerir atención o investigación, pero que no representan un error crítico o una falla del sistema.
  • Error: Indica un error del sistema que requiere atención.

Tipos de evento type

Created

Este evento indica que se ha creado un nuevo pedido en n1co business.

Ejemplo:

{
"orderId": "1057",
"orderReference": "test-3",
"description": "La orden fue creada",
"metadata": null,
"level": "Info",
"type": "Created"
}
SuccessPayment

Este evento indica que el pago de un pedido ha sido exitoso.

Ejemplo:

{
"orderId": "1056",
"orderReference": null,
"description": "La orden fue pagada exitosamente autorización: 1715206043181",
"metadata": {
"PaymentId": "e6a634cb-b7d3-4ecb-8420-a80c2f3b0fed",
"ChargeId": "a8782668-9361-4710-96ea-4b2088a5842d",
"Status": "SUCCEEDED",
"AuthorizationCode": "1715206043181",
"SequentialNumber": "N/A",
"AccountId": "hugoapp.h4b",
"PaymentProcessor": "sandbox",
"PaymentProcessorReference": "N/A",
"TransactionDate": "2024-05-08T22:07:23.2092992Z",
"PaidAmount": "1.00",
"BuyerName": "Tim Apple",
"BuyerPhone": "+1 408-996-1010",
"BuyerEmail": "tim@apple.com",
"CheckoutNote": "N/A",
"OrderReference": "",
"OrderTotalDetails": {
"subtotal": "1.0000",
"shippingAmount": "0.0000",
"discountAmount": "0",
"surchargeAmount": "0",
"total": "1.00"
}
},
"level": "Info",
"type": "SuccessPayment"
}
Cancelled

Este evento indica que un pedido ha sido anulado.

Ejemplo:

{
"orderId": "32395",
"orderReference": null,
"description": "La orden fue cancelada, motivo: some reason",
"metadata": null,
"level": "Info",
"type": "Cancelled"
}
Finalized

Este evento indica que el estado de un pedido ha sido finalizado.

Ejemplo:

{
"orderId": "32395",
"orderReference": null,
"description": "Se finalizó la orden.",
"metadata": null,
"level": "Info",
"type": "Finalized"
}
Updated

Este evento indica que se ha actualizado el estado de envío de un pedido en n1co business.

Listado de estados de envío:

  • PENDING: Orden pendiente
  • ACCEPTED: Orden aceptada
  • READY: Orden lista
  • DISPATCHED: Orden despachada
  • ON_ITS_WAY: Orden en camino
  • DELIVERED: Orden entregada
  • SCHEDULED: Orden programada
  • REJECTED: Orden rechazada

Ejemplos:

Para el cambio de estado de PENDING a ACCEPTED:

{
"orderId": "13766",
"orderReference": null,
"description": "Se cambió el estado del envío de Pendiente a Aceptado",
"metadata": {
"PreparationEtaMinutes": "15",
"PreviousStatus": "PENDING",
"NewStatus": "ACCEPTED"
},
"level": "Info",
"type": "Updated"
}

Para el cambio de estado de ACCEPTED a READY:

{
"orderId": "13766",
"orderReference": null,
"description": "Se cambió el estado del envío de Aceptado a Preparado",
"metadata": {
"PreviousStatus": "ACCEPTED",
"NewStatus": "READY"
},
"level": "Info",
"type": "Updated"
}

Para el cambio de estado de READY a DISPATCHED:

{
"orderId": "13766",
"orderReference": null,
"description": "Se cambió el estado del envío de Preparado a Despachado",
"metadata": {
"PreviousStatus": "READY",
"NewStatus": "DISPATCHED"
},
"level": "Info",
"type": "Updated"
}

Para el cambio de estado de DISPATCHED a ON_ITS_WAY:

{
"orderId": "13766",
"orderReference": null,
"description": "Se cambió el estado del envío de Despachado a En Camino",
"metadata": {
"PreviousStatus": "DISPATCHED",
"NewStatus": "ON_ITS_WAY"
},
"level": "Info",
"type": "Updated"
}

Para el cambio de estado de ON_ITS_WAY a DELIVERED:

{
"orderId": "13766",
"orderReference": null,
"description": "Se cambió el estado del envío de En Camino a Entregado",
"metadata": {
"PreviousStatus": "ON_ITS_WAY",
"NewStatus": "DELIVERED"
},
"level": "Info",
"type": "Updated"
}
Deleted

Este evento indica que un pedido ha sido eliminado.

Ejemplo:

{
"orderId": "32395",
"orderReference": null,
"description": "Se eliminó la orden",
"metadata": null,
"level": "Info",
"type": "Deleted"
}
SuccessReverse

Este evento indica que se ha realizado una reversión exitosa de un pago.

Ejemplo:

{
"orderId": "1056",
"orderReference": null,
"description": "El pago de la orden fue revertido",
"metadata": null,
"level": "Info",
"type": "SuccessReverse"
}
ReverseError

Este evento indica que se ha producido un error al intentar revertir un pago.

Ejemplo:

{
"orderId": "1056",
"orderReference": null,
"description": "La orden no pudo ser cancelada, no se pudo revertir el pago",
"metadata": null,
"level": "Error",
"type": "ReverseError"
}
PaymentError

Este evento indica que se ha producido un error al intentar realizar un pago.

Ejemplo:

{
"orderId": "1056",
"orderReference": null,
"description": "El pago no fue realizado: some error",
"metadata": null,
"level": "Error",
"type": "PaymentError"
}
ThreeDSecureAuthSucceeded

Este evento indica que la autenticación 3DS se completó correctamente para un cobro específico y por ende se puede proceder con la confirmación de la transacción utilizando el authenticationId provisto en la metadata del evento.

Ejemplo:

{
"orderId": "31833",
"orderReference": "order-integration-id",
"description": "La autenticación 3DS ha sido completada con éxito",
"metadata": {
"authenticationId": "fdedee2f-5942-47ff-83a5-cb473d0e8764"
},
"level": "Info",
"type": "ThreeDSecureAuthSucceeded"
}
ThreeDSecureAuthError

Este evento indica que se produjo un error durante la autenticación 3DS para un cobro específico. El error puede deberse a varios motivos, como información incorrecta del titular de la tarjeta, problemas técnicos con el proveedor de autenticación 3DS o problemas de conectividad. Para más detalle se pueden consultar los atributos reason y description incluídos en la metadata del evento.

Ejemplo:

{
"orderId": "31833",
"orderReference": "order-integration-id",
"description": "Ocurrió un error en la autenticación 3DS",
"metadata": {
"authenticationId": "fdedee2f-5942-47ff-83a5-cb473d0e8764",
"reason" : "Some reason",
"description" : "Some description",
},
"level": "Error",
"type": "ThreeDSecureAuthError"
}
ThreeDSecureAuthExpired

Este evento es un indicador de que la autenticación 3DS no se completó a tiempo y que la transacción no se puede completar en este momento. Se puede volver a intentar la transacción más tarde una vez que el titular de la tarjeta inicie una nueva solicitud de autenticación.

Ejemplo:

{
"orderId": "31833",
"orderReference": "order-integration-id",
"description": "La autenticación 3DS ha expirado",
"metadata": {
"authenticationId": "fdedee2f-5942-47ff-83a5-cb473d0e8764"
},
"level": "Info",
"type": "ThreeDSecureAuthExpired"
}
ThreeDSecureAuthFailed

Este evento indica que hubo un fallo técnico que impidió que la autenticación 3DS se completara correctamente para un pedido específico. El fallo puede deberse a problemas con el proveedor de autenticación 3DS, problemas de integración o problemas del lado del servidor. Para más detalle se pueden consultar los atributos reason y description incluídos en la metadata del evento.

Ejemplo:

{
"orderId": "31833",
"orderReference": "order-integration-id",
"description": "Ocurrió un fallo en la autenticación 3DS",
"metadata": {
"authenticationId": "fdedee2f-5942-47ff-83a5-cb473d0e8764",
"reason" : "Some reason",
"description" : "Some description",
},
"level": "Error",
"type": "ThreeDSecureAuthFailed"
}

Verificación de eventos de webhook

Para verificar que los eventos de webhook que recibes provienen de n1co buiness, puedes utilizar la llave secreta que generaste al configurar tu punto de conexión de webhook. Para verificar un evento de webhook, sigue estos pasos:

  1. Extrae el valor de la cabecera X-H4B-Hmac-Sha256 de la solicitud HTTP POST que contiene el evento de webhook.
  2. Calcula el HMAC SHA-256 del cuerpo de la solicitud HTTP POST utilizando la llave secreta generada al configurar tu punto de conexión de webhook.

Ejemplo de verificación de eventos de webhook

Node.js
app.post("/webhook", (req, res) => {
//Llave secreta configurada en el administrador de n1co Business
const API_SECRET = process.env.API_SECRET;

//Extraer el valor del header X-H4B-Hmac-Sha256'
const hmacHeader = req.get("X-H4B-Hmac-Sha256");

const content = /* body del request como strings */ req.body;

//Generar el hash
const hash = crypto
.createHash("sha256", API_SECRET)
.update(content, "utf8", "hex")
.digest("base64");

if (hash === hmacHeader) {
console.log("Notification Request from n1co Business received", body);
res.sendStatus(200);
} else {
console.log("Could not validate signature", hash);
res.sendStatus(400);
}
});
Python
import hashlib
import hmac
from flask import Flask, request, abort

app = Flask(__name__)

@app.route("/webhook", methods=['POST'])
def webhook():
# Llave secreta configurada en el administrador de n1co Business
API_SECRET = os.environ.get('API_SECRET')

# Extraer el valor del header 'X-H4B-Hmac-Sha256'
hmac_header = request.headers.get('X-H4B-Hmac-Sha256')

# body del request como strings
content = request.data.decode('utf-8')

# Generar el hash
hash = hmac.new(API_SECRET.encode('utf-8'), content.encode('utf-8'), hashlib.sha256).hexdigest()

if hmac.compare_digest(hash, hmac_header):
print("Notification Request from n1co Business received", content)
return '', 200
else:
print("Could not validate signature", hash)
abort(400)

if __name__ == '__main__':
app.run()
PHP

<?php

// Llave secreta configurada en el administrador de n1co Business
const API_SECRET = getenv("API_SECRET");

// Extraer el valor del header X-H4B-Hmac-Sha256'
$hmacHeader = $_SERVER["HTTP_X_H4B_HMAC_SHA256"];

// Body del request como strings
$content = file_get_contents("php://input");

// Generar el hash
$hash = hash_hmac("sha256", $content, API_SECRET);

if ($hash === $hmacHeader) {
echo "Notification Request from n1co Business received";
http_response_code(200);
} else {
echo "Could not validate signature";
http_response_code(400);
}

?>