Ir al contenido
ReferenciaErrores
Sello del hash O8oaqNqnaRbwFsRoWt2f1FFyXcw=rc-credit-note-reference · DIGESTVALUE · O8oaqNqnaRbwFsRoWt2f1FFyXcw= ·

Ejemplos / Resumen diario (RC) / Caso 15 de 21

Resumen diario con una nota de crédito

La nota de crédito B001-3, informada con estado 1 y con la boleta que modifica, la B001-1 del resumen de dos boletas, como documento de referencia.

Firma este JSON con el certificado de prueba y tu DigestValue tiene que ser O8oaqNqnaRbwFsRoWt2f1FFyXcw=. 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, Resumen diario con exoneradas e inafectas; lo igual queda plegado.

fixtures/rc-credit-note-reference.json
{  "kind": "summary",  "number": "2",
MostrarOcultar las líneas 4 a 23
  "generation_date": "2026-10-15",  "reference_date": "2026-10-14",  "currency": "PEN",  "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": "07",      "document_number": "B001-3",      "status": "1",      "customer_document_type": "1",      "customer_document_number": "12345678",      "reference_document": {        "document_type": "03",        "document_number": "B001-1"      },      "total": "30.00",      "taxed": "25.42",      "igv": "4.58"    }  ]}

XML sin firmar

Marcadas, las líneas que cambian respecto de Resumen diario con exoneradas e inafectas.

tests/vectors/rc-credit-note-reference.unsigned.xml
<?xml version="1.0" encoding="utf-8"?><SummaryDocuments xmlns="urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1">  <ext:UBLExtensions>    <ext:UBLExtension>      <ext:ExtensionContent/>    </ext:UBLExtension>  </ext:UBLExtensions>  <cbc:UBLVersionID>2.0</cbc:UBLVersionID>  <cbc:CustomizationID>1.1</cbc:CustomizationID>  <cbc:ID>RC-20261015-2</cbc:ID>
MostrarOcultar las líneas 11 a 39
  <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:SummaryDocumentsLine>    <cbc:LineID>1</cbc:LineID>
    <cbc:DocumentTypeCode>07</cbc:DocumentTypeCode>    <cbc:ID>B001-3</cbc:ID>    <cac:AccountingCustomerParty>      <cbc:CustomerAssignedAccountID>12345678</cbc:CustomerAssignedAccountID>      <cbc:AdditionalAccountID>1</cbc:AdditionalAccountID>    </cac:AccountingCustomerParty>    <cac:BillingReference>      <cac:InvoiceDocumentReference>        <cbc:ID>B001-1</cbc:ID>        <cbc:DocumentTypeCode>03</cbc:DocumentTypeCode>      </cac:InvoiceDocumentReference>    </cac:BillingReference>    <cac:Status>      <cbc:ConditionCode>1</cbc:ConditionCode>    </cac:Status>    <sac:TotalAmount currencyID="PEN">30.00</sac:TotalAmount>    <sac:BillingPayment>      <cbc:PaidAmount currencyID="PEN">25.42</cbc:PaidAmount>      <cbc:InstructionID>01</cbc:InstructionID>    </sac:BillingPayment>    <cac:TaxTotal>      <cbc:TaxAmount currencyID="PEN">4.58</cbc:TaxAmount>      <cac:TaxSubtotal>        <cbc:TaxAmount currencyID="PEN">4.58</cbc:TaxAmount>        <cac:TaxCategory>          <cac:TaxScheme>            <cbc:ID>1000</cbc:ID>            <cbc:Name>IGV</cbc:Name>            <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>          </cac:TaxScheme>        </cac:TaxCategory>      </cac:TaxSubtotal>    </cac:TaxTotal>  </sac:SummaryDocumentsLine></SummaryDocuments>

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 O8oaqNqnaRbwFsRoWt2f1FFyXcw=

O8oaqNqnaRbwFsRoWt2f1FFyXcw=

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
O8oaqNqnaRbwFsRoWt2f1FFyXcw=
SignatureValue
tlgZhxwl/bx+QjQhtnaF8XheLYcjQg09wnJcCoH28TwI9PV2sdt7j9oxwFIQgQNOvAXMJYmgN+GjoZS149SHHQmGY35H9G+EQ0NkvaIIoTRg5M6I3uxWPr270L4ysxvSGOWPuax2tGYHDyPqyEjAm+rMpggpDCJ3vpqDzL7ED9yBxTIvvhnkZ5WHGeJe1EYb8JAOQQtUt0TGzJu60Gkv4kagWnC6RzZXykwfMqtOsXQa/iF7ujIUd9qxInppUguLM+Tf5TrmNssbQu9yp6m26B1a65M4hiIC2FP6a/7Y/NgePXI4q5KVEwyJqoR3ww7AdWqBosi9zG9WAE18MAf/2g==

XML firmado

tests/vectors/rc-credit-note-reference.signed.xml
<?xml version="1.0" encoding="utf-8"?><SummaryDocuments xmlns="urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1">  <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>O8oaqNqnaRbwFsRoWt2f1FFyXcw=</ds:DigestValue>            </ds:Reference>          </ds:SignedInfo>          <ds:SignatureValue>tlgZhxwl/bx+QjQhtnaF8XheLYcjQg09wnJcCoH28TwI9PV2sdt7j9oxwFIQgQNOvAXMJYmgN+GjoZS149SHHQmGY35H9G+EQ0NkvaIIoTRg5M6I3uxWPr270L4ysxvSGOWPuax2tGYHDyPqyEjAm+rMpggpDCJ3vpqDzL7ED9yBxTIvvhnkZ5WHGeJe1EYb8JAOQQtUt0TGzJu60Gkv4kagWnC6RzZXykwfMqtOsXQa/iF7ujIUd9qxInppUguLM+Tf5TrmNssbQu9yp6m26B1a65M4hiIC2FP6a/7Y/NgePXI4q5KVEwyJqoR3ww7AdWqBosi9zG9WAE18MAf/2g==</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.1</cbc:CustomizationID>  <cbc:ID>RC-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 54 líneas restantes (94 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:SummaryDocumentsLine>    <cbc:LineID>1</cbc:LineID>    <cbc:DocumentTypeCode>07</cbc:DocumentTypeCode>    <cbc:ID>B001-3</cbc:ID>    <cac:AccountingCustomerParty>      <cbc:CustomerAssignedAccountID>12345678</cbc:CustomerAssignedAccountID>      <cbc:AdditionalAccountID>1</cbc:AdditionalAccountID>    </cac:AccountingCustomerParty>    <cac:BillingReference>      <cac:InvoiceDocumentReference>        <cbc:ID>B001-1</cbc:ID>        <cbc:DocumentTypeCode>03</cbc:DocumentTypeCode>      </cac:InvoiceDocumentReference>    </cac:BillingReference>    <cac:Status>      <cbc:ConditionCode>1</cbc:ConditionCode>    </cac:Status>    <sac:TotalAmount currencyID="PEN">30.00</sac:TotalAmount>    <sac:BillingPayment>      <cbc:PaidAmount currencyID="PEN">25.42</cbc:PaidAmount>      <cbc:InstructionID>01</cbc:InstructionID>    </sac:BillingPayment>    <cac:TaxTotal>      <cbc:TaxAmount currencyID="PEN">4.58</cbc:TaxAmount>      <cac:TaxSubtotal>        <cbc:TaxAmount currencyID="PEN">4.58</cbc:TaxAmount>        <cac:TaxCategory>          <cac:TaxScheme>            <cbc:ID>1000</cbc:ID>            <cbc:Name>IGV</cbc:Name>            <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>          </cac:TaxScheme>        </cac:TaxCategory>      </cac:TaxSubtotal>    </cac:TaxTotal>  </sac:SummaryDocumentsLine></SummaryDocuments>

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/rc-credit-note-reference.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__ . '/rc-credit-note-reference.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('rc-credit-note-reference.json')));
Terminal
node firmar.mjs

Python

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

firmar.py
built = sunat_sdk.build(leer('rc-credit-note-reference.json'))
Terminal
python firmar.py

CLI

Terminal
sunat-sdk build < rc-credit-note-reference.json \  | sunat-sdk sign --cert test-cert.pem --key test-key.pem > firmada.jsongrep -o '"digest_value":"[^"]*"' firmada.jsongrep -q '"digest_value":"O8oaqNqnaRbwFsRoWt2f1FFyXcw="' firmada.json && echo "digest ok"