Duda de Como Autentificarse en los WebService de Descarga de los XML

Todo lo que no cabe en los demas foros........
Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Dado » Mar Feb 05, 2019 12:59 pm

Es correcto, tienes que verificar y verificar y verificar......checa el foro al que te hago referencia
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Axterix
Mensajes: 9
Registrado: Vie Feb 01, 2019 12:59 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Axterix » Mar Feb 05, 2019 2:27 pm

Gracias dado, ahora tengo más claro lo que hay que esperar para la descarga de las facturas. Saludos :evil:

Axterix
Mensajes: 9
Registrado: Vie Feb 01, 2019 12:59 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Axterix » Vie Feb 08, 2019 8:29 am

Hey me surgió otra duda, ya llevo 5 solicitudes que al cabo de dos días me andan rechazando. ¿Es normal? ¿Hay algo que pueda hacer para que me devuelva la solicitud en número 3(terminada)?¿Estoy haciendo algo mal? Saludos :evil: .

Código: Seleccionar todo

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <VerificaSolicitudDescargaResponse xmlns="http://DescargaMasivaTerceros.sat.gob.mx">
         <VerificaSolicitudDescargaResult CodEstatus="5000" EstadoSolicitud="5" CodigoEstadoSolicitud="5004" NumeroCFDIs="0" Mensaje="Solicitud Aceptada" />
      </VerificaSolicitudDescargaResponse>
   </s:Body>
</s:Envelope>

Saul_RS
Mensajes: 3
Registrado: Vie Feb 01, 2019 2:45 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Saul_RS » Vie Feb 08, 2019 1:26 pm

Saul_RS escribió:
mo.rodrigo escribió:Buenas Tardes.
Estoy realizando el consumo del "WebService" en php, pero no me deja me sale error "An error occurred when verifying security for the message.", intente copiar todo al pie de la letra., inclusive obtener el valor canonizado que ponen de ejemplo con las fechas que ponen de ejemplo ( se hace de la misma manera que para cancelar un cfdi)


Excelente aporte, hice solo unas pocas modificaciones pero la parte de consumir el servicio no me devuelve ningún valor. Si alguien pudiera apoyarme en el uso de CURL se los agradecería, aquí mi código


Hice cambios en la parte de SOAP y consumir el webservices, ahora ya obtengo una respuesta que es An error occurred when verifying security for the message. Alguna idea de que podría estar mal???

Código: Seleccionar todo

<?php

/* Obtener fecha con el formato requerido y sumar 5 Horas para coincidir con el horario GMT */
$hora_actual = new DateTime("America/Mexico_City");
$hora_actual->add(new DateInterval('PT6H'));
$actual = $hora_actual->format('Y-m-d\TH:i:s');

/* De la fecha obtenida sumar 5 minutos */
$hora_actual2 = new DateTime($actual);
$hora_actual2->add(new DateInterval('PT5M'));
$expira = $hora_actual2->format('Y-m-d\TH:i:s');

/* Se agregan los milisegundos y la Z para cumplir con el formato */
$actual.= '.000Z';
$expira.= '.000Z';

/* Se arma el nodo Timestamp sustituyendo los valores */
$time = '<u:Timestamp xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" u:Id="_0"><u:Created>' . $actual . '</u:Created><u:Expires>' . $expira . '</u:Expires></u:Timestamp>';

/* Aplicar el HASH y codificar en Base64 el nodo Timestamp */
$dom = new DOMDocument();
$dom->loadXML($time);
$canonicalized = $dom->C14N();
$digest = base64_encode(pack("H*", sha1($canonicalized)));

/* Firma con la Llave privada y codificar en Base64 el Digest del nodo Timestamp */
$path_key = 'D:/key_pruebas.pem';
$cadenafirmada = "";
$fp = fopen($path_key, "r");
$priv_key = fread($fp, filesize($path_key));
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
openssl_sign($digest, $cadenafirmada, $pkeyid, OPENSSL_ALGO_SHA1);
$sello = base64_encode($cadenafirmada);
openssl_free_key($pkeyid);

/* Leer Certificado */
$path_cert = 'D:/cert_pruebas.pem';
$fp = fopen($path_cert, "r");
$public_key = fread($fp, filesize($path_cert));
fclose($fp);
$certificado = substr($public_key, 27, -27);

/* Genrerar UUID */
$uuid = "uuid-" . genUuid() . "-1";

/* Armar el REQUEST */
$autenticacion = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>' . $actual . '</u:Created><u:Expires>' . $expira . '</u:Expires></u:Timestamp><o:BinarySecurityToken u:Id="' . $uuid . '" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">' . $certificado . '</o:BinarySecurityToken><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#_0"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>' . $digest . '</DigestValue></Reference></SignedInfo><SignatureValue>' . $sello . '</SignatureValue><KeyInfo><o:SecurityTokenReference><o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#' . $uuid . '"/></o:SecurityTokenReference></KeyInfo></Signature></o:Security></s:Header><s:Body><Autentica xmlns="http://DescargaMasivaTerceros.gob.mx"/></s:Body></s:Envelope>';

/* Agregar Headers */
$header = array("Content-type: text/xml;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "SOAPAction: http://DescargaMasivaTerceros.gob.mx/IAutenticacion/Autentica",
    "Content-length: " . strlen($autenticacion),
);

/* Inicializar curl */
$soap = curl_init();
curl_setopt($soap, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($soap, CURLOPT_URL, 'https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc');
curl_setopt($soap, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($soap, CURLOPT_TIMEOUT, 10);
curl_setopt($soap, CURLOPT_POST, true);
curl_setopt($soap, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($soap, CURLOPT_TIMEOUT_MS, 50000);
curl_setopt($soap, CURLOPT_POSTFIELDS, $autenticacion);
curl_setopt($soap, CURLOPT_HTTPHEADER, $header);

$respuesta = curl_exec($soap);

var_dump($respuesta);
curl_close($soap);
die();

function genUuid() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
}

estebanchambas
Mensajes: 51
Registrado: Mié Ago 08, 2018 2:30 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor estebanchambas » Vie Feb 08, 2019 5:27 pm

Saul_RS Ya no entendi nada.
Ese error ya te daba antes en tu anterior publicación y en esta pusiste exactamente lo mismo.
¿Cual es la diferencia?

Saul_RS
Mensajes: 3
Registrado: Vie Feb 01, 2019 2:45 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Saul_RS » Vie Feb 08, 2019 5:38 pm

estebanchambas escribió:Saul_RS Ya no entendi nada.
Ese error ya te daba antes en tu anterior publicación y en esta pusiste exactamente lo mismo.
¿Cual es la diferencia?


Ese error no me lo daba antes y no es exactamente el mismo código.
Hice cambios en los header por que al principio no me devolvía ningún mensaje, nada. Con las modificaciones ya hace la conexión al webservices pero me devuelve ese error.

Anterior:

Código: Seleccionar todo

/* Agregar Headers */
$header = array('Content-type: text/xml;charset="utf-8"', 'SOAPAction: "http://DescargaMasivaTerceros.gob.mx/IAutenticacion/Autentica"');

/* Inicializar curl */
$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, 'https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc');
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $autenticacion);
curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header);
curl_setopt($soap_do, CURLOPT_FRESH_CONNECT, true);
$respuesta = curl_exec($soap_do);
curl_close($soap_do);
var_dump($respuesta);
die();


Nuevo:

Código: Seleccionar todo

/* Agregar Headers */
$header = array("Content-type: text/xml;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "SOAPAction: http://DescargaMasivaTerceros.gob.mx/IAutenticacion/Autentica",
    "Content-length: " . strlen($autenticacion),
);

/* Inicializar curl */
$soap = curl_init();
curl_setopt($soap, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($soap, CURLOPT_URL, 'https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc');
curl_setopt($soap, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($soap, CURLOPT_TIMEOUT, 10);
curl_setopt($soap, CURLOPT_POST, true);
curl_setopt($soap, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($soap, CURLOPT_TIMEOUT_MS, 50000);
curl_setopt($soap, CURLOPT_POSTFIELDS, $autenticacion);
curl_setopt($soap, CURLOPT_HTTPHEADER, $header);

$respuesta = curl_exec($soap);

var_dump($respuesta);
curl_close($soap);
die();

crono81
Mensajes: 118
Registrado: Lun Dic 16, 2013 6:55 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor crono81 » Mar Feb 12, 2019 6:43 pm

El error que te marca es porque estás haciendo mal el hash o el sello, o ambos

Axterix
Mensajes: 9
Registrado: Vie Feb 01, 2019 12:59 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor Axterix » Mié Feb 13, 2019 8:45 am

¿Ya que tengo descargado el paquete en base64 solo lo tengo que descifrar y luego volverlo un zip? ¿Alguien lo ha hecho en Java?Saludos :twisted: .

estebanchambas
Mensajes: 51
Registrado: Mié Ago 08, 2018 2:30 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor estebanchambas » Mié Feb 13, 2019 9:39 am

Axterix escribió:¿Ya que tengo descargado el paquete en base64 solo lo tengo que descifrar y luego volverlo un zip? ¿Alguien lo ha hecho en Java?Saludos :twisted: .


AXterix, yo ya había publicado eso, bueno obvio usando el python mismo del API de luisturrios y hago esto para crear el ZIP en base a la salida Base64 que genera el último web service. y hago el siguiente procedimiento:


code = "salidabase64del webserviceaqui"
decoded_string = base64.b64decode(code)
with open("cfdis.zip", "wb") as cfdis_file2:
cfdis_file2.write(decoded_string);


No se como se haría en JAVA

shakira
Mensajes: 76
Registrado: Lun Feb 14, 2011 3:15 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensajepor shakira » Mié Feb 13, 2019 10:15 am

Buenos días. Nuevamente solicito su apoyo, ya no seré tan ilustrativa para no hacer cansado el post.
Tengo el SignedInfo de una autenticación correcta en un archvito txt:

Código: Seleccionar todo

<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#_0"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>s9gmL0php/Xy5RYXkJd03oHaVok=</DigestValue></Reference></SignedInfo

Usando el pem del key de una Fiel genero el sello con Openssl y no es igual al que envió la petición de donde fue obtenido el SignedInfo, al cual solo le agregué

Código: Seleccionar todo

xmlns="http://www.w3.org/2000/09/xmldsig#"
al SignedInfo original, aún si no hago ningún cambio al SignedInfo y lo mando a sellar tal cual está no me da el mismo resultado.
¿Alguien podría darme una pista por qué no me salen igual?
Gracias.


Volver a “Otros”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados