Sandbox sobre la preproducción de la AEAT · sin tarjeta · Primera factura en 5 minutos
verifactu.co

Integración · VB6 y VBA

VeriFactu en VB6 y VBA

El ejemplo completo de registrar una factura y reaccionar al resultado, con MSXML2.ServerXMLHTTP.

¿Cómo se integra VeriFactu en VB6 y VBA?

Con una petición HTTP POST a /v1/registros enviando los datos de la factura en JSON y la clave de API en la cabecera Authorization. La respuesta trae la huella y la URL del QR para imprimir.

Lo único que hay que cuidar en cualquier lenguaje es usar tipos decimales exactos para los importes, enviar una cabecera Idempotency-Key y no bloquear la impresión de la factura esperando la respuesta de la AEAT.

01 Registrar una factura MSXML2.ServerXMLHTTP

Aquí es donde nos separamos del resto. Hay muchísimo software de facturación español escrito en VB6, Access o Excel que factura todos los días y que nadie va a reescribir por un cambio normativo. Puede llamar a una API REST perfectamente, y con esto cumple.

VB6 y VBA
' VB6 / VBA — MSXML2.ServerXMLHTTP
' Sirve igual en Access, Excel y aplicaciones de escritorio
' que llevan veinte años facturando y no se van a reescribir.

Public Function VfRegistrar(json As String) As String
    Dim http As Object
    Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    http.Open "POST", "https://api.verifactu.co/v1/registros", False
    http.setRequestHeader "Authorization", "Bearer " & VF_CLAVE
    http.setRequestHeader "Content-Type", "application/json"

    ' Sin esto, un reintento del usuario duplica el registro
    http.setRequestHeader "Idempotency-Key", NumeroFactura

    ' TLS 1.2: en equipos antiguos hay que forzarlo o falla
    ' la conexión sin un error que se entienda.
    http.setOption 2, 13056

    http.send json

    If http.Status >= 400 Then
        Err.Raise vbObjectError + 1, "VfRegistrar", http.responseText
    End If

    VfRegistrar = http.responseText
End Function
02 Lo que hay que respetar En cualquier lenguaje
01

Idempotency-Key siempre

Usa el número de factura. Un reintento tuyo sin esa cabecera crea un segundo registro con su propia huella, y en una cadena encadenada eso no se deshace.

02

Decimales exactos, no coma flotante

decimal, BigDecimal o enteros de céntimos. Un double produce importes que no cuadran con la huella y el registro queda «aceptado con errores».

03

Timeout en la petición

Una llamada sin timeout dentro del flujo de emisión puede colgar la factura del usuario. Quince segundos sobran.

04

Imprime con el 201, no esperes a la AEAT

La huella y el QR ya vienen en la respuesta y no cambian con el resultado de la remisión. Bloquear la impresión es un error de diseño.

Última revisión normativa: Especificaciones de huella AEAT v0.1.2 Revisado por el equipo técnico de verifactu.co