Inicio Rápido
Cancelar CFDI
Puede tomar como base la siguiente guía para realizar su primera cancelación de CFDI.
<?php
$curl = curl_init();
$solicitud = [
"uuid" => "4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2",
"key" => $key,
"cer" => $cer,
"keyPass" => $passphrase,
"tipoPeticion" => "cfdi",
"emailEmisor" => "foo@bar.com",
"emailReceptor" => "foo@bar.com",
"rfcReceptor" => "XAXX010101000",
"rfcEmisor" => "AAA010101AAA",
"total" => "138132",
"motivo" => "02",
"acuse" => "SI",
"tipoComprobante" => "I"
];
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.csfacturacion.com/cscancelacion/v4/cancelar",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($solicitud),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.csfacturacion.com/cscancelacion/v4/cancelar"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n\t\"uuid\": \"4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2\",\n\t\"key\": \"\",\n\t\"cer\": \"\",\n\t\"keyPass\": \"pass\",\n\t\"tipoPeticion\": \"cfdi\",\n\t\"emailEmisor\": \"foo@bar.com\",\n\t\"emailReceptor\": \"foo@bar.com\",\n\t\"rfcReceptor\": \"XAXX010101000\",\n\t\"rfcEmisor\": \"AAA010101AAA\",\n\t\"total\": \"138132\",\n\t\"motivo\": \"02\",\n\t\"acuse\": \"SI\",\n\t\"tipoComprobante\": \"I\"\n}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
var client = new RestClient("https://api.csfacturacion.com/cscancelacion/v4/cancelar");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n\t\"uuid\": \"4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2\",\n\t\"key\": \"\",\n\t\"cer\": \"\",\n\t\"keyPass\": \"pass\",\n\t\"tipoPeticion\": \"cfdi\",\n\t\"emailEmisor\": \"foo@bar.com\",\n\t\"emailReceptor\": \"foo@bar.com\",\n\t\"rfcReceptor\": \"XAXX010101000\",\n\t\"rfcEmisor\": \"AAA010101AAA\",\n\t\"total\": \"138132\",\n\t\"motivo\": \"02\",\n\t\"acuse\": \"SI\",\n\t\"tipoComprobante\": \"I\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
curl --request POST \
--url $base_uri \
--header 'Content-Type: application/json' \
--data '{
"uuid": "4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2",
"key": "",
"cer": "",
"keyPass": "pass",
"tipoPeticion": "cfdi",
"emailEmisor": "foo@bar.com",
"emailReceptor": "foo@bar.com",
"rfcReceptor": "XAXX010101000",
"rfcEmisor": "AAA010101AAA",
"total": "138132",
"motivo": "02",
"acuse": "SI",
"tipoComprobante": "I"
}'
POST /cscancelacion/v4/cancelar HTTP/1.1
Content-Type: application/json
Host: api.csfacturacion.com
Content-Length: 325
{
"uuid": "4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2",
"key": "",
"cer": "",
"keyPass": "pass",
"tipoPeticion": "cfdi",
"emailEmisor": "foo@bar.com",
"emailReceptor": "foo@bar.com",
"rfcReceptor": "XAXX010101000",
"rfcEmisor": "AAA010101AAA",
"total": "138132",
"motivo": "02",
"acuse": "SI",
"tipoComprobante": "I"
}
Respuesta:
{
"codigo": "201",
"mensaje": "Solicitud de cancelación recibida con exito",
"acuse": "acuse_base64",
"fechaOperacion": "2022-01-04T19:56:12"
}
Warning
Una solicitud de cancelación que resultó exitosa (código 201) NO indica que el CFDI en cuestión ha sido cancelado. El SAT determina (junto con el receptor) si la cancelación procede o no.
Tip
Después de obtener 201
como respuesta, es recomendable monitorear el estatus del CFDI mediante este mismo
servicio.
Verificar estatus CFDI
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.csfacturacion.com/cscancelacion/v4/verificar",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\n\t\"rfcReceptor\": \"AAA010101AAA\",\n\t\"total\": \"1334.00\",\n\t\"rfcEmisor\": \"AAA010101AAA\",\n\t\"uuid\": \"F28C6FBA-96EA-D647-A231-7B639EA51509\"\n}",
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.csfacturacion.com/cscancelacion/v4/verificar"))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n\t\"rfcReceptor\": \"AAA010101AAA\",\n\t\"total\": \"1334.00\",\n\t\"rfcEmisor\": \"AAA010101AAA\",\n\t\"uuid\": \"F28C6FBA-96EA-D647-A231-7B639EA51509\"\n}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
var client = new RestClient("https://api.csfacturacion.com/cscancelacion/v4/verificar");
var request = new RestRequest(Method.POST);
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n\t\"rfcReceptor\": \"AAA010101AAA\",\n\t\"total\": \"1334.00\",\n\t\"rfcEmisor\": \"AAA010101AAA\",\n\t\"uuid\": \"F28C6FBA-96EA-D647-A231-7B639EA51509\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
curl --request POST \
--url https://api.csfacturacion.com/cscancelacion/v4/verificar \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"rfcReceptor": "XAXX010101000",
"total": "138132",
"rfcEmisor": "AAA010101AAA",
"uuid": "4AA1138B-BF2E-0143-B7D0-CC2AA44E1DC2"
}'
Respuesta
{
"codigo": "201",
"mensaje": "S - Comprobante obtenido satisfactoriamente.",
"estatusCfdi": "Cancelado",
"esCancelable": "Cancelable sin aceptación",
"estatusCancelacion": "Cancelado sin aceptación"
}