PonnVolt
Curioso
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Llevo varias semanas intentando resolver un problema con la API SOAP al consumir el método downloadContent() dentro de un flujo de recuperación de CFDIs de nómina previamente timbrados.
El objetivo es recuperar los XML y PDF de los timbrados que completaron el proceso en el PAC pero experimentaron un timeout durante la generación del PDF, por lo que no contamos con el UUID en nuestra base de datos. La restricción principal es que debemos recuperar el CFDI únicamente con los datos del comprobante (RFC, serie, folio, total, fecha, etc.), sin usar el UUID.
Contexto técnico
La implementación se basa en el ejemplo oficial index_recovery.php para la función downloadContent(). De acuerdo con la documentación, la recuperación por datos (sin UUID) debería ser posible. No obstante, tras múltiples pruebas, todas las respuestas retornan SUCCESS: vacío, sin incluir las URLs del XML ni del PDF.
Ejemplo base utilizado (type = 2, nómina):
text
<span><span>|#|MPXC830715BF8|#|CRISTIAN PEREZ MONTERROSAS MACEDA|#|NOM-C4FO|#|9|#|8330.69|#|2025-12-31|##||#||#||#||#||#||#|<br></span></span><span></span>
Estructura esperada:
text
<span><span>|#|RFC|#|NOMBRE|#|SERIE|#|FOLIO|#|TOTAL|#|FECHA|##||#||#||#||#||#||#|<br></span></span><span></span>
Parámetro type: 2 (Payroll)
Request SOAP completo:
xml
<span><span><</span><span>SOAP-ENV:</span><span>Envelope</span><span> </span><span>xmlns:</span><span>SOAP-ENV</span><span>=</span><span>"</span><span>http://schemas.xmlsoap.org/soap/envelope/</span><span>"</span><span><br></span></span><span><span> </span><span>xmlns:</span><span>ns1</span><span>=</span><span>"</span><span>https://cfdi360.com/webservice</span><span>"</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>SOAP-ENV:</span><span>Header</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>Auth</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>userName</span><span>></span><span>SAA090305UF4</span><span></</span><span>userName</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>password</span><span>></span><span>SAA090305UF4#</span><span></</span><span>password</span><span>></span><span><br></span></span><span><span> </span><span></</span><span>Auth</span><span>></span><span><br></span></span><span><span> </span><span></</span><span>SOAP-ENV:</span><span>Header</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>SOAP-ENV:</span><span>Body</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>ns1:</span><span>downloadContent</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>content</span><span>></span><span><![CDATA[|#|MOMC830815BF8|#|CRISTIAN RAFAEL MONTERROSAS MACEDA|#|NOM-C4FO|#|9|#|8330.69|#|2025-12-31|##||#||#||#||#||#||#|]]></span><span></</span><span>content</span><span>></span><span><br></span></span><span><span> </span><span><</span><span>type</span><span>></span><span>2</span><span></</span><span>type</span><span>></span><span><br></span></span><span><span> </span><span></</span><span>ns1:</span><span>downloadContent</span><span>></span><span><br></span></span><span><span> </span><span></</span><span>SOAP-ENV:</span><span>Body</span><span>></span><span><br></span></span><span><span></span><span></</span><span>SOAP-ENV:</span><span>Envelope</span><span>></span><span><br></span></span><span></span>
Respuesta:
xml
<span><span><</span><span>return</span><span> </span><span>xsi:</span><span>type</span><span>=</span><span>"</span><span>xsd:string</span><span>"</span><span>></span><span>SUCCESS:</span><span></</span><span>return</span><span>></span><span><br></span></span><span></span>
(Vacía, sin datos de archivo ni URLs).
Variantes probadas
He probado múltiples combinaciones para el content string, incluyendo:
Ninguna de estas variantes retornó resultados.
- Con y sin nombre del receptor.
- Con o sin el campo total.
- Con o sin fecha.
- Variaciones en la relación entre serie y folio:
- |#|SERIE|#||#|FOLIO|#|
- |#|SERIE|#|FOLIO|#|
- Con campos adicionales vacíos al final.
- Cambiando type entre 1 (Invoice) y 2 (Payroll).
Prueba exitosa con UUID
Cuando el UUID está presente, la función sí responde correctamente y entrega los datos de xml_url y pdf_url.
Ejemplo funcional:
text
<span><span>48A31747-A0C4-449A-B0C1-13F2548E46F0|#||#||#||#||#||#||<br></span></span><span></span>
o:
text
<span><span>|#|MPXC830715BF8|#||#|NOM-C4FO|#||#|9|#|2025-12-31|##|48A31747-A0C4-449A-B0C1-13F2548E46F0|#||#||#||#||#||#|<br></span></span><span></span>
Ambos devuelven correctamente las URLs del CFDI.
Sin embargo, no es viable para nuestro caso de uso depender del UUID, ya que no lo tenemos registrado en los casos con timeout durante la timbración.
Contexto adicional (colateral)
Además del problema con la cadena SOAP, el proyecto presenta factores que podrían influir en el diagnóstico:
Aun así, el núcleo del problema sigue siendo la generación y validación de la cadena SOAP downloadContent(), y cómo lograr una recuperación correcta sin UUID.
- En ciertas pruebas, el botón de verificación/refresh en la interfaz invoca una función diferente, afectando el flujo de envío. (YA RESUELTO)
- El timestamp usado en la cadena (parte del request) parece generarse con un huso horario distinto, lo que podría estar causando desincronización o invalidación del request.(YA RESUELTO)
Agradecería cualquier orientación, ejemplos funcionales o documentación no oficial que ayude a comprender el formato esperado del campo content en este método.

