Saul_RS escribió: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???Saul_RS escribió: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ódigomo.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)
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)); }
Que crees que a mi me esta pasando lo mismo, está rarísimo. al consumir el Webservice de SOLICITUD, me arroja el UUID de la consulta realizada.
Paso siguiente es Validar ese UUID en el web service de validación no?
Cuando lo valido Automaticamente, el EstadoSolicitud es "1" = Aceptada.
Pero pues obviamente en ese estado, no tiene ningún CFDI.
Entonces guardo el UUID generado y lo consulto mas tarde, y no pasa ni el minuto, al ponerle ese UUID que generó el otro Webservice, cuando ya me sale "Estatus 5" o sea "Cancelado". ¿Eso a que se debe? ¿A alguien mas le ha pasado, a parte de a nosotros dos?