Snippet php para integrar facturación electrónica DIAN con WooCommerce WordPress.
Integrar la facturación electrónica de la DIAN (Colombia) con WooCommerce en WordPress requiere interactuar con un proveedor tecnológico autorizado por la DIAN o implementar directamente los servicios web de la DIAN (para los que debes tener certificado digital y cumplir sus especificaciones técnicas).
Aquí te dejo un snippet PHP básico que podrías usar como punto de partida para generar la factura electrónica al momento de completar un pedido en WooCommerce. Esto no genera una factura válida ante la DIAN, pero muestra cómo capturar la orden y enviar datos a un servicio externo (como el de un proveedor tecnológico).
Snippet PHP – Enviar datos del pedido a un servicio externo (por ejemplo, proveedor DIAN).
Agrega esto al archivo functions.php de tu tema hijo o como parte de un plugin personalizado:
add_action('woocommerce_thankyou', 'enviar_datos_factura_electronica_dian', 10, 1);
function enviar_datos_factura_electronica_dian($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$cliente = [
'nombre' => $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(),
'email' => $order->get_billing_email(),
'telefono' => $order->get_billing_phone(),
'documento'=> $order->get_meta('_billing_dni'), // Asegúrate de capturar el documento en el checkout
'direccion'=> $order->get_billing_address_1()
];
$items = [];
foreach ($order->get_items() as $item_id => $item) {
$producto = $item->get_product();
$items[] = [
'nombre' => $item->get_name(),
'sku' => $producto->get_sku(),
'precio' => $order->get_line_subtotal($item, false),
'cantidad' => $item->get_quantity()
];
}
$factura = [
'numero_orden' => $order->get_order_number(),
'fecha' => $order->get_date_created()->date('Y-m-d H:i:s'),
'total' => $order->get_total(),
'cliente' => $cliente,
'items' => $items
];
$endpoint = 'https://tu-proveedor-dian.com/api/factura';
$api_key = 'TU_API_KEY';
$response = wp_remote_post($endpoint, [
'method' => 'POST',
'headers' => [
'Content-Type' => 'application/json',
'Authorization'=> 'Bearer ' . $api_key
],
'body' => json_encode($factura)
]);
// Manejar respuesta
if (is_wp_error($response)) {
error_log('Error al enviar factura electrónica: ' . $response->get_error_message());
} else {
error_log('Factura enviada correctamente: ' . $response['body']);
}
}
¿Qué necesitas para una integración completa?.
- Proveedor autorizado DIAN como: Carvajal, The Factory HKA, Gosocket, etc. (ellos te dan el API real).
- Certificado digital si deseas conectarte directamente con la DIAN (más complejo).
- Capturar datos tributarios obligatorios, como tipo de documento, régimen, etc.
- Validar XML UBL 2.1, firmado y enviado con firma digital (si lo haces directo con DIAN).
¿Quieres un ejemplo real con un proveedor específico? Puedo darte un código adaptado si me indicas con cuál estás trabajando.
Para integrar la facturación electrónica de la DIAN con WooCommerce en WordPress en 2025, es necesario utilizar un proveedor tecnológico autorizado por la DIAN, ya que la entidad no permite emitir facturas electrónicas directamente sin intermediarios. A partir de la segunda semana de abril de 2025, la DIAN habilitó un nuevo servicio que permite generar facturas electrónicas utilizando únicamente el tipo y número de documento del comprador, facilitando así el proceso de facturación .(Dian)
🔧 Pasos para Integrar la Facturación Electrónica de la DIAN con WooCommerce.
1. Seleccionar un Proveedor Tecnológico Autorizado por la DIAN.
Algunos proveedores que ofrecen servicios de facturación electrónica compatibles con WooCommerce incluyen:
- FacturaLatam: Ofrece una API REST que se puede integrar con WooCommerce mediante código personalizado o un desarrollador .(Tecnoweb2)
- Nilo App: Brinda soluciones integrales que incluyen facturación electrónica, contabilidad y tiendas virtuales, con soporte para integrarse con WooCommerce .(Nilo)
- Siigo y Alegra: También son proveedores autorizados que ofrecen soluciones de facturación electrónica con integración a plataformas de comercio electrónico.
2. Registrar tu Empresa como Facturador Electrónico ante la DIAN.
Debes inscribir tu empresa en el RUT como responsable de facturación electrónica. Este proceso es obligatorio para poder emitir facturas electrónicas válidas ante la DIAN.
3. Obtener un Certificado Digital.
Para firmar electrónicamente las facturas, es necesario contar con un certificado digital emitido por una entidad certificadora autorizada. Este certificado garantiza la autenticidad y seguridad de las facturas emitidas.
4. Integrar la API del Proveedor con WooCommerce.
Una vez seleccionado el proveedor, debes integrar su API con tu tienda WooCommerce. Esto puede implicar la instalación de un plugin específico o el desarrollo de una integración personalizada. La integración debe permitir que, al completar un pedido en WooCommerce, se genere automáticamente una factura electrónica que cumpla con los requisitos de la DIAN.
5. Realizar Pruebas de Emisión de Facturas.
Antes de comenzar a emitir facturas electrónicas en producción, es recomendable realizar pruebas para asegurarte de que el proceso funciona correctamente y que las facturas generadas cumplen con los requisitos legales.
⚠️ Consideraciones Importantes.
- La DIAN prohíbe el uso de los datos obtenidos para la generación de facturas electrónicas con fines distintos a la facturación, como el almacenamiento masivo o la comercialización de datos .(Dian)
- Es fundamental mantener actualizada la información de tu empresa en el RUT y cumplir con todas las normativas establecidas por la DIAN para evitar sanciones.
- La integración de la facturación electrónica puede requerir conocimientos técnicos. Si no cuentas con estos conocimientos, es recomendable contar con el apoyo de un desarrollador o de un proveedor que ofrezca soporte técnico.
Si necesitas asistencia adicional para seleccionar un proveedor o para integrar la facturación electrónica con tu tienda WooCommerce, no dudes en consultarme.
Señalar que es posible conectarse directamente a la API de la DIAN para emitir facturas electrónicas en Colombia. A partir de la segunda semana de abril de 2025, la DIAN habilitó un nuevo servicio que permite generar facturas electrónicas utilizando únicamente el tipo y número de documento del comprador, facilitando así el proceso de facturación .
✅ ¿Es posible conectarse directamente a la API de la DIAN?.
Sí, es posible. La DIAN ofrece un servicio automatizado que permite generar facturas electrónicas con solo el número de identificación del comprador. Este servicio está disponible para todos los facturadores, incluyendo aquellos que usen el Servicio de Facturación Gratuita de la DIAN, así como quienes hayan desarrollado su propio software de facturación u operen con un proveedor tecnológico .(Dian).
🔧 ¿Cómo integrar la facturación electrónica de la DIAN con WooCommerce?.
Para integrar la facturación electrónica de la DIAN con WooCommerce, puedes seguir estos pasos:
- Registrar tu empresa en el RUT: Debes inscribir tu empresa como responsable de facturación electrónica ante la DIAN.
- Obtener un certificado digital: Necesitarás un certificado digital emitido por una entidad certificadora autorizada para firmar electrónicamente las facturas.
- Desarrollar o adquirir un software de facturación: Puedes desarrollar un software propio que se conecte a la API de la DIAN o adquirir uno de un proveedor autorizado. Algunos proveedores ofrecen plugins específicos para WooCommerce que facilitan esta integración.
- Configurar el plugin en WooCommerce: Instala y configura el plugin en tu tienda WooCommerce, proporcionando las credenciales necesarias y ajustando las opciones según tus necesidades.
- Realizar pruebas: Antes de comenzar a emitir facturas en producción, realiza pruebas para asegurarte de que todo funciona correctamente.
⚠️ Consideraciones importantes.
- Uso exclusivo para facturación: La información obtenida a través del servicio de la DIAN solo puede usarse para la generación de facturas electrónicas. Está prohibido utilizarla para otros fines, como almacenar datos o compartirlos .(Dian, Suscríbete y sé la primera persona)
- Cumplimiento de normativas: Es fundamental cumplir con todas las normativas establecidas por la DIAN para evitar sanciones.
- Soporte técnico: Si no cuentas con los conocimientos técnicos necesarios, es recomendable contar con el apoyo de un desarrollador o de un proveedor que ofrezca soporte técnico.
Si necesitas asistencia adicional para seleccionar un proveedor o para integrar la facturación electrónica con tu tienda WooCommerce, no dudes en consultarme.
Puedes conectarte directamente desde WooCommerce a la API de la DIAN usando PHP, pero hay varios pasos complejos involucrados, porque la DIAN no ofrece una API REST tradicional simple, sino que utiliza:
- XML UBL 2.1 estructurado
- Firma digital XAdES-BES (con certificado digital)
- Intercambio por Web Services SOAP o intercambio de archivos por FTP/SFTP
- Validaciones técnicas y jurídicas
¿Es posible hacerlo desde PHP con WooCommerce?.
Sí, pero no con un simple snippet corto. Requiere:
- Generar XML UBL 2.1 válido
Que cumpla con la estructura exigida por la DIAN. - Firmar digitalmente el XML
Usando XAdES-BES, que puedes hacer con bibliotecas comoxmlseclibsen PHP o usando herramientas externas. - Enviar el documento vía Web Service SOAP a la DIAN
Con los certificados y credenciales configurados. - Procesar la respuesta de la DIAN
Para obtener el CUDS/CUFE y el acuse de recibo.
¿Cómo podrías hacerlo en WooCommerce?.
Te doy una estructura básica en pseudocódigo PHP, pero debes implementarlo con más detalle y pruebas:
add_action('woocommerce_order_status_completed', 'enviar_factura_dian_directa', 10, 1);
function enviar_factura_dian_directa($order_id) {
$order = wc_get_order($order_id);
// 1. Construye el XML UBL 2.1 según la DIAN
$xml = generar_xml_ubl_dian($order);
// 2. Firma el XML usando tu certificado digital
$xml_firmado = firmar_xml_dian($xml);
// 3. Conéctate al WebService SOAP de la DIAN (modo producción o pruebas)
$wsdl = 'https://vpfe.dian.gov.co/WcfDianCustomerServices.svc?wsdl';
$client = new SoapClient($wsdl, [
'trace' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'local_cert' => '/ruta/certificado.p12',
'passphrase' => 'tu_clave'
]);
$params = [
'contentFile' => base64_encode($xml_firmado),
'fileName' => 'factura.xml',
// otros campos requeridos por la DIAN
];
try {
$result = $client->__soapCall('SendBillSync', [$params]);
error_log(print_r($result, true));
} catch (Exception $e) {
error_log('Error al enviar a DIAN: ' . $e->getMessage());
}
}
¿Recomendación?.
Por la complejidad legal y técnica, lo mejor es:
- Usar una librería PHP especializada como:
- Usar modo ambiente de pruebas de la DIAN
- O intermediarlo con un microservicio en Laravel o Node.js que maneje la lógica complicada y conectes WooCommerce solo con JSON.
¿Quieres que te genere una versión más detallada de alguna de estas partes, como el XML o el envío SOAP?.
Entiendo que deseas integrar la facturación electrónica de la DIAN directamente con WooCommerce mediante un snippet PHP que puedas colocar en un plugin de snippets. Sin embargo, como mencioné anteriormente, la DIAN requiere un proceso complejo que incluye la generación de archivos XML UBL 2.1, la firma digital con XAdES-BES y la transmisión segura de los documentos. Este proceso no puede lograrse con un simple snippet PHP debido a su complejidad técnica y legal.
Para facilitar la integración, te recomiendo utilizar soluciones ya desarrolladas y aprobadas que cumplen con los estándares de la DIAN. Por ejemplo, el plugin FACTO – Facturación Electrónica para WordPress permite automatizar la emisión de documentos electrónicos cada vez que recibes una compra en tu tienda WooCommerce. Este plugin se integra con la API de la DIAN y maneja todo el proceso de facturación electrónica, incluyendo la generación de documentos, la firma digital y la transmisión segura.(WordPress.org)
Al utilizar una solución como FACTO, puedes asegurarte de que tu tienda WooCommerce cumpla con los requisitos legales y técnicos establecidos por la DIAN, sin necesidad de desarrollar una integración personalizada desde cero.
Si necesitas asistencia adicional para configurar este plugin o explorar otras opciones, no dudes en consultarme.
Perfecto. Si deseas desarrollar desde cero la integración de WooCommerce con la DIAN para facturación electrónica válida, te explicaré cuántos snippets (o bloques de funcionalidad) necesitas.
La DIAN no permite una integración trivial porque exige muchos pasos técnicos. Así que el proyecto se divide en módulos/snippets funcionales, más que «uno solo».
Mínimos snippets PHP que necesitas:
1. Hook de WooCommerce para capturar el pedido.
Captura la orden finalizada (cuando se debe emitir la factura).
add_action('woocommerce_order_status_completed', 'procesar_factura_dian', 10, 1);
function procesar_factura_dian($order_id) {
$order = wc_get_order($order_id);
// Llamar a funciones siguientes
}
2. Generador de XML UBL 2.1.
Construye el archivo XML siguiendo los lineamientos de la DIAN. Este es el snippet más complejo, debes crear nodos XML detalladamente. Ejemplo básico:
function generar_xml_ubl_dian($order) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$invoice = $dom->createElement('Invoice');
$invoice->setAttribute('xmlns', 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
$dom->appendChild($invoice);
// Agrega nodos requeridos por la DIAN (UBL 2.1)
// como AccountingSupplierParty, AccountingCustomerParty, TaxTotal, etc.
return $dom->saveXML();
}
3. Firma digital XAdES-BES del XML
Necesitas firmar el XML con tu certificado digital (.pfx/.p12). Puedes usar la librería xmlseclibs. Esto no es un snippet de una línea, pero puedes envolverlo en una función PHP:
function firmar_xml_dian($xml) {
// Usar xmlseclibs o una herramienta externa en el servidor
// para firmar el XML con el certificado digital
// Retorna el XML firmado
}
4. Envió a la DIAN vía Web Service SOAP.
Envías el XML firmado al web service oficial (producción o pruebas). Usa SoapClient de PHP:
function enviar_a_dian($xml_firmado) {
$client = new SoapClient('https://vpfe.dian.gov.co/WcfDianCustomerServices.svc?wsdl', [
'trace' => true,
'local_cert' => '/ruta/certificado.p12',
'passphrase' => 'tu_clave',
]);
$params = [
'contentFile' => base64_encode($xml_firmado),
'fileName' => 'factura.xml',
];
try {
$result = $client->__soapCall('SendBillSync', [$params]);
return $result;
} catch (Exception $e) {
error_log($e->getMessage());
return false;
}
}
5. Procesamiento de respuesta.
Interpreta la respuesta de la DIAN para obtener el estado de aceptación, el CUFE, etc.
Resumen de snippets funcionales mínimos:
| # | Función | Descripción |
|---|---|---|
| 1 | Hook de pedido completado | Captura orden en WooCommerce |
| 2 | Generador de XML UBL 2.1 (DOMDocument) | Construcción del XML obligatorio para DIAN |
| 3 | Firma XAdES del XML (xmlseclibs) | Firma digital con certificado DIAN |
| 4 | Envío SOAP al WebService de DIAN (SoapClient) | Conexión segura para enviar XML firmado |
| 5 | Procesamiento de respuesta de la DIAN | Validación de respuesta, log de errores |
¿Te gustaría que te construya el primer snippet completo (hook + XML básico)?
Puedo hacerlo y luego vamos construyendo los siguientes paso a paso.
Perfecto, vamos a construir el primer snippet completo:
Snippet 1: Hook + XML UBL 2.1 básico para la DIAN.
Este snippet captura una orden completada en WooCommerce y genera un archivo XML (inicio de UBL 2.1) estructurado conforme a los requisitos de la DIAN.
Puedes copiar y pegar este código en un plugin de snippets o en tu archivo
functions.php.
add_action('woocommerce_order_status_completed', 'procesar_factura_dian_desde_wc', 10, 1);
function procesar_factura_dian_desde_wc($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$xml = generar_xml_ubl_dian($order);
// Guarda el XML en el servidor para pruebas
$upload_dir = wp_upload_dir();
$path = $upload_dir['basedir'] . "/factura_dian_{$order_id}.xml";
file_put_contents($path, $xml);
error_log("XML generado para la orden #{$order_id}: {$path}");
}
function generar_xml_ubl_dian($order) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$Invoice = $dom->createElement('Invoice');
$Invoice->setAttribute('xmlns', 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
$Invoice->setAttribute('xmlns:cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$Invoice->setAttribute('xmlns:cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$dom->appendChild($Invoice);
// Número y fecha
$Invoice->appendChild(_cbc($dom, 'cbc:ID', 'F001-000001')); // Número de factura
$Invoice->appendChild(_cbc($dom, 'cbc:IssueDate', date('Y-m-d')));
// Datos del proveedor (emisor)
$accountingSupplier = $dom->createElement('cac:AccountingSupplierParty');
$party = $dom->createElement('cac:Party');
$party->appendChild(_cbc($dom, 'cbc:PartyIdentification', '900123456'));
$party->appendChild(_cbc($dom, 'cbc:PartyName', 'Mi Empresa S.A.S.'));
$accountingSupplier->appendChild($party);
$Invoice->appendChild($accountingSupplier);
// Datos del cliente (comprador)
$accountingCustomer = $dom->createElement('cac:AccountingCustomerParty');
$party2 = $dom->createElement('cac:Party');
$party2->appendChild(_cbc($dom, 'cbc:PartyIdentification', $order->get_billing_email()));
$party2->appendChild(_cbc($dom, 'cbc:PartyName', $order->get_formatted_billing_full_name()));
$accountingCustomer->appendChild($party2);
$Invoice->appendChild($accountingCustomer);
// Totales
$Invoice->appendChild(_cbc($dom, 'cbc:LegalMonetaryTotal', number_format($order->get_total(), 2, '.', '')));
return $dom->saveXML();
}
// Función auxiliar para crear nodos básicos
function _cbc($dom, $name, $value) {
$el = $dom->createElement($name);
$el->nodeValue = htmlspecialchars($value);
return $el;
}
¿Qué hace este snippet?.
- Captura pedidos completados en WooCommerce.
- Genera un XML básico estructurado como UBL 2.1.
- Guarda el archivo XML en
/wp-content/uploads/.
¿Qué sigue?.
Para completar la integración con la DIAN, los siguientes pasos/snippets son:
- Completar el XML UBL con líneas de productos, impuestos, moneda, CUFE, etc.
- Firmar digitalmente ese XML usando XAdES-BES.
- Enviar el XML firmado vía Web Service SOAP a la DIAN.
- Registrar respuesta y acuse.
¿Continuamos con el paso 2: completando el XML y agregando líneas de ítems del pedido WooCommerce?.
Perfecto. Vamos ahora con el Snippet 2: agregar ítems de productos, totales e impuestos al XML UBL 2.1, de acuerdo con lo requerido por la DIAN.
Objetivo
Completar el XML generado con:
- Líneas de productos
- Subtotales por ítem
- Impuestos (IVA)
- Totales generales
Snippet Mejorado – XML UBL con ítems WooCommerce.
Este código extiende el XML anterior. Solo reemplaza la función generar_xml_ubl_dian() por esta versión mejorada:
function generar_xml_ubl_dian($order) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$Invoice = $dom->createElement('Invoice');
$Invoice->setAttribute('xmlns', 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
$Invoice->setAttribute('xmlns:cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
$Invoice->setAttribute('xmlns:cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$dom->appendChild($Invoice);
// Cabecera básica
$Invoice->appendChild(_cbc($dom, 'cbc:ID', 'F001-000001'));
$Invoice->appendChild(_cbc($dom, 'cbc:IssueDate', date('Y-m-d')));
$Invoice->appendChild(_cbc($dom, 'cbc:InvoiceTypeCode', '01')); // 01 = Factura
// Emisor
$supplier = $dom->createElement('cac:AccountingSupplierParty');
$party = $dom->createElement('cac:Party');
$party->appendChild(_cbc($dom, 'cbc:PartyIdentification', '900123456'));
$party->appendChild(_cbc($dom, 'cbc:PartyName', 'Mi Empresa S.A.S.'));
$supplier->appendChild($party);
$Invoice->appendChild($supplier);
// Cliente
$customer = $dom->createElement('cac:AccountingCustomerParty');
$custParty = $dom->createElement('cac:Party');
$custParty->appendChild(_cbc($dom, 'cbc:PartyIdentification', $order->get_meta('_billing_dni') ?: '123456789'));
$custParty->appendChild(_cbc($dom, 'cbc:PartyName', $order->get_formatted_billing_full_name()));
$customer->appendChild($custParty);
$Invoice->appendChild($customer);
// Totales
$tax_total_value = 0;
$line_total = 0;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$precio_unitario = $product->get_price();
$cantidad = $item->get_quantity();
$subtotal = $precio_unitario * $cantidad;
$impuesto = $subtotal * 0.19; // IVA del 19% (puedes personalizar esto)
$line_total += $subtotal;
$tax_total_value += $impuesto;
$invoiceLine = $dom->createElement('cac:InvoiceLine');
$invoiceLine->appendChild(_cbc($dom, 'cbc:ID', $item->get_id()));
$invoiceLine->appendChild(_cbc($dom, 'cbc:InvoicedQuantity', $cantidad));
$invoiceLine->appendChild(_cbc($dom, 'cbc:LineExtensionAmount', number_format($subtotal, 2, '.', '')));
// Tax Total por ítem
$taxTotal = $dom->createElement('cac:TaxTotal');
$taxAmount = _cbc($dom, 'cbc:TaxAmount', number_format($impuesto, 2, '.', ''));
$taxTotal->appendChild($taxAmount);
$invoiceLine->appendChild($taxTotal);
// Item Info
$itemNode = $dom->createElement('cac:Item');
$itemNode->appendChild(_cbc($dom, 'cbc:Description', $item->get_name()));
$invoiceLine->appendChild($itemNode);
// Precio
$price = $dom->createElement('cac:Price');
$price->appendChild(_cbc($dom, 'cbc:PriceAmount', number_format($precio_unitario, 2, '.', '')));
$invoiceLine->appendChild($price);
$Invoice->appendChild($invoiceLine);
}
// Total de impuestos
$taxTotalNode = $dom->createElement('cac:TaxTotal');
$taxTotalNode->appendChild(_cbc($dom, 'cbc:TaxAmount', number_format($tax_total_value, 2, '.', '')));
$Invoice->appendChild($taxTotalNode);
// Total de la factura
$monetaryTotal = $dom->createElement('cac:LegalMonetaryTotal');
$monetaryTotal->appendChild(_cbc($dom, 'cbc:PayableAmount', number_format($line_total + $tax_total_value, 2, '.', '')));
$Invoice->appendChild($monetaryTotal);
return $dom->saveXML();
}
¿Qué incluye ahora este XML?.
- Datos del proveedor y cliente
- Línea de producto por cada ítem del pedido
- Cálculo de impuesto IVA del 19%
- Totales (sin y con impuesto)
¿Qué sigue?.
El paso 3 sería firmar este XML usando XAdES-BES con tu certificado digital .pfx o .p12. Esto se hace con librerías como:
- xmlseclibs (PHP)
- OpenSSL + ejecución por
exec()(si prefieres usar comandos del servidor)
¿Quieres que te prepare el snippet para firmar digitalmente este XML con xmlseclibs o prefieres una solución externa más sencilla?.
Muy bien. Ahora entramos al paso 3: Firmar el XML con XAdES-BES, exigido por la DIAN.
Snippet 3: Firmar XML UBL 2.1 con XAdES-BES usando PHP y xmlseclibs.
Requisitos previos.
- Certificado digital emitido por una entidad autorizada (archivo
.pfxo.p12). - Librería
xmlseclibs: puedes instalarla vía Composer o incluirla manualmente.
Pasos clave.
- Cargar el XML generado.
- Importar la clave privada y certificado.
- Firmar usando el estándar XAdES-BES (firma envolvente).
- Retornar el XML firmado.
1. Incluir xmlseclibs.
Si usas Composer:
composer require robrichards/xmlseclibs
O incluye manualmente:
require_once __DIR__ . '/xmlseclibs/xmlseclibs.php';
2. Función PHP para firmar XML.
Aquí tienes un ejemplo básico que puedes adaptar:
use RobRichards\XMLSecLibs\XMLSecurityDSig;
use RobRichards\XMLSecLibs\XMLSecurityKey;
function firmar_xml_xades($xmlPath, $pfxPath, $pfxPassword) {
// Cargar certificado
$pfx = file_get_contents($pfxPath);
openssl_pkcs12_read($pfx, $certs, $pfxPassword);
$doc = new DOMDocument();
$doc->load($xmlPath);
// Crear firma
$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
$objDSig->addReference(
$doc,
XMLSecurityDSig::SHA1,
['http://www.w3.org/2000/09/xmldsig#enveloped-signature'],
['force_uri' => true]
);
// Agregar clave privada
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, ['type'=>'private']);
$objKey->loadKey($certs['pkey'], false);
$objDSig->sign($objKey);
// Agregar certificado
$objDSig->add509Cert($certs['cert'], true, false, ['issuerSerial' => true]);
// Insertar la firma en el XML
$objDSig->appendSignature($doc->documentElement);
$firmadoPath = str_replace('.xml', '_firmado.xml', $xmlPath);
$doc->save($firmadoPath);
return $firmadoPath;
}
3. Uso en tu flujo WooCommerce.
Después de generar el XML:
$xml_sin_firma = generar_xml_ubl_dian($order);
file_put_contents($ruta_xml, $xml_sin_firma);
$xml_firmado = firmar_xml_xades($ruta_xml, '/ruta/certificado.pfx', 'tu_contraseña');
¿Qué sigue?
Paso 4: Enviar el XML firmado a la DIAN usando el WebService SOAP SendBillSync o SendTestSetAsync.
¿Te preparo el snippet de conexión SOAP con la DIAN y envío del XML firmado?.
Perfecto, ahora vamos con el paso 4: Enviar el XML firmado a la DIAN usando su WebService SOAP, tal como lo exige su entorno de producción o pruebas.
Snippet 4: Envío del XML firmado a la DIAN vía WebService SOAP (SendBillSync).
Este snippet se conecta al servicio de producción o pruebas de la DIAN, usando SoapClient de PHP, y envía el XML firmado.
1. Requisitos previos.
- Estás registrado como facturador electrónico.
- Ya tienes el archivo firmado (
_firmado.xml). - Tienes tu certificado digital.
- Estás usando uno de estos ambientes:
- Producción:
https://vpfe.dian.gov.co/WcfDianCustomerServices.svc?wsdl - Habilitación (pruebas):
https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc?wsdl
- Producción:
2. Snippet de Envío SOAP.
function enviar_xml_dian($xml_path, $wsdl_url) {
// Leer y codificar el XML firmado
$xml_firmado = file_get_contents($xml_path);
$base64_content = base64_encode($xml_firmado);
$nombre_archivo = basename($xml_path);
$params = [
'fileName' => $nombre_archivo,
'contentFile' => $base64_content,
];
try {
$client = new SoapClient($wsdl_url, [
'trace' => true,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
]);
$response = $client->__soapCall('SendBillSync', [$params]);
// Log de respuesta de la DIAN
error_log("Respuesta de DIAN:");
error_log(print_r($response, true));
return $response;
} catch (SoapFault $e) {
error_log("Error al enviar XML a DIAN: " . $e->getMessage());
return false;
}
}
3. Ejemplo de uso completo.
Después de firmar el XML:
$xml_firmado_path = firmar_xml_xades($ruta_xml, '/ruta/certificado.pfx', 'tu_clave');
$response = enviar_xml_dian(
$xml_firmado_path,
'https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc?wsdl' // Cambia a producción cuando estés listo
);
4. ¿Qué devuelve?.
El objeto $response incluirá:
- XML de validación
- Código de aceptación o rechazo
- Mensaje técnico o jurídico
- CUFE si fue aceptado
¿Qué sigue?.
Paso 5: Interpretar y almacenar la respuesta de la DIAN (cuándo fue aceptada, si hay errores, guardar el CUFE, etc.).
¿Te lo desarrollo también?.
Muy bien, ahora vamos con el paso 5: Interpretar y almacenar la respuesta de la DIAN, que es clave para manejar la aceptación o rechazo de la factura electrónica.
Paso 5: Interpretar la respuesta de la DIAN.
Una vez que envías el XML firmado a la DIAN, la DIAN devuelve una respuesta en formato XML. Debemos interpretar esta respuesta para saber si la factura fue aceptada o rechazada y guardar los resultados pertinentes como el CUFE (Código Único de Factura Electrónica).
1. Ejemplo de Respuesta de la DIAN:
La respuesta de la DIAN será algo similar a esto (en un XML de respuesta):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.dian.gov.co/">
<soapenv:Header/>
<soapenv:Body>
<web:SendBillSyncResponse>
<web:SendBillSyncResult>
<web:estado>1</web:estado> <!-- 1 = Aceptada, 2 = Rechazada -->
<web:mensaje>Factura aceptada</web:mensaje>
<web:cufe>1234567890123456789012345678901234567890123456</web:cufe>
<web:detalle></web:detalle>
</web:SendBillSyncResult>
</web:SendBillSyncResponse>
</soapenv:Body>
</soapenv:Envelope>
2. Función para procesar la respuesta:
A continuación, se crea una función para procesar la respuesta de la DIAN:
function procesar_respuesta_dian($response) {
// Verificar si la respuesta es válida
if (isset($response->SendBillSyncResult)) {
$resultado = $response->SendBillSyncResult;
// Obtener el estado de la respuesta
$estado = (string)$resultado->estado;
$mensaje = (string)$resultado->mensaje;
$cufe = (string)$resultado->cufe;
$detalle = (string)$resultado->detalle;
// Registrar respuesta de la DIAN
if ($estado == '1') {
// Factura aceptada
error_log("Factura aceptada: CUFE: " . $cufe);
// Aquí puedes guardar el CUFE en la base de datos del pedido
// update_post_meta($order_id, '_cufe', $cufe);
} else {
// Factura rechazada
error_log("Factura rechazada: " . $mensaje);
// Aquí puedes registrar el mensaje de error y detalles
// update_post_meta($order_id, '_dian_error', $mensaje);
}
} else {
error_log("Respuesta de DIAN no válida.");
}
}
3. Uso dentro del flujo completo:
Después de obtener la respuesta del envío SOAP, procesa la respuesta para decidir si la factura fue aceptada o rechazada.
// Enviar el XML firmado a la DIAN
$response = enviar_xml_dian($xml_firmado_path, 'https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc?wsdl');
// Procesar la respuesta de la DIAN
procesar_respuesta_dian($response);
4. Explicación de la respuesta:
- estado: Es el resultado de la validación:
1: Aceptada2: Rechazada
- mensaje: Mensaje técnico o jurídico sobre el estado de la factura.
- cufe: El Código Único de Factura Electrónica, asignado cuando la factura es aceptada.
- detalle: Detalles adicionales si la factura fue rechazada.
5. Almacenaje y manejo de datos en WooCommerce:
- CUFE: Almacena el CUFE en los metadatos del pedido para hacer seguimiento.
- Errores: Si la factura es rechazada, puedes almacenar el error en los metadatos del pedido para su revisión.
// Para almacenar el CUFE en el pedido
update_post_meta($order_id, '_dian_cufe', $cufe);
// Para almacenar el mensaje de error si fue rechazada
if ($estado == '2') {
update_post_meta($order_id, '_dian_error', $mensaje);
}
Conclusión:
Con esta secuencia de pasos (y los correspondientes snippets):
- Capturas un pedido de WooCommerce.
- Generas el XML de la factura electrónica.
- Lo firmas digitalmente.
- Lo envías a la DIAN mediante su Web Service SOAP.
- Interpretas la respuesta, y almacenas el resultado (aceptación/rechazo) y el CUFE en los metadatos del pedido.
Este flujo debería permitirte emitir facturas electrónicas válidas en WooCommerce y conectar tu tienda con la DIAN de Colombia.
🧐 Estudio de Viabilidad para Integración de Facturación Electrónica DIAN con WooCommerce (PHP).
La integración de la facturación electrónica de la DIAN (Dirección de Impuestos y Aduanas Nacionales de Colombia) con una tienda WooCommerce (construida sobre WordPress) es viable y necesaria para el cumplimiento de la normativa fiscal vigente.
🟢 Aspectos Positivos (Viabilidad Técnica y Comercial).
- Existencia de Soluciones y Precedentes: Ya existen soluciones y servicios de proveedores tecnológicos que ofrecen plugins o integraciones preconstruidas para WooCommerce y la DIAN (como se menciona en los resultados de búsqueda). Esto reduce significativamente la complejidad y el tiempo de desarrollo.
- Desarrollo Propio (Opción PHP): Es técnicamente posible construir un desarrollo propio utilizando PHP (el lenguaje de WordPress y WooCommerce) para interactuar con el Web Service o API de la DIAN. Esto permite una personalización completa del flujo de facturación.
- La DIAN ofrece una guía y herramientas para el consumo de sus Web Services.
- Existen tutoriales y ejemplos de implementación en PHP que abordan la estructura del XML (formato UBL) requerido, la gestión de certificados digitales, y el manejo de respuestas de la DIAN.
- Automatización: La integración permite la automatización completa de la emisión de la factura electrónica al finalizar una compra en WooCommerce, mejorando la eficiencia operativa y el cumplimiento.
- Ecosistema WordPress/WooCommerce: La flexibilidad de WooCommerce y su capacidad de integración con plugins de terceros facilitan la conexión con sistemas externos de contabilidad y facturación (como Alegra o Siigo, que a su vez se integran con la DIAN).
🔴 Desafíos y Consideraciones (Riesgos y Esfuerzo).
| Desafío | Descripción | Solución/Mitigación |
| Cumplimiento Normativo | La normativa de la DIAN (especificaciones UBL, manejo de prefijos, rangos, etc.) es estricta y puede cambiar, requiriendo actualizaciones constantes. | Contratar un Proveedor Tecnológico Autorizado (PTA) o un desarrollador con experiencia previa en el Web Service de la DIAN. |
| Seguridad y Certificados | Manejo seguro del Certificado Digital de la empresa y la configuración de la seguridad WS-Security para la conexión con el servidor de la DIAN. | Implementar prácticas de codificación segura, no exponer credenciales o certificados, y almacenarlos de forma cifrada. |
| Flujo de Trabajo | Asegurar que la factura se genere solo cuando el pedido en WooCommerce esté en el estado correcto (ej. «Completado») y manejar los errores de comunicación con la DIAN. | Utilizar los Hooks de Acción de WooCommerce (ej. woocommerce_payment_complete) para disparar la generación y prever un mecanismo de reintento para fallos temporales. |
| Complejidad del XML | El estándar UBL 2.1 (el formato XML de la factura electrónica DIAN) es complejo y requiere mapear correctamente todos los campos de WooCommerce (cliente, productos, impuestos) al esquema DIAN. | Usar una librería PHP que facilite la construcción del XML UBL o basarse en código probado para esta tarea. |
📝 Conclusión y Opciones de Implementación.
La integración es altamente viable y es un requisito legal para la mayoría de los comercios electrónicos en Colombia. La decisión se centra en la metodología de implementación:
- ✅ Opción Recomendada (Bajo Riesgo): Usar un Plugin/Servicio de Proveedor Tecnológico (PTA): Es la vía más rápida y con menos riesgo de incumplimiento, ya que el proveedor se encarga de la complejidad técnica y las actualizaciones normativas.
- 🟡 Opción de Desarrollo Propio (Alto Esfuerzo): Desarrollo a la medida en PHP: Viable para empresas con recursos de desarrollo interno o necesidades muy específicas. Requiere un conocimiento profundo del API/WS de la DIAN, el estándar UBL y una inversión de tiempo significativa en desarrollo y mantenimiento. El snippet PHP en este caso sería un conector personalizado que toma los datos del pedido de WooCommerce y los transforma en el XML UBL para el envío.
Este video explora parte del proceso de conexión y configuración para la facturación electrónica con la DIAN usando WooCommerce y un plugin de un proveedor tecnológico: Plugin tienda virtual v3.0 – Woocommerce + Facturación Electrónica DIAN Colombia.
Es importante destacar que no hay un software «mejor» para todos los casos, ya que la elección depende de las necesidades específicas, el tamaño y el presupuesto de cada empresa. Sin embargo, Siigo es un proveedor tecnológico y de software contable muy popular y robusto en Colombia, y su facturación electrónica es considerada mejor por muchas empresas por las siguientes razones:
🌟 Ventajas Clave de la Facturación Electrónica con Siigo
1. Módulo Contable y Administrativo Integrado (Enfoque Integral)
Siigo no es solo una herramienta de facturación, sino un software contable y administrativo integral (ERP). Esta es su mayor ventaja frente a soluciones de facturación pura:
- Sincronización Automática: Al emitir una factura electrónica, el sistema actualiza automáticamente la contabilidad, el inventario (descuenta el stock) y la cartera (crea la cuenta por cobrar). Esto elimina la doble digitación y el riesgo de errores.
- Reportes Completos: Puedes generar reportes financieros, de ventas, de costos e indicadores de rendimiento en tiempo real y con información consolidada, facilitando la toma de decisiones.
2. Cumplimiento Normativo y Soporte DIAN
Como Proveedor Tecnológico Autorizado (PTA) de larga trayectoria en Colombia, Siigo se encarga de:
- Actualizaciones Legislativas: Mantiene el software actualizado de forma automática con los últimos anexos técnicos y resoluciones de la DIAN (ej. cambios en la Nómina Electrónica, Documento Soporte o UBL), garantizando que tu empresa siempre esté al día.
- Validación Previa: Asegura que la factura cumpla con el formato XML UBL, tenga el CUFE y pase la validación de la DIAN antes de ser enviada al cliente.
3. Escalabilidad y Variedad de Soluciones
Siigo ofrece una gama amplia de productos que se adaptan a distintas etapas del negocio:
- Para Pymes y Empresas Medianas: Su versión Siigo Nube es modular y escalable, lo que permite a una empresa pequeña crecer sin cambiar de software, añadiendo módulos como POS (Punto de Venta), Nómina Electrónica o Conciliación Bancaria a medida que se necesitan.
- Siigo POS: Ofrecen una solución robusta para ventas en puntos físicos que se integra perfectamente con la facturación electrónica.
4. Facilidad de Uso y Acceso en la Nube
- Cloud (Nube): Funciona 100% en la nube, permitiendo al empresario o contador acceder y gestionar la facturación y la contabilidad desde cualquier lugar y dispositivo.
- Interfaz: Aunque algunos usuarios reportan una curva de aprendizaje inicial, la interfaz está diseñada para simplificar la creación de facturas electrónicas en pocos clics.
⚠️ Consideraciones (En comparación con otros)
Si bien Siigo tiene muchas ventajas, es útil mencionar los puntos que podrían inclinar la balanza hacia otras opciones (como Alegra o Loggro) en ciertos casos:
- Costo: Los planes de Siigo, especialmente al añadir módulos o usuarios adicionales, tienden a ser más costosos que algunas de sus competencias enfocadas exclusivamente en pymes o freelancers.
- Soporte: Las opiniones sobre la calidad del soporte técnico pueden variar, siendo un factor clave para usuarios menos técnicos.
- Enfoque de Usuario: Si bien es muy completo, otros software como Alegra suelen ser percibidos como más sencillos e intuitivos para un emprendedor o persona sin conocimientos contables profundos que solo necesita facturar.
En resumen: Siigo es una excelente opción si buscas una solución integral, robusta y escalable que se encargue de la facturación y la contabilidad de tu negocio bajo el cumplimiento estricto de la DIAN.
Si tienes alguna otra pregunta o necesitas ayuda con algún otro aspecto de la integración, ¡Avísame!