Deprecated: ¡La función WP_Dependencies->add_data() ha sido llamada con un argumento que está obsoleto desde la versión 6.9.0! IE conditional comments are ignored by all supported browsers. in /home/factuz/public_html/blog/wp-includes/functions.php on line 6131
Guía para Implementar Código QR BCD con Referencia RF en Facturas - Factuz.com

Guía para Implementar Código QR BCD con Referencia RF en Facturas

1. Introducción

El código QR BCD (Banking Contact Data) es un formato estándar europeo para pagos SEPA, que permite a los clientes escanear un QR desde su app bancaria y que todos los datos de la transferencia se completen automáticamente:

  • IBAN del beneficiario
  • Importe exacto
  • Referencia de pago (estructurada o libre)
  • Concepto opcional

En esta guía aprenderás a:

  1. Generar la referencia estructurada RF con dígitos de control.
  2. Crear el texto BCD con los datos del pago.
  3. (Opcional) Generar la imagen QR lista para imprimir en la factura.

2. Estructura del Código BCD

El QR contiene un texto plano con formato fijo, cada campo separado por salto de línea \n.

BCD
002
1
SCT
<BIC del banco receptor>
<Nombre del beneficiario>
<IBAN del beneficiario>
<EUR + importe>
<Referencia de pago>
<Concepto opcional>

Ejemplo:

BCD
002
1
SCT
BE12XXXX1234XXXXXX
Factuz SRL.
BE55363148895444
EUR7420.00
RF18+++000/2025/15485+++
Factura 15485

3. Cálculo de la Referencia RF

La referencia RF se calcula siguiendo el estándar ISO 11649:

function doc_models_calculate_rf_reference($raw_reference) {
    // Limpia espacios y caracteres no válidos
    $clean_ref = preg_replace('/[^0-9A-Za-z]/', '', strtoupper($raw_reference));

    // Añadir 'RF00' temporalmente
    $temp_ref = $clean_ref . 'RF00';

    // Mover 4 primeras posiciones al final
    $temp_ref_rearranged = substr($temp_ref, 4) . substr($temp_ref, 0, 4);

    // Convertir letras a números (A=10, ..., Z=35)
    $numeric_ref = '';
    foreach (str_split($temp_ref_rearranged) as $char) {
        if (ctype_alpha($char)) {
            $numeric_ref .= ord($char) - 55;
        } else {
            $numeric_ref .= $char;
        }
    }

    // Calcular dígitos de control
    $check_digits = 98 - bcmod($numeric_ref, '97');

    // Retornar en formato RFNNxxxxxxxx
    return 'RF' . str_pad($check_digits, 2, '0', STR_PAD_LEFT) . $clean_ref;
}

Ejemplo:

echo doc_models_calculate_rf_reference("+++000/2025/15485+++");
// RF18+++000/2025/15485+++

4. Generación del Texto BCD

function doc_models_generate_bcd_text($bic, $beneficiary, $iban, $amount, $rf_reference, $remittance_info = '') {
    $bcd  = "BCD\n";
    $bcd .= "002\n"; // Versión
    $bcd .= "1\n";   // Carácter de codificación UTF-8
    $bcd .= "SCT\n"; // Tipo de transferencia SEPA
    $bcd .= strtoupper($bic) . "\n";
    $bcd .= $beneficiary . "\n";
    $bcd .= strtoupper(str_replace(' ', '', $iban)) . "\n";
    $bcd .= "EUR" . number_format($amount, 2, '.', '') . "\n";
    $bcd .= $rf_reference . "\n";
    $bcd .= $remittance_info;

    return $bcd;
}

Ejemplo:

$rf = doc_models_calculate_rf_reference("+++000/2025/15485+++");

$bcd_text = doc_models_generate_bcd_text(
    "BE12XXXX1234XXXXXX",
    "Factuz SRL.",
    "BE55363148895444",
    7420.00,
    $rf,
    "Factura 15485"
);

echo nl2br($bcd_text);

5. Generar el QR en PNG

require 'phpqrcode/qrlib.php'; // Librería QR

$filename = "qr_factura.png";
QRcode::png($bcd_text, $filename, QR_ECLEVEL_M, 4);

echo "<img src='$filename'>";

6. Uso Práctico en Factura

  1. En tu modelo de factura, calcula la referencia RF:
    $rf = doc_models_calculate_rf_reference("+++000/2025/15485+++");
    
  2. Genera el texto BCD:
    $bcd = doc_models_generate_bcd_text($bic, $empresa, $iban, $total, $rf, "Factura 15485");
    
  3. Crea el QR y añádelo al PDF.

7. Beneficios

  • Evita errores al teclear datos bancarios.
  • Acelera el pago por parte del cliente.
  • Cumple con el estándar europeo EPC QR Code.

 

Deja un comentario