= ""; ## Cargamos los parametros enviados al WebService if (isset($_REQUEST['pDatPAC'])) { $bDatPAC = $_REQUEST['pDatPAC']; } if (isset($_REQUEST['pRecordId'])) { $bRecId = $_REQUEST['pRecordId']; // Identidicador del registro } if (isset($_REQUEST['pAppOwner'])) { $appOwner = $_REQUEST['pAppOwner']; // Parametros para el propietario de la aplicación } // FFR: Adicionados por nueva versión de Cancelación de CFDI 4.0 a partir del 1° de Enero de 2022 if (isset($_REQUEST['pMotCancel'])) { $motCancela = $_REQUEST['pMotCancel']; $motCancela = '|'.$motCancela.'|'; } if (isset($_REQUEST['pUuidSusti'])) { $uuidSustit = $_REQUEST['pUuidSusti']; } $uuidSustit = trim($uuidSustit); if($appOwner == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsInvoiceSF] Parametros incompletos para el Servicio Web, faltan el Propoietario de la Aplicación"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bRecId == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsCancelAsyncInvoiceSFJ_v33] Parametros incompletos para el Servicio Web, faltan el ID del CFDI a actualizar"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatPAC == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsCancelAsyncInvoiceSFJ_v33] Parametros incompletos para el Servicio Web, faltan los Datos del PAC"); $Resultado = json_encode($j_array); echo $Resultado; return; } ### 0. EXTRACCION DE PARAMETROS PARA EL CFDI ###################################################### #== Primero, extraemos el JSON del string en base 64 $bdDatPAC = base64_decode($bDatPAC); //print_r($bdDatPAC); #== Segundo, decodificamos el JSON a un arreglo $abdDatPAC = json_decode($bdDatPAC,true); $dirBase = realpath("../"); # Configuración de zona horaria date_default_timezone_set('America/Mexico_City'); // ### DEFINICIÓN DE CONSTANTES ################################################### $SendaPEMS = "archs_pem/"; $SendaCFDI = "archs_cfdi/"; // Datos de acceso del usuario (proporcionados por el PAC). if($abdDatPAC["tipoTim"] == 1){ ## Timbrado en producción $urlPAC = "https://solucionfactible.com/ws/services/Cancelacion?wsdl"; } else { ## Timbrado en pruebas $urlPAC = "https://testing.solucionfactible.com/ws/services/Cancelacion?wsdl"; } // Datos para la configuracion del SOAP y los resultados. $username = $abdDatPAC["username"]; $password = $abdDatPAC["password"]; $bdUUID = $abdDatPAC["UUID"]; $fact_serie = $abdDatPAC["serie"]; $fact_folio = $abdDatPAC["folio"]; $invoiceNumber = $abdDatPAC["invoice"]; $invoiceID = $abdDatPAC["invoiceID"]; $RfcEmisor = $abdDatPAC["RfcEmi"]; // Datos "constantes" para los archivos CER y KEY del cliente $noCertificado = $abdDatPAC["Certificado_SAT"]; echo $noCertificado; $file_cer = $abdDatPAC["Archivo_CER"]; echo $file_cer; $file_key = $abdDatPAC["Archivo_KEY"]; echo $file_key; $clavePrivada = $abdDatPAC["Clave_Privada"]; echo $clavePrivada; $organi_id_ZB = $abdDatPAC["organization_id_ZB"]; $authtoken_ZB = $abdDatPAC["authtoken_ZB"]; $authtoken_ZC = $abdDatPAC["authtoken_ZC"]; // Leemos el archivo CER del cliente $nombre_fichero = $SendaPEMS.$file_cer; $gestor = fopen($nombre_fichero, "r"); $cerFile = fread($gestor, filesize($nombre_fichero)); //print_r($cerFile); fclose($gestor); // Leemos el archivo KEY del cliente $nombre_fichero = $SendaPEMS.$file_key; $gestor = fopen($nombre_fichero, "r"); $keyFile = fread($gestor, filesize($nombre_fichero)); //print_r($keyFile); fclose($gestor); // Conversion de los archivos CER y KEY leidos a formato Base64 $bCertB64 = base64_encode($cerFile); //echo $bCertB64."

"; $bKeyB64 = base64_encode($keyFile); //echo $bKeyB64; /* echo "Tipo Timbrado: ".$abdDatPAC["tipoTim"]; echo "
"; echo "username: ".$username; echo "
"; echo "password: ".$password; echo "
"; echo "bdUUID: ".$bdUUID; echo "
"; echo "Motivo: ".$motCancela; echo "
"; echo "UUID Sust: ".$uuidSustit; echo "
"; echo "fact_serie: ".$fact_serie; echo "
"; echo "fact_folio: ".$fact_folio; echo "
"; echo "invoiceNumber: ".$invoiceNumber; echo "
"; echo "invoiceID: ".$invoiceID; echo "
"; echo "RfcEmisor: ".$RfcEmisor; echo "
"; echo "urlPAC: ".$urlPAC; echo "
"; echo "file_cer: ".$SendaPEMS.$file_cer; echo "
"; echo "bCertB64: ".$bCertB64; echo "
"; echo "file_key: ".$SendaPEMS.$file_key; echo "
"; echo "bKeyB64: ".$bKeyB64; echo "
"; echo "
"; */ ### PROCESO DE CACELACION ######################################################## $response = ''; // Datos para la localización del WebService para resolución del WSDL. if($abdDatPAC["tipoTim"] == 1){ ## Timbrado en producción $urlLocation = 'https://solucionfactible.com/ws/services/Cancelacion'; } else { ## Timbrado en pruebas $urlLocation = 'https://testing.solucionfactible.com/ws/services/Cancelacion'; } #== Se lleva a cabo cancelacion del CFDI ============================ try { $client = new SoapClient($urlPAC); $client->__setLocation($urlLocation); //JFA: Cambio por SF para enviar el motivo de cancelacion $params = array('usuario' => $username, 'password' => $password, 'uuid' => $bdUUID . $motCancela . $uuidSustit, 'rfcEmisor' => $RfcEmisor, 'emailNotifica' => "", 'derCertCSDBase64' => $bCertB64, 'derKeyCSDBase64' => $bKeyB64, 'contrasenaCSD' => $clavePrivada, 'properties' => ""); $response = $client->__soapCall('cancelarAsincrono', array('parameters' => $params)); print_r($response); } catch (SoapFault $fault) { $j_array = array('code' => "900", "message" => "Error al ejecutar el WebService del PAC (SOAP)", 'status' => $fault->faultcode,'mensaje' => $fault->faultstring); //$j_array = array('code' => "900", "message" => $fault->faultcode."-".$fault->faultstring); $Resultado = json_encode($j_array); echo $Resultado; return; } /* print_r($response); echo "
"; echo "
"; */ $ret = $response->return; if($ret->status != 200) { $sErrMsg = $ret->mensaje; /* switch ($ret->status) { case 204: $sErrMsg = "El comprobante no se puede cancelar"; case 211: $sErrMsg = "La cancelación está en proceso"; case 213: $sErrMsg = "La solicitud de cancelación fue rechazada por el receptor"; case 303: $sErrMsg = "El certificado CSD no corresponde al RFC del contribuyente."; case 305: $sErrMsg = "La fecha de cancelación no está dentro del la vigencia del CSD del emisor."; case 306: $sErrMsg = "Las llaves utilizadas para sellar no corresponden a un CSD."; case 308: $sErrMsg = "El certificado CSD no fue emitido por la Autoridad de SAT."; case 402: $sErrMsg = "El RFC del contribuyente no existe conforme al régimen autorizado LCO."; case 500: $sErrMsg = "Han ocurrido errores internos que han impedido que se registre la solicitud de cancelación, reintentar."; case 501: $sErrMsg = "Ha ocurrido un error interno de comunicación con la base de datos, reintentar."; case 601: $sErrMsg = "Error de autenticación, el nombre de usuario o contraseña son incorrectos."; case 602: $sErrMsg = "La cuenta de usuario se encuentra bloqueada."; case 603: $sErrMsg = "La contraseña de la cuenta ha expirado."; case 604: $sErrMsg = "Se ha superado el número máximo permitido de intentos fallidos de autenticación."; case 605: $sErrMsg = "El usuario se encuentra inactivo."; case 611: $sErrMsg = "Los datos recibidos están incompletos o no se encuentran donde se esperarían."; case 620: $sErrMsg = "Permiso denegado."; case 621: $sErrMsg = "Los datos recibidos no son válidos."; case 633: $sErrMsg = "Uso indebido de cuenta de producción en pruebas o cuenta de prueba en producción."; case 701: $sErrMsg = "Ya existe una transacción asíncrona para el UUID especificado."; } */ $j_array = array('code' => "901", "message" => "Se presento un problema al momento de realizar la cancelación. ", 'status' => $ret->status,'mensaje' => $sErrMsg); $Resultado = json_encode($j_array); echo $Resultado; return; } $RespServ = $ret; $j_array = array('code' => "200", "message" => "Proceso de cancelacion de CFDI fue exitoso", 'status' => $ret->status, 'mensaje' => $ret->mensaje); $Resultado = json_encode($j_array); echo $Resultado; return;