Ir al contenido
ReferenciaErrores
Sello del hash CS42zL8vDat9koYpgRdv2S8uIWU=ra-invoices-same-day · DIGESTVALUE · CS42zL8vDat9koYpgRdv2S8uIWU= ·

Ejemplos / Comunicación de baja (RA) / Caso 19 de 21

Comunicación de baja de tres facturas

Tres facturas del mismo día en una sola comunicación, cada una con su motivo: operación no realizada, error en la descripción y duplicado de emisión.

Firma este JSON con el certificado de prueba y tu DigestValue tiene que ser CS42zL8vDat9koYpgRdv2S8uIWU=. El sello es ese valor, dibujado.

Los tres archivos, en el repositorio: el JSON de entrada, el XML sin firmar y el XML firmado.

A diferencia de la factura, no vuelve con la CDR: sunat-sdk summary devuelve un ticket, y con sunat-sdk ticket preguntas hasta que la traiga; con 98 se pregunta otra vez, no se reenvía. Desde PHP, con summary() y ticket() (Paso a producción).

Entrada en JSON

Marcadas, las líneas que cambian respecto del caso más parecido, Comunicación de baja de una factura; lo igual queda plegado.

fixtures/ra-invoices-same-day.json
{  "kind": "voided",  "number": "2",
MostrarOcultar las líneas 4 a 22
  "generation_date": "2026-10-14",  "communication_date": "2026-10-15",  "issuer": {    "ruc": "20123456789",    "legal_name": "EMPRESA DEMO ORACULO S.A.C.",    "trade_name": "DEMO ORACULO",    "email": "facturacion@example.com",    "telephone": "014000000",    "address": {      "ubigeo": "150101",      "country_code": "PE",      "department": "LIMA",      "province": "LIMA",      "district": "LIMA",      "urbanization": "-",      "street": "AV. EJEMPLO 123",      "establishment_code": "0000"    }  },
  "lines": [    {      "document_type": "01",      "series": "F001",      "number": "124",      "reason": "OPERACION NO REALIZADA"    },    {      "document_type": "01",      "series": "F001",      "number": "125",      "reason": "ERROR EN LA DESCRIPCION"    },    {      "document_type": "01",      "series": "F001",      "number": "126",      "reason": "DUPLICADO DE EMISION"    }  ]}

XML sin firmar

Marcadas, las líneas que cambian respecto de Comunicación de baja de una factura.

tests/vectors/ra-invoices-same-day.unsigned.xml
<?xml version="1.0" encoding="utf-8"?><VoidedDocuments xmlns="urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">  <ext:UBLExtensions>    <ext:UBLExtension>      <ext:ExtensionContent/>    </ext:UBLExtension>  </ext:UBLExtensions>  <cbc:UBLVersionID>2.0</cbc:UBLVersionID>  <cbc:CustomizationID>1.0</cbc:CustomizationID>  <cbc:ID>RA-20261015-2</cbc:ID>
MostrarOcultar las líneas 11 a 37
  <cbc:ReferenceDate>2026-10-14</cbc:ReferenceDate>  <cbc:IssueDate>2026-10-15</cbc:IssueDate>  <cac:Signature>    <cbc:ID>IDSignKG</cbc:ID>    <cac:SignatoryParty>      <cac:PartyIdentification>        <cbc:ID>20123456789</cbc:ID>      </cac:PartyIdentification>      <cac:PartyName>        <cbc:Name><![CDATA[EMPRESA DEMO ORACULO S.A.C.]]></cbc:Name>      </cac:PartyName>    </cac:SignatoryParty>    <cac:DigitalSignatureAttachment>      <cac:ExternalReference>        <cbc:URI>#signatureKG</cbc:URI>      </cac:ExternalReference>    </cac:DigitalSignatureAttachment>  </cac:Signature>  <cac:AccountingSupplierParty>    <cbc:CustomerAssignedAccountID>20123456789</cbc:CustomerAssignedAccountID>    <cbc:AdditionalAccountID>6</cbc:AdditionalAccountID>    <cac:Party>      <cac:PartyLegalEntity>        <cbc:RegistrationName><![CDATA[EMPRESA DEMO ORACULO S.A.C.]]></cbc:RegistrationName>      </cac:PartyLegalEntity>    </cac:Party>  </cac:AccountingSupplierParty>
  <sac:VoidedDocumentsLine>    <cbc:LineID>1</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>124</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[OPERACION NO REALIZADA]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine>  <sac:VoidedDocumentsLine>    <cbc:LineID>2</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>125</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[ERROR EN LA DESCRIPCION]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine>  <sac:VoidedDocumentsLine>    <cbc:LineID>3</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>126</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[DUPLICADO DE EMISION]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine></VoidedDocuments>

Formateado para leerlo. «Copiar» copia el archivo tal como está en el repositorio, en una línea.

Firma

Firmado con el certificado de prueba del SDK, el que baja la guía de inicio.

Sello del hash CS42zL8vDat9koYpgRdv2S8uIWU=

CS42zL8vDat9koYpgRdv2S8uIWU=

Si tu DigestValue es este, tu XML es el mismo que el del SDK. Con el certificado de prueba el SignatureValue también coincide; con el tuyo cambia, porque depende de tu clave.

DigestValue
CS42zL8vDat9koYpgRdv2S8uIWU=
SignatureValue
T44zdv6HtjVCEw+gHEc8WL6mA/LWEvCxTjw7gfaCzYujU/uroz8eOX4m831HeUEt+v1Jh0EzRmF1K7okOTxTN/8T8ARfQQJPxbeNeMfSAixzOJn4fIqHT+iBujwhntIVQ2S0NvAXMmWDUsobbjihDapylpkkvwOYmapyKiIYaq2zCvoYnprp0ijS0NUk9/KNowo1YycaKX8QRsyTrD2KRntHwqYQldOCjfer1rBs7A/muSShOYeLjk8ga9ZlYLnxxksT7sWnktMUWJOPBISsRBfU7BfaGvSKIsJpn4cgBbqx8CPNAzf95pUVaBH18TnuMVz/ly0n62HcGQLzYUFj9Q==

XML firmado

tests/vectors/ra-invoices-same-day.signed.xml
<?xml version="1.0" encoding="utf-8"?><VoidedDocuments xmlns="urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">  <ext:UBLExtensions>    <ext:UBLExtension>      <ext:ExtensionContent>        <ds:Signature Id="signatureKG">          <ds:SignedInfo>            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>            <ds:Reference URI="">              <ds:Transforms>                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>              </ds:Transforms>              <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>              <ds:DigestValue>CS42zL8vDat9koYpgRdv2S8uIWU=</ds:DigestValue>            </ds:Reference>          </ds:SignedInfo>          <ds:SignatureValue>T44zdv6HtjVCEw+gHEc8WL6mA/LWEvCxTjw7gfaCzYujU/uroz8eOX4m831HeUEt+v1Jh0EzRmF1K7okOTxTN/8T8ARfQQJPxbeNeMfSAixzOJn4fIqHT+iBujwhntIVQ2S0NvAXMmWDUsobbjihDapylpkkvwOYmapyKiIYaq2zCvoYnprp0ijS0NUk9/KNowo1YycaKX8QRsyTrD2KRntHwqYQldOCjfer1rBs7A/muSShOYeLjk8ga9ZlYLnxxksT7sWnktMUWJOPBISsRBfU7BfaGvSKIsJpn4cgBbqx8CPNAzf95pUVaBH18TnuMVz/ly0n62HcGQLzYUFj9Q==</ds:SignatureValue>          <ds:KeyInfo>            <ds:X509Data>              <ds:X509Certificate>MIID8zCCAtugAwIBAgIUY968iRS4gHDjt9RwTaDaujmFLO0wDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlBFMS8wLQYDVQQKDCZURVNUIE9OTFkgLSBOT1QgVkFMSUQgRk9SIEFOWSBUQVhQQVlFUjESMBAGA1UECwwJVEVTVCBPTkxZMRQwEgYDVQQFEwsyMDAwMDAwMDAwMTEeMBwGA1UEAwwVVEVTVCBPTkxZIDIwMDAwMDAwMDAxMB4XDTI2MTAxNTIxMjc0NVoXDTM2MTAxMjIxMjc0NVowgYgxCzAJBgNVBAYTAlBFMS8wLQYDVQQKDCZURVNUIE9OTFkgLSBOT1QgVkFMSUQgRk9SIEFOWSBUQVhQQVlFUjESMBAGA1UECwwJVEVTVCBPTkxZMRQwEgYDVQQFEwsyMDAwMDAwMDAwMTEeMBwGA1UEAwwVVEVTVCBPTkxZIDIwMDAwMDAwMDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6GZTtpFyih4C6ETakE6Q4+SFBFWJ/TQi2pbxJRD7GkQ1tKeB+ENcBk8EjnOocxdYWvSBpOd9UYkpc2C+jlbVWd04ey8psznwCHzJJ1+qgQqVI8PpH5A4eEw5LGXupHmnJSYpGXFGIJ6+tlJRqvZbq7RTh7Rpxs4DkCjUhUke/BKIZahYDzSGFLlsWx01Dq8Xeb6xF2sLlZXy/b0MvRZAe7I/xplIftS/rrDQ/rE5DfS0Dibayc/uNIRw1+NiKpT0wwY/VCzRQrM27dG7sTyhNAy6C3vtRmO5Bl9+0wrXldZcR4VSm1yrg65KRWv6DNcG2MkxRYBphaM+sJfkNECs6wIDAQABo1MwUTAdBgNVHQ4EFgQUE359gu7BEXWLRhx+VNBeec2Pp/kwHwYDVR0jBBgwFoAUE359gu7BEXWLRhx+VNBeec2Pp/kwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAzjWgukifoL9gZckM2jWW7a+N6+5W/0EkGJVFV9RbCceNpDpdMyVD4QyVm1nOJ/bQzOLdDnjyD3J34/1pEwo/hS/HehPy50twvf/uKEwPU4TNQTyjChnM3k+IX7cOusuPIBsC6trufeHOSky5lWiKWusMHo8VsPvVinE0n/RqTo47enHPFa6huF3egiQEJ6H+lxerXvWT8IkaGFA2YKjAGGsenlCSw9rRGX4tzQtUkJx0oFaEZGNpq+OYr334J3cZp9LskUFnrvRoAz3Fk8HdbVlfQTovFunFY9VzxbKjBfyWa6hymTxcvBR9x4ZfUKM9P3REeBKaTWdqe2oz4d6LLA==</ds:X509Certificate>            </ds:X509Data>          </ds:KeyInfo>        </ds:Signature>      </ext:ExtensionContent>    </ext:UBLExtension>  </ext:UBLExtensions>  <cbc:UBLVersionID>2.0</cbc:UBLVersionID>  <cbc:CustomizationID>1.0</cbc:CustomizationID>  <cbc:ID>RA-20261015-2</cbc:ID>  <cbc:ReferenceDate>2026-10-14</cbc:ReferenceDate>  <cbc:IssueDate>2026-10-15</cbc:IssueDate>  <cac:Signature>    <cbc:ID>IDSignKG</cbc:ID>    <cac:SignatoryParty>      <cac:PartyIdentification>        <cbc:ID>20123456789</cbc:ID>      </cac:PartyIdentification>      <cac:PartyName>        <cbc:Name><![CDATA[EMPRESA DEMO ORACULO S.A.C.]]></cbc:Name>
Mostrar las 39 líneas restantes (79 en total)
      </cac:PartyName>    </cac:SignatoryParty>    <cac:DigitalSignatureAttachment>      <cac:ExternalReference>        <cbc:URI>#signatureKG</cbc:URI>      </cac:ExternalReference>    </cac:DigitalSignatureAttachment>  </cac:Signature>  <cac:AccountingSupplierParty>    <cbc:CustomerAssignedAccountID>20123456789</cbc:CustomerAssignedAccountID>    <cbc:AdditionalAccountID>6</cbc:AdditionalAccountID>    <cac:Party>      <cac:PartyLegalEntity>        <cbc:RegistrationName><![CDATA[EMPRESA DEMO ORACULO S.A.C.]]></cbc:RegistrationName>      </cac:PartyLegalEntity>    </cac:Party>  </cac:AccountingSupplierParty>  <sac:VoidedDocumentsLine>    <cbc:LineID>1</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>124</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[OPERACION NO REALIZADA]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine>  <sac:VoidedDocumentsLine>    <cbc:LineID>2</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>125</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[ERROR EN LA DESCRIPCION]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine>  <sac:VoidedDocumentsLine>    <cbc:LineID>3</cbc:LineID>    <cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>    <sac:DocumentSerialID>F001</sac:DocumentSerialID>    <sac:DocumentNumberID>126</sac:DocumentNumberID>    <sac:VoidReasonDescription><![CDATA[DUPLICADO DE EMISION]]></sac:VoidReasonDescription>  </sac:VoidedDocumentsLine></VoidedDocuments>

Formateado para leerlo. «Copiar» copia el archivo tal como está en el repositorio.

Reproducirlo

Con el SDK instalado como dice la guía de inicio, baja el caso y el certificado de prueba:

Terminal
curl -fsSL --remote-name-all \  https://fe.kembec.com/sdk/v0.1.0-beta.5/ra-invoices-same-day.json \  https://fe.kembec.com/sdk/v0.1.0-beta.5/test-cert.pem \  https://fe.kembec.com/sdk/v0.1.0-beta.5/test-key.pem

Fírmalo como en la guía: tu DigestValue tiene que ser el de arriba.

PHP

En firmar.php, la línea del JSON queda así:

firmar.php
$factura = file_get_contents(__DIR__ . '/ra-invoices-same-day.json');
Terminal
php firmar.php

JavaScript

En firmar.mjs, la línea del JSON queda así:

firmar.mjs
const built = JSON.parse(sdk.build(leer('ra-invoices-same-day.json')));
Terminal
node firmar.mjs

Python

En firmar.py, la línea del JSON queda así:

firmar.py
built = sunat_sdk.build(leer('ra-invoices-same-day.json'))
Terminal
python firmar.py

CLI

Terminal
sunat-sdk build < ra-invoices-same-day.json \  | sunat-sdk sign --cert test-cert.pem --key test-key.pem > firmada.jsongrep -o '"digest_value":"[^"]*"' firmada.jsongrep -q '"digest_value":"CS42zL8vDat9koYpgRdv2S8uIWU="' firmada.json && echo "digest ok"