= "";
## 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);
ECHO $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;