Saltar a contenido

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"
}