n8n-nodes-quickpay
v0.1.0
Published
n8n community node para QuickPay / QuickLink Pay API — crea links de cobro, ejecuta cobros C2P con OTP, dispersa pagos y recibe webhooks firmados (HMAC-SHA256) sin escribir glue.
Maintainers
Readme
n8n-nodes-quickpay
Community node de n8n para la QuickLink Pay API (marca pública: QuickPay). Permite que un comercio que arma su flujo en n8n acepte y disperse pagos vía QuickLink sin escribir glue: crear links de cobro, ejecutar cobros C2P con OTP, dispersar pagos masivos y recibir webhooks firmados — todo como nodos arrastrables.
Este paquete es un wrapper de la Pay API (POST /switch/v1/...). No reimplementa lógica de
dinero: arma el request, inyecta la autenticación y devuelve la respuesta cruda del switch.
Nodos incluidos
| Nodo | Tipo | Para qué | |------|------|----------| | QuickPay | acción | Crear links de cobro, cobrar con OTP, consultar y dispersar | | QuickPay Trigger | trigger (webhook) | Recibir webhooks salientes de QuickLink, verificando la firma HMAC-SHA256 |
Instalación
En tu instancia de n8n (self-hosted), instala el paquete como community node:
Opción A — desde la UI: Settings → Community Nodes → Install → n8n-nodes-quickpay.
Opción B — manual (build local, sin publicar a npm):
cd switch/integrations/n8n-nodes-quickpay
npm install
npm run build # tsc → dist/
# enlázalo en tu carpeta de nodes custom de n8n
mkdir -p ~/.n8n/custom
ln -s "$(pwd)" ~/.n8n/custom/n8n-nodes-quickpay
# reinicia n8nRequisitos: Node.js ≥ 18 (el trigger usa node:crypto).
Configuración de credenciales (QuickPay API)
Crea una credencial QuickPay API con:
| Campo | Ejemplo | Notas |
|-------|---------|-------|
| Comercio | mi_comercio | slug del comercio |
| Secret Key | sk_test_… / sk_live_… | el prefijo fija el ambiente (test = no mueve dinero) |
| Base URL | https://pay.quickoffer.io | sin barra final |
La credencial arma la cabecera de auth:
x-switch-key: <comercio>:<sk_key>El botón Test hace un GET /switch/v1/bancos autenticado (read-only) para validar que la
combinación comercio + key funciona.
Operaciones del nodo QuickPay
| Resource | Operation | Endpoint |
|----------|-----------|----------|
| Link de Cobro | Crear | POST /switch/v1/links |
| Link de Cobro | Consultar | GET /switch/v1/links/{id} |
| Cobro | Solicitar OTP | POST /switch/v1/cobrar/token |
| Cobro | Ejecutar | POST /switch/v1/cobrar |
| Cobro | Consultar | POST /switch/v1/consultar |
| Dispersión | Crear | POST /switch/v1/dispersiones |
Money-safety: la regla idempotency_key (token ≠ cobro)
El cobro C2P son dos pasos: Solicitar OTP y Ejecutar. Reglas que el flujo debe respetar:
- El OTP NO es la idempotency_key. Son cosas distintas: el OTP autoriza, la
idempotency_keydeduplica. - Estable por intento: usa la misma
idempotency_keyen Solicitar OTP y en el Ejecutar de ese mismo intento (y si reintentas exactamente ese intento). Reintentar con la misma llave nunca duplica el cobro: devuelve el resultado original. - Nueva llave = intento nuevo: genera una
idempotency_keydistinta solo cuando el pagador re-solicita OTP y arranca un cobro desde cero. - El nodo no inventa reintentos ciegos: el reintento lo decide tu flujo.
Tip: en n8n puedes derivar la llave con un nodo Code/Set (p.ej. un UUID estable por intento) y pasarla a ambos pasos por expresión.
Trigger: QuickPay Trigger
Configura un Webhook Secret (el secret show-once que QuickLink devolvió al crear el webhook).
El nodo:
- Lee el cuerpo crudo de la request.
- Recalcula
HMAC-SHA256(secret, cuerpo_crudo). - Lo compara en tiempo constante con
x-quicklink-signature: sha256=<hex>. - Rechaza con 401 las firmas inválidas o ausentes (no emite nada).
- Emite el evento si la firma es válida y el
typeestá entre los Eventos seleccionados (transaccion.aprobada/transaccion.rechazada/transaccion.liquidada/link.pagado).
Registra la URL de producción del webhook de n8n como endpoint en tu webhook de QuickLink.
Ejemplo de flujo: Crear link → esperar link.pagado
Datos dummy (no reales):
- Manual Trigger (o el disparador que prefieras).
- QuickPay → Resource Link de Cobro, Operation Crear:
- Monto:
150.00 - Moneda:
VES - Concepto:
Pedido #1042 - Expira (horas):
24 - Salida:
{ id, url, estado: "pendiente", expires_at, ... }. Comparteurlcon el pagador.
- Monto:
- QuickPay Trigger (rama paralela, activa en el workflow):
- Webhook Secret: el secreto del webhook.
- Eventos:
link.pagado. - Cuando el pagador completa el cobro, QuickLink POSTea el evento firmado; el nodo verifica la
firma y emite
{ type: "link.pagado", data: { id, txn_id, ... } }.
- Conecta la salida del trigger a tu lógica de negocio (marcar pedido pagado, enviar recibo, etc.).
Ejemplo de cobro C2P con OTP (dummy)
- QuickPay → Cobro / Solicitar OTP:
- Idempotency Key:
11111111-1111-4111-8111-111111111111(estable por intento) - Monto:
320.00, Concepto:Matrícula - Cobrador:
{ tipo: cuenta, valor: 0138..., banco: 0138, identificacion: J00378944781, nombre: Comercio Demo } - Pagador:
{ tipo: telefono, valor: 04141234567, banco: 0105, identificacion: V12345678, nombre: Pagador Demo }
- Idempotency Key:
- El pagador recibe el OTP de su banco y te lo dicta.
- QuickPay → Cobro / Ejecutar:
- Misma Idempotency Key del paso 1.
- Mismos Monto/Cobrador/Pagador + OTP:
12345678. - Salida:
Resultadoconestado(ACEPTADA/PENDIENTE/LIQUIDADA/RECHAZADA).
- Opcional: QuickPay → Cobro / Consultar con el
idhastaLIQUIDADA.
Scripts
npm run typecheck # tsc --noEmit
npm run build # tsc → dist/Licencia
UNLICENSED (uso interno).
