Página 16 de 18

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

Publicado: Mar Feb 05, 2019 11:59 am
por Dado
Es correcto, tienes que verificar y verificar y verificar......checa el foro al que te hago referencia

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

Publicado: Mar Feb 05, 2019 1:27 pm
por Axterix
Gracias dado, ahora tengo más claro lo que hay que esperar para la descarga de las facturas. Saludos :evil:

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

Publicado: Vie Feb 08, 2019 7:29 am
por Axterix
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>

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

Publicado: Vie Feb 08, 2019 12:26 pm
por Saul_RS
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));
}

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

Publicado: Vie Feb 08, 2019 4:27 pm
por estebanchambas
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?

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

Publicado: Vie Feb 08, 2019 4:38 pm
por Saul_RS
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();

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

Publicado: Mar Feb 12, 2019 5:43 pm
por crono81
El error que te marca es porque estás haciendo mal el hash o el sello, o ambos

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

Publicado: Mié Feb 13, 2019 7:45 am
por Axterix
¿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: .

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

Publicado: Mié Feb 13, 2019 8:39 am
por estebanchambas
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

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

Publicado: Mié Feb 13, 2019 9:15 am
por shakira
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.