Webhooks
Envíe notificaciones de eventos en tiempo real desde facturapy.me a servicios externos. Elija el tipo de evento, luego agregue su URL de punto final, token secreto y nombre su nuevo webhook.
- Una URL donde el evento del webhook sera enviado.
- Un tipo de evento que sera enviado a la URL especificada.
- Un Token Secreto, que puede ser usado para verificar los datos enviados.
Cuando un webhook es disparado, una petición POST será hecha a la URL configurada junto a datos en formato JSON específicos para el tipo de evento.
Administrando Webhooks
Los Webhooks pueden ser administrados desde su perfil en facturapy.me en la pestaña Integraciones
Eventos Soportados
Los eventos soportados a la fecha son:
- Producto Creado
- Producto Modificado
- Stock
- DTE Emitido
- DTE Recibido
- Carga de Folios
- Anulación de Folios
- Certificado Digital por Vencer
- Certificado Digital Vencido
Política de Reenvío
Se considerará como errónea una petición si no recibimos ninguna respuesta 2xx (http code 200-299) dentro de los 30 segundos posteriores al envío del webhook.
Si una petición falla, reintentaremos realizarla nuevamente 3 veces cada 30 segundos.
Verificando la firma del Webhook
Cada evento webhook es firmado via HMAC usando el token secreto del webhook. El algoritmo usado para generar la firma es HMAC-SHA256. Esta firma es enviada en cada
petición en la cabecera como X-FACTURAPYME-SIGNATURE
.
Ejemplos:
PHP
<?php
const WEBHOOK_SECRET = 'montana';
function verificaFirma($body, $signature) {
$digest = hash_hmac('sha256', $body, WEBHOOK_SECRET);
return $signature === $digest;
}
if (!verificaFirma(file_get_contents('php://input'), $_SERVER['HTTP_X_FACTURAPYME_SIGNATURE'])) {
//Error de verificación
return;
}
//verificación Correcta
//Magic Goes Here...
Node.js
const WEBHOOK_SECRET = 'montana';
const crypto = require('crypto');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.raw({
type: '*/*'
}));
function verificaFirma(req) {
const payload = req.body;
const signature = req.get('x-facturapyme-signature') || '';
const digest = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(payload)
.digest('hex');
return signature === digest;
};
app.post('/webhook', (req, res) => {
if (!verificaFirma(req)) {
//Error de verificación
res.status(200).send('.');
return;
}
//verificación Correcta
//Magic Goes Here...
res.status(200).send('..');
});
app.listen(3000);
Python
import hmac
from hashlib import sha256
from flask import Flask, request
WEBHOOK_SECRET = 'montana'
app = Flask(__name__)
def verificaFirma():
digest = hmac.new(bytes(WEBHOOK_SECRET, 'utf-8'), msg=request.data, digestmod=sha256)
return digest.hexdigest() == request.headers.get('x-facturapyme-signature')
@app.route('/webhook', methods=['POST'])
def webhook():
if not verificaFirma():
#Error de verificación
return '.'
#verificación Correcta
#Magic Goes Here...
return '..'
Datos de Eventos Webhook
Cada evento enviado tiene la siguiente cabecera
Atributo | Tipo | Descripción |
---|---|---|
evento | String | Tipo de evento |
fecha | Numérico | Fecha de generación del evento. Formato Y-m-d H:i:s |
empresa | String | RUT de la empresa cliente de facturapy.me |
data | Array | Array con los datos del evento |
Evento Producto Creado
producto:creado
Este evento se genera cuando se crea un nuevo producto en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
id | Numérico | Id del producto |
barcode | String | Código de barra o código interno del producto |
producto | String | Nombre del Producto |
familia | Objeto | Familia del producto. Ver más abajo |
precio | Numérico | Precio de venta del producto |
exento | Booleano | Indica si el producto esta exento de IVA |
Atributo | Tipo | Descripción |
---|---|---|
id | Numérico | Id de la familia |
nombre | String | Nombre de la familia |
{
"evento": "producto:creado",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"id": 44,
"barcode": "EMP001",
"producto": "Empanadas",
"familia": {
"id": "4",
"nombre": "Producto Genérico"
},
"precio": 1500,
"exento": false
}
]
}
Evento Producto Modificado
producto:actualizado
Este evento se genera cuando se modifican los productos en la plataforma
Los datos enviados son los mismos que los del evento anterior. Ver arriba
Ejemplo{
"evento": "producto:actualizado",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"id": 44,
"barcode": "EMP001",
"producto": "Empanadas",
"familia": {
"id": "4",
"nombre": "Producto Genérico"
},
"precio": 1600,
"exento": false
}
]
}
Evento Stock
stock
Este evento se genera cuando se modifican el stock de algún producto en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
Los datos enviados son los mismos que los de los eventos anteriores. Ver arriba | ||
bodega | Numérico | Id de la bodega |
stock | Numérico | Cantidad de inventario del producto |
{
"evento": "stock",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"id": 44,
"barcode": "EMP001",
"producto": "Empanadas",
"familia": {
"id": 4,
"nombre": "Producto Genérico"
},
"precio": 1600,
"exento": false,
"bodega": 1,
"stock": 42
}
]
}
DTE Emitido
dte:emitido
Este evento se genera cuando se crea un documento tributario en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
folio | Numérico | Folio del documento emitido |
tipo | Numérico | Tipo de documento emitido. Ver listado más abajo |
Url | Link para descargar el documento en formato PDF |
- 33 Factura
- 34 Factura exenta
- 39 Boleta
- 41 Boleta exenta
- 43 Liquidación factura
- 46 Factura de compra
- 52 Guía de despacho
- 56 Nota de débito
- 61 Nota de crédito
- 110 Factura de exportación
- 111 Nota de débito de exportación
- 112 Nota de crédito de exportación
{
"evento": "dte:emitido",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"folio": 209,
"tipo": 33,
"pdf": "https://ruta_documento_electronico_en_formato_pdf..."
}
]
}
DTE Recibido
dte:recibido
Este evento se genera cuando se recibe un documento tributario en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
rut_emisor | String | RUT del Proveedor (Emisor del Documento) |
fecha_emision | Fecha | Fecha de emisión del documento recibido. Formato Y-m-d |
folio | Numérico | Folio del documento recibido |
tipo | Numérico | Tipo de documento recibido. Ver listado más arriba |
neto | Numérico | Total Neto del documento |
iva | Numérico | IVA Total del documento |
total | Numérico | Total Bruto del documento |
xml | Url | Link para descargar el documento en formato XML |
Url | Link para descargar el documento en formato PDF |
{
"evento": "dte:recibido",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"rut_emisor":"60803000-K",
"fecha_emision":"2020-11-17",
"folio": 10042004,
"tipo": 33,
"neto": 16790,
"iva": 3190,
"total": 19980,
"xml": "https://ruta_documento_electronico_en_formato_xml..."
"pdf": "https://ruta_documento_electronico_en_formato_pdf..."
}
]
}
Carga de Folios
caf:cargado
Este evento se genera cuando se cargan folios en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
tipo | Numérico | Tipo de documento. Ver listado arriba |
desde | Numérico | Folio inicial |
hasta | Numérico | Folio final |
fecha_asignacion | Fecha | Fecha de asignación de folios. Formato Y-m-d |
fecha_vencimiento | Fecha | Fecha en que vencen los folios. Formato Y-m-d |
{
"evento": "caf:cargado",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"tipo": 33,
"desde": 111,
"hasta": 610,
"fecha_asignacion": "2020-11-17",
"fecha_vencimiento": "2021-05-16"
}
]
}
Anulación de Folios
caf:anulado
Este evento se genera cuando se anulan folios en la plataforma
Atributo | Tipo | Descripción |
---|---|---|
tipo | Numérico | Tipo de documento. Ver listado arriba |
desde | Numérico | Folio inicial |
hasta | Numérico | Folio final |
{
"evento": "caf:anulado",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"tipo": 33,
"desde": 69,
"hasta": 110
}
]
}
Certificado Digital por Vencer
cert:por-vencer
Este evento se genera cuando el certificado digital esté por vencer.
Atributo | Tipo | Descripción |
---|---|---|
dias | Numérico | Cantidad de días que queda para que venza el certificado digital |
fecha_vencimiento | Fecha Hora | Fecha de vencimiento del certificado digital. Formato Y-m-d H:i:s |
{
"evento": "cert:por-vencer",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"dias": 14,
"fecha_vencimiento": "2020-12-01 15:40:30"
}
]
}
Certificado Digital Vencido
cert:vencido
Este evento se genera cuando el certificado esta vencido
Atributo | Tipo | Descripción |
---|---|---|
dias | Numérico | Cantidad de días que lleva vencido el certificado digital |
fecha_vencimiento | Fecha Hora | Fecha de vencimiento del certificado digital. Formato Y-m-d H:i:s |
{
"evento": "cert:por-vencer",
"fecha": "2020-11-17 15:40:33",
"empresa": "76538242-4",
"data": [
{
"dias": 10,
"fecha_vencimiento": "2020-11-07 15:40:06"
}
]
}