1. Home
  2. Cancelación CFDI 3.3
  3. Cancelación CFDI 3.3
  1. Home
  2. CFDI 3.3
  3. Cancelación CFDI 3.3
  1. Home
  2. Servicios
  3. Cancelación CFDI 3.3

Cancelación CFDI 3.3


Ruta
Operación
Descripción
/cfdi33/cancel/csd
POST Ruta para cancelar por CSD.
/cfdi33/cancel/xml
POST Ruta para cancelar por XML.
/cfdi33/cancel/pfx
POST Ruta para cancelar por PFX.
/cfdi33/cancel/{RFC}/{UUID}
POST Ruta para cancelar por UUID.

Los servicios para cancelar CFDI en su versión 3.3 son servicios REST.

Cancelacion por CSD


Como su nombre lo indica, este servicio recibe todos los elementos que componen el CSD los cuales son los siguientes:

  • Certificado (.cer)
  • Key (.key)
  • Password del archivo key
  • RFC emisor

Esto ya que nuestro servidor generara el acuse de cancelación.
Paso 1: Obtener token de acceso, o en su defecto usar token infinito
Primeramente se deberá autenticar en nuestros servicios en orden de obtener token de acceso, o si se desea,  se puede usar el token infinito.
Paso 2: Enviar datos necesarios
Se envían los datos necesarios para la cancelación, que básicamente es el CSD del emisor que desea cancelar un CFDI, así como el RFC de dicho emisor, el uuid correspondientes al CFDI que se desea cancelar,  y por supuesto el token de acceso anteriormente generado.

Cabe mencionar que los archivos .cer y .key,  al ser binarios, deberán enviarse en formato base64 para que podamos procesarlos en nuestro servidor.

HTTP Request por CSD

 

HTTP Response por CSD

 

Cancelar con las librerias por CSD

Ir al Repositorio de C# en GitHub

using System;
using System.IO;
using System.Text;
using SW.Helpers;
using SW.Services.Cancelation;

namespace ExampleSDK
{
    class Program
    {
        static void Main()
        {
            try
            {
                //Creamos una instancia de tipo Cancelation 
                //A esta le pasamos la Url, Usuario y Contraseña para obtener el token
                //Automaticamente despues de obtenerlo se procedera a Cancelar el xml o cfdi
                Cancelation cancelation = new Cancelation("http://services.test.sw.com.mx", "demo", "123456789");
               
                //Obtenemos Certificado y lo convertimos a Base 64
                string CerB64 = Convert.ToBase64String(File.ReadAllBytes("CSD_Prueba_CFDI_LAN8507268IA.cer"));
                //Obtenemos LLave y lo convertimos a Base 64
                string KeyB64 = Convert.ToBase64String(File.ReadAllBytes("CSD_Prueba_CFDI_LAN8507268IA.key"));
               
                CancelationResponse response = cancelation.CancelarByCSD(CerB64, KeyB64, "LAN8507268IA", "12345678a", "01724196-ac5a-4735-b621-e3b42bcbb459");
              
                //Para Obtener el Acuse de Cancelación
                response.Data.Acuse
                
                //En caso de error, se pueden visualizar los campos message y/o messageDetail
                response.message;
                response.messageDetail;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

Ir al Repositorio de Java en GitHub

package sample_test;
import Services.Cancelation.SWCancelationService;
import Utils.Responses.CancelationResponse;

public class sample_test_cancelation {

    public static void main(String args) {
    //Datos requeridos: uuid del xml, Password del archivo key, RFC emisor, Certificado (.cer) en base64, Key (.key) en base64
    String uuid = "06a46e4b-b154-4c12-bb77-f9a63ed55ff2";
    String password_csd = "12345678a";
    String rfc = "LAN7008173R5";
    String b64Cer = "MIIFxTCCA62gAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjUyMTUyMTFaFw0yMDEwMjUyMTUyMTFaMIGxMRowGAYDVQQDExFDSU5ERU1FWCBTQSBERSBDVjEaMBgGA1UEKRMRQ0lOREVNRVggU0EgREUgQ1YxGjAYBgNVBAoTEUNJTkRFTUVYIFNBIERFIENWMSUwIwYDVQQtExxMQU43MDA4MTczUjUgLyBGVUFCNzcwMTE3QlhBMR4wHAYDVQQFExUgLyBGVUFCNzcwMTE3TURGUk5OMDkxFDASBgNVBAsUC1BydWViYV9DRkRJMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAJ/xkL8I+fpilZP+9aO8n93+20XxVomLJjeSL+Ng2ErL2GgatpLuN5JknFBkZAhxVIgMaTS23zzk1RLtRaYvH83lBH5E+M+kEjFGp14Fne1iV2Pm3vL4jeLmzHgY1Kf5HmeVrrp4PU7WQg16VpyHaJ/eonPNiEBUjcyQ1iFfkzJmnSJvDGtfQK2TiEolDJApYv0OWdm4is9Bsfi9j6lI9/T6MNZ+/LM2L/t72Vau4r7m94JDEzaO3A0wHAtQ97fjBfBiO5M8AEISAV7eZidIl3iaJJHkQbBYiiW2gikreUZKPUX0HmlnIqqQcBJhWKRu6Nqk6aZBTETLLpGrvF9OArV1JSsbdw/ZH+P88RAt5em5/gjwwtFlNHyiKG5w+UFpaZOK3gZP0su0sa6dlPeQ9EL4JlFkGqQCgSQ+NOsXqaOavgoP5VLykLwuGnwIUnuhBTVeDbzpgrg9LuF5dYp/zs+Y9ScJqe5VMAagLSYTShNtN8luV7LvxF9pgWwZdcM7lUwqJmUddCiZqdngg3vzTactMToG16gZA4CWnMgbU4E+r541+FNMpgAZNvs2CiW/eApfaaQojsZEAHDsDv4L5n3M1CC7fYjE/d61aSng1LaO6T1mh+dEfPvLzp7zyzz+UgWMhi5Cs4pcXx1eic5r7uxPoBwcCTt3YI1jKVVnV7/w=";
    String b64Key = "MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAgEAAoIBAQACAggAMBQGCCqGSIb3DQMHBAgwggS9AgEAMASCBMh4EHl7aNSCaMDA1VlRoXCZ5UUmqErAbucRBAKNQXH8t1GNfLDIQejtcocS39VvWnpNXjZJeCg65Y2wI36UGn78gvnU0NOmyUkXksPVrkz7hqNtAVojPUtN65l+MVAsIRVD6OLJeKZ2bLx5z78zrx6Tp1zCGT/NpxL+CJSy5iY6TKqbJcK/9198noOvT2p8rKVqUUF3wLRvD6R/b3BC5wCon/exp3BUTZeiWJqGRRgaW4rn49ZbJPVIcDmUO8mojPesFHjJDSnA0nBnWaUvTYXi0srT+dLZOewsBR8d5GdSWh9ZkM29wJbjYHCMsXkObZjaap3YM8fU29zRyZ8KAqaCnBHCfYjbib56m+Lmnk+ScqMkQQ+S/+2pzn2LzauvBI4p/OjQgBDeblo22X7sX9OA9YaqB3q6CCjQ5tkDNrz3HOgTm+amh/kI8TEn9rcKf4Ru7mC1T7VMaFgBqpIS8YJNbcgegF0IF1FpCS05wjdU5CktYAnPnvC+Pj+MFDeH+184kIHBWqPNG6dAzALxRgtKTlGdJ1l5Do+4EWI+0mvKojREnKoDczFnDeCFnM51u3I9Vce3rkf0djRQKFomPVUnPDqxlR5lDAssYAYNcECAkvGxKcBDbjWi/6NHlwjS1r28+0Jhvfxjx9O6hi4AW82Q2/kBE5P/eOwln/jKSbLgi7Iyim1FFHxkQH1FY5kcKhAzFcIq85rGFlzHRfPF9OIQSmONI9kcWQCxkk8aG1u1zwbjZRYLTxlwmZvynOgaWRpTN8Y4ReBDIG1klhva7nqqoM416oXBG71IKaCtjAwRlE6pgaqnIz/WQAb2FR541pqynX6dB6DB1nIWnatsWZJZlu+Bnhf9DBlUsO9ZSAf9Fa9nJAzwFCzaKIsvGJIeKSZ/h+vInkjaO/rxswErVROTfZy1lO2CJ/xnAgzFGrpDxNJPliv3McO9TGwYy/zHhE6Pdo8Xu6NsMisNU6TB8Bc26uLNv/7kWhNmNnBA1qt5akln6hOHrPBXGBiTNUL0IoFVPNdCbS0834zAYXfgtZLDzVpeLqmeMpqXbIYK0/NXe9etxuOcN40O+B/fTHHmO7dMgBZ4vAApVQUPr7ilumVHsWSMRP/0p5R9q4qr1bDm9S5YCPevdyYWTSceGSrXHmjYzJLBtpc/s77mynNqZEYjhnKk2XRNp6kp/FYRu+QdsX9vaDJbLKR2EnSC4fU6UOTO03IZU15j3wOsg30QrXoKntSJ/beF99cvFHuPrQPWxCtws0lLwkkHNVOm6XNO948Moy1w1pL4i68CwmceYZaYrYhmHGdLuescFQrZQaULDWhpK2Stys8Vs/XwwxNi9MHAFSXpdy/b+Aro5n87w+0MHRcllF8ZKbtQ/ym4oG7aREuo7o71JXJQPjZKTOtVM1EQx/FLM/5brnDSoyvLtoYtv9/tTnIC+8gR6eErkzaGmn8pftPhGNuz6yzx8JeLFoMD7VWbGTefj46KS+yMweFJnpReHEqwnukXpEYq19EWVyQa/Sb7navtKt80y/vRs0aNZp3iL23AOs0u1kQ1CFNY2y12Gor1koaH2FUd5jAQnaSKmgarLy0H/QVvR2g8B3+Fh49QhKYrd8N6LvvI80cwbEoqYWn5DWA=";
    
    try{
        //Ejemplo de cancelación utilizando la librería sw-java ( https://search.maven.org/#search%7Cga%7C1%7Ca%3A%22SW-JAVA%22 )
        //Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
        //Se especifica el base path, esto para consumir el api de pruebas o productivo
        SWCancelationService api = new SWCancelationService("demo","123456789","http://services.test.sw.com.mx");
        
        //Se inicializa un objeto response, que obtendra la respuesta del api
        CancelationResponse response = null;
        
        //Se asigna el resultado de la respuesta a dicho objeto, haciendo el cast a un objeto CancelationResponse
        //Se ejecuta el metodo "Cancelar", que generará el acuse de cancelación, el uuid y el status de la cancelación
        response = (CancelationResponse)api.Cancelation(uuid, password_csd, rfc, b64Cer, b64Key);   
        
        //El objeto response tendra así los atributos:
        // Status: estado de la petición procesada, puede ser : "success", "fail", "error"
        // HttpStatusCode: Codigo de respuesta HTTP del servidor: eg. 200, 400, 500
        // Acuse: xml del acuse de cancelación
        // uuid: uuid del xml cancelado
        // uuidStatusCode: código de respuesta de folios de cancelación
        System.out.println(response.Status);
        System.out.println(response.HttpStatusCode);
        System.out.println(response.acuse);
        System.out.println(response.uuid);
        System.out.println(response.uuidStatusCode);
        // En caso de error, se pueden visualizar los campos message y/o messageDetail
        System.out.println(response.message);
        System.out.println(response.messageDetail);
        }
        catch(Exception e){
            //En caso de obtener estatus "fail", "error"
            //Se generara una excepción
            System.out.println(e.getMessage());
        }
      }
}

Ir al Repositorio de PHP en GitHub

<?php require_once "vendor/autoload.php"; use SWServicesCancelationCancelationService as CancelationService; //incluimos el servicio $params = array( //inicializamos los parámetros, Datos requeridos: uuid del xml, Password del archivo key, RFC emisor, Certificado (.cer) en base64, Key (.key) en base64 "url"=>"http://services.test.sw.com.mx/",  
    	"token"=>"T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUXpTUm9mTG1ySXdZbFNja3FRa0RlYURqbzdzdlI2UUx1WGJiKzViUWY2dnZGbFloUDJ6RjhFTGF4M1BySnJ4cHF0YjUvbmRyWWpjTkVLN3ppd3RxL0dJPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxrUndzK0dHS2dpTittY1JmR3o2M3NqNkh4MW9KVXMvUHhZYzVLQS9UK2E1SVhEZFJKYWx4ZmlEWDFuSXlqc2ZRYXlUQk1ldlZkU2tEdU10NFVMdHZKUURLblBxakw0SDl5bUxabDFLNmNPbEp6b3Jtd2Q1V2htRHlTdDZ6eTFRdUNnYnVvK2tuVUdhMmwrVWRCZi9rQkU9.7k2gVCGSZKLzJK5Ky3Nr5tKxvGSJhL13Q8W-YhT0uIo",
        "uuid"=> "06a46e4b-b154-4c12-bb77-f9a63ed55ff2",
        "password"=> "123456789",
        "rfc"=> "LAN7008173R5",
        "b64Cer"=> file_get_contents("./b64Cer.txt"),
        "b64Key"=> file_get_contents("./b64Key.txt")
	);

    try {
        header("Content-type: application/json");
        $cancelationService = CancelationService::Set($params); //asignamos los valores al servicio
        $result = $cancelationService::CancelationByCSD();//usamos el servicio de cancelación
        var_dump($result);
        //en caso de error podemos acceder a las propiedades
        $result->message;
        $result->messageDetail;

    } catch(Exception $e) {
        header("Content-type: text/plain");
        echo $e->getMessage();
    }
?>


Ir al Repositorio de Node.js en GitHub

const CancelationService = require("sw-sdk-nodejs").CancelationService; //agregamos el servicio

var params = { //inicializamos los parámetros, Datos requeridos: uuid del xml, Password del archivo key, RFC emisor, Certificado (.cer) en base64, Key (.key) en base64
    url: "services.test.sw.com.mx",  
	token: "T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUXpTUm9mTG1ySXdZbFNja3FRa0RlYURqbzdzdlI2UUx1WGJiKzViUWY2dnZGbFloUDJ6RjhFTGF4M1BySnJ4cHF0YjUvbmRyWWpjTkVLN3ppd3RxL0dJPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxrUndzK0dHS2dpTittY1JmR3o2M3NqNkh4MW9KVXMvUHhZYzVLQS9UK2E1SVhEZFJKYWx4ZmlEWDFuSXlqc2ZRYXlUQk1ldlZkU2tEdU10NFVMdHZKUURLblBxakw0SDl5bUxabDFLNmNPbEp6b3Jtd2Q1V2htRHlTdDZ6eTFRdUNnYnVvK2tuVUdhMmwrVWRCZi9rQkU9.7k2gVCGSZKLzJK5Ky3Nr5tKxvGSJhL13Q8W-YhT0uIo",
    uuid: "06a46e4b-b154-4c12-bb77-f9a63ed55ff2",
    password: "123456789",
    rfc: "LAN7008173R5",
    b64Cer: "MIIFxTCCA62gAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjUyMTUyMTFaFw0yMDEwMjUyMTUyMTFaMIGxMRowGAYDVQQDExFDSU5ERU1FWCBTQSBERSBDVjEaMBgGA1UEKRMRQ0lOREVNRVggU0EgREUgQ1YxGjAYBgNVBAoTEUNJTkRFTUVYIFNBIERFIENWMSUwIwYDVQQtExxMQU43MDA4MTczUjUgLyBGVUFCNzcwMTE3QlhBMR4wHAYDVQQFExUgLyBGVUFCNzcwMTE3TURGUk5OMDkxFDASBgNVBAsUC1BydWViYV9DRkRJMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAJ/xkL8I+fpilZP+9aO8n93+20XxVomLJjeSL+Ng2ErL2GgatpLuN5JknFBkZAhxVIgMaTS23zzk1RLtRaYvH83lBH5E+M+kEjFGp14Fne1iV2Pm3vL4jeLmzHgY1Kf5HmeVrrp4PU7WQg16VpyHaJ/eonPNiEBUjcyQ1iFfkzJmnSJvDGtfQK2TiEolDJApYv0OWdm4is9Bsfi9j6lI9/T6MNZ+/LM2L/t72Vau4r7m94JDEzaO3A0wHAtQ97fjBfBiO5M8AEISAV7eZidIl3iaJJHkQbBYiiW2gikreUZKPUX0HmlnIqqQcBJhWKRu6Nqk6aZBTETLLpGrvF9OArV1JSsbdw/ZH+P88RAt5em5/gjwwtFlNHyiKG5w+UFpaZOK3gZP0su0sa6dlPeQ9EL4JlFkGqQCgSQ+NOsXqaOavgoP5VLykLwuGnwIUnuhBTVeDbzpgrg9LuF5dYp/zs+Y9ScJqe5VMAagLSYTShNtN8luV7LvxF9pgWwZdcM7lUwqJmUddCiZqdngg3vzTactMToG16gZA4CWnMgbU4E+r541+FNMpgAZNvs2CiW/eApfaaQojsZEAHDsDv4L5n3M1CC7fYjE/d61aSng1LaO6T1mh+dEfPvLzp7zyzz+UgWMhi5Cs4pcXx1eic5r7uxPoBwcCTt3YI1jKVVnV7/w=",
    b64Key: "MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAgEAAoIBAQACAggAMBQGCCqGSIb3DQMHBAgwggS9AgEAMASCBMh4EHl7aNSCaMDA1VlRoXCZ5UUmqErAbucRBAKNQXH8t1GNfLDIQejtcocS39VvWnpNXjZJeCg65Y2wI36UGn78gvnU0NOmyUkXksPVrkz7hqNtAVojPUtN65l+MVAsIRVD6OLJeKZ2bLx5z78zrx6Tp1zCGT/NpxL+CJSy5iY6TKqbJcK/9198noOvT2p8rKVqUUF3wLRvD6R/b3BC5wCon/exp3BUTZeiWJqGRRgaW4rn49ZbJPVIcDmUO8mojPesFHjJDSnA0nBnWaUvTYXi0srT+dLZOewsBR8d5GdSWh9ZkM29wJbjYHCMsXkObZjaap3YM8fU29zRyZ8KAqaCnBHCfYjbib56m+Lmnk+ScqMkQQ+S/+2pzn2LzauvBI4p/OjQgBDeblo22X7sX9OA9YaqB3q6CCjQ5tkDNrz3HOgTm+amh/kI8TEn9rcKf4Ru7mC1T7VMaFgBqpIS8YJNbcgegF0IF1FpCS05wjdU5CktYAnPnvC+Pj+MFDeH+184kIHBWqPNG6dAzALxRgtKTlGdJ1l5Do+4EWI+0mvKojREnKoDczFnDeCFnM51u3I9Vce3rkf0djRQKFomPVUnPDqxlR5lDAssYAYNcECAkvGxKcBDbjWi/6NHlwjS1r28+0Jhvfxjx9O6hi4AW82Q2/kBE5P/eOwln/jKSbLgi7Iyim1FFHxkQH1FY5kcKhAzFcIq85rGFlzHRfPF9OIQSmONI9kcWQCxkk8aG1u1zwbjZRYLTxlwmZvynOgaWRpTN8Y4ReBDIG1klhva7nqqoM416oXBG71IKaCtjAwRlE6pgaqnIz/WQAb2FR541pqynX6dB6DB1nIWnatsWZJZlu+Bnhf9DBlUsO9ZSAf9Fa9nJAzwFCzaKIsvGJIeKSZ/h+vInkjaO/rxswErVROTfZy1lO2CJ/xnAgzFGrpDxNJPliv3McO9TGwYy/zHhE6Pdo8Xu6NsMisNU6TB8Bc26uLNv/7kWhNmNnBA1qt5akln6hOHrPBXGBiTNUL0IoFVPNdCbS0834zAYXfgtZLDzVpeLqmeMpqXbIYK0/NXe9etxuOcN40O+B/fTHHmO7dMgBZ4vAApVQUPr7ilumVHsWSMRP/0p5R9q4qr1bDm9S5YCPevdyYWTSceGSrXHmjYzJLBtpc/s77mynNqZEYjhnKk2XRNp6kp/FYRu+QdsX9vaDJbLKR2EnSC4fU6UOTO03IZU15j3wOsg30QrXoKntSJ/beF99cvFHuPrQPWxCtws0lLwkkHNVOm6XNO948Moy1w1pL4i68CwmceYZaYrYhmHGdLuescFQrZQaULDWhpK2Stys8Vs/XwwxNi9MHAFSXpdy/b+Aro5n87w+0MHRcllF8ZKbtQ/ym4oG7aREuo7o71JXJQPjZKTOtVM1EQx/FLM/5brnDSoyvLtoYtv9/tTnIC+8gR6eErkzaGmn8pftPhGNuz6yzx8JeLFoMD7VWbGTefj46KS+yMweFJnpReHEqwnukXpEYq19EWVyQa/Sb7navtKt80y/vRs0aNZp3iL23AOs0u1kQ1CFNY2y12Gor1koaH2FUd5jAQnaSKmgarLy0H/QVvR2g8B3+Fh49QhKYrd8N6LvvI80cwbEoqYWn5DWA="
};

var callback = (err, data) => { //creamos un callback donde se podra acceder a los valores
	if(err) {//si ocurre un error aqui se podrá manejar
		console.log(err)
	} else { //en caso contrario accedemos a la respuesta
		console.log(data)
	}
};

var cancelation = CancelationService.Set(params); //asignamos los parametros al servicio
cancelation.CancelationByCSD(callback);//intentamos realizar la cancelación

Cancelacion por XML

Como su nombre lo indica, este servicio recibe únicamente el XML sellado con los UUID a cancelar. Paso 1: Obtener token de acceso, o en su defecto usar token infinito Primeramente se deberá autenticar en nuestros servicios en orden de obtener token de acceso, o si se desea,  se puede usar el token infinito. Paso 2: Enviar datos necesarios Se envían los datos necesarios para la cancelación, que únicamente es el XML.

HTTP Request por XML

HTTP Response por XML

Cancelar con las librerias por XML

Ir al Repositorio de C# en GitHub (Clic en la imagen para hacer mas grande)

Ir al Repositorio de Java en GitHub

 package sample_test; import Services.Cancelation.SWCancelationService; import Utils.Responses.CancelationResponse; public class sample_test_cancelation_xml { public static void main(String args) { //Datos requeridos para generar el acuse de cancelación por XML. String xml = "<?xml version="1.0" encoding="utf-8"?><Cancelacion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" RfcEmisor="LAN7008173R5" Fecha="2017-07-06T17:00:31" xmlns="http://cancelacfd.sat.gob.mx"><Folios><UUID>3eaeabc9-ea41-4627-9609-c6856b78e2b1</UUID></Folios><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>rs2ZcFnS9hbfmyJLmR3Mtnklt7g=</DigestValue></Reference></SignedInfo><SignatureValue>O/I7ILsU2y1fqeb2NBZSQKlQC3DpN/bgcDB5LWCMIYp4mFCLmLxEq/6ADz0xVQWUw49BqWDZ1GAI4ODIZLDQtafHSIE7BXKy8huvKD1dtpRLQ/39IfpxXsz1g6Q14mH3LxDOQugk/GhKMWILXZnIipyQosv3IbgLMZ/V/4btK7xrFX/KiOt0PcefChyaerj9A815dA3J4JgpBUNzbOz9VlhvdZMJskrHxzZ5riU1TAuSw/oi68dJfA7S+6XrTmeFDQzYxACHyOzj24RjLi/31+Fc/wiqQXNu9O6oWl8p5+GVoz2xtU4aRqLxVh73L6WAAef/WDeKDMfIge1BtMrxYw==</SignatureValue><KeyInfo><X509Data><X509IssuerSerial><X509IssuerName>OID.1.2.840.113549.1.9.2=Responsable: ACDMA, OID.2.5.4.45=SAT970701NN3, L=Coyoac?n, S=Distrito Federal, C=MX, PostalCode=06300, STREET="Av. Hidalgo 77, Col. Guerrero", E=asisnet@pruebas.sat.gob.mx, OU=Administraci?n de Seguridad de la Informaci?n, O=Servicio de Administraci?n Tributaria, CN=A.C. 2 de pruebas(4096)</X509IssuerName><X509SerialNumber>3230303031303030303030333030303232383135</X509SerialNumber></X509IssuerSerial><X509Certificate>MIIFxTCCA62gAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjUyMTUyMTFaFw0yMDEwMjUyMTUyMTFaMIGxMRowGAYDVQQDExFDSU5ERU1FWCBTQSBERSBDVjEaMBgGA1UEKRMRQ0lOREVNRVggU0EgREUgQ1YxGjAYBgNVBAoTEUNJTkRFTUVYIFNBIERFIENWMSUwIwYDVQQtExxMQU43MDA4MTczUjUgLyBGVUFCNzcwMTE3QlhBMR4wHAYDVQQFExUgLyBGVUFCNzcwMTE3TURGUk5OMDkxFDASBgNVBAsUC1BydWViYV9DRkRJMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAJ/xkL8I+fpilZP+9aO8n93+20XxVomLJjeSL+Ng2ErL2GgatpLuN5JknFBkZAhxVIgMaTS23zzk1RLtRaYvH83lBH5E+M+kEjFGp14Fne1iV2Pm3vL4jeLmzHgY1Kf5HmeVrrp4PU7WQg16VpyHaJ/eonPNiEBUjcyQ1iFfkzJmnSJvDGtfQK2TiEolDJApYv0OWdm4is9Bsfi9j6lI9/T6MNZ+/LM2L/t72Vau4r7m94JDEzaO3A0wHAtQ97fjBfBiO5M8AEISAV7eZidIl3iaJJHkQbBYiiW2gikreUZKPUX0HmlnIqqQcBJhWKRu6Nqk6aZBTETLLpGrvF9OArV1JSsbdw/ZH+P88RAt5em5/gjwwtFlNHyiKG5w+UFpaZOK3gZP0su0sa6dlPeQ9EL4JlFkGqQCgSQ+NOsXqaOavgoP5VLykLwuGnwIUnuhBTVeDbzpgrg9LuF5dYp/zs+Y9ScJqe5VMAagLSYTShNtN8luV7LvxF9pgWwZdcM7lUwqJmUddCiZqdngg3vzTactMToG16gZA4CWnMgbU4E+r541+FNMpgAZNvs2CiW/eApfaaQojsZEAHDsDv4L5n3M1CC7fYjE/d61aSng1LaO6T1mh+dEfPvLzp7zyzz+UgWMhi5Cs4pcXx1eic5r7uxPoBwcCTt3YI1jKVVnV7/w=</X509Certificate></X509Data></KeyInfo></Signature></Cancelacion>"; try{ //Ejemplo de cancelación utilizando la librería sw-java ( https://search.maven.org/#search%7Cga%7C1%7Ca%3A%22SW-JAVA%22 ) //Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso //Se especifica el base path, esto para consumir el api de pruebas o productivo SWCancelationService api = new SWCancelationService("demo","123456789","http://services.test.sw.com.mx"); //Se inicializa un objeto response, que obtendra la respuesta del api CancelationResponse response = null; //Se asigna el resultado de la respuesta a dicho objeto, haciendo el cast a un objeto CancelationResponse //Se ejecuta el metodo "Cancelar", que generará el acuse de cancelación, el uuid y el status de la cancelación response = (CancelationResponse)api.Cancelation(xml); //El objeto response tendra así los atributos: // Status: estado de la petición procesada, puede ser : "success", "fail", "error" // HttpStatusCode: Codigo de respuesta HTTP del servidor: eg. 200, 400, 500 // Acuse: xml del acuse de cancelación // uuid: uuid del xml cancelado // uuidStatusCode: código de respuesta de folios de cancelación System.out.println(response.Status); System.out.println(response.HttpStatusCode); System.out.println(response.acuse); System.out.println(response.uuid); System.out.println(response.uuidStatusCode); // en caso de error, puede ver el mensaje en messsage y/o messageDetail System.out.println(response.message); System.out.println(response.messageDetail); } catch(Exception e){ //En caso de obtener estatus "fail", "error" //Se generara una excepción System.out.println(e.getMessage()); } } } 

Ir al Repositorio de PHP en GitHub

<?php require_once "vendor/autoload.php"; use SWServicesCancelationCancelationService as CancelationService; //incluimos el servicio $params = array(//inicializamos los parámetros "url"=>"http://services.test.sw.com.mx/",   
        "token"=>"T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUXpTUm9mTG1ySXdZbFNja3FRa0RlYURqbzdzdlI2UUx1WGJiKzViUWY2dnZGbFloUDJ6RjhFTGF4M1BySnJ4cHF0YjUvbmRyWWpjTkVLN3ppd3RxL0dJPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxrUndzK0dHS2dpTittY1JmR3o2M3NqNkh4MW9KVXMvUHhZYzVLQS9UK2E1SVhEZFJKYWx4ZmlEWDFuSXlqc2ZRYXlUQk1ldlZkU2tEdU10NFVMdHZKUURLblBxakw0SDl5bUxabDFLNmNPbEp6b3Jtd2Q1V2htRHlTdDZ6eTFRdUNnYnVvK2tuVUdhMmwrVWRCZi9rQkU9.7k2gVCGSZKLzJK5Ky3Nr5tKxvGSJhL13Q8W-YhT0uIo",
        "xml"=> file_get_contents("./cancelByXml.xml"),
    );

    try {
        header("Content-type: application/json");
        $cancelationService = CancelationService::Set($params);//asignamos los parámetros
        $result = $cancelationService::CancelationByXML();//usamos el servicio de cancelación
        var_dump($result);
    } catch(Exception $e) {
        header("Content-type: text/plain");
        echo $e->getMessage();
    }
?>

Ir al Repositorio de Node.js en GitHub

const CancelationService = require("sw-sdk-nodejs").CancelationService; //agregamos el servicio
var params = { //parámetros requeridos
	url: "services.test.sw.com.mx",
	token: "T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUXpTUm9mTG1ySXdZbFNja3FRa0RlYURqbzdzdlI2UUx1WGJiKzViUWY2dnZGbFloUDJ6RjhFTGF4M1BySnJ4cHF0YjUvbmRyWWpjTkVLN3ppd3RxL0dJPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxrUndzK0dHS2dpTittY1JmR3o2M3NqNkh4MW9KVXMvUHhZYzVLQS9UK2E1SVhEZFJKYWx4ZmlEWDFuSXlqc2ZRYXlUQk1ldlZkU2tEdU10NFVMdHZKUURLblBxakw0SDl5bUxabDFLNmNPbEp6b3Jtd2Q1V2htRHlTdDZ6eTFRdUNnYnVvK2tuVUdhMmwrVWRCZi9rQkU9.7k2gVCGSZKLzJK5Ky3Nr5tKxvGSJhL13Q8W-YhT0uIo",
	xml:  "<?xml version="1.0" encoding="utf-8"?><Cancelacion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" RfcEmisor="LAN7008173R5" Fecha="2017-07-06T17:00:31" xmlns="http://cancelacfd.sat.gob.mx"><Folios><UUID>3eaeabc9-ea41-4627-9609-c6856b78e2b1</UUID></Folios><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>rs2ZcFnS9hbfmyJLmR3Mtnklt7g=</DigestValue></Reference></SignedInfo><SignatureValue>O/I7ILsU2y1fqeb2NBZSQKlQC3DpN/bgcDB5LWCMIYp4mFCLmLxEq/6ADz0xVQWUw49BqWDZ1GAI4ODIZLDQtafHSIE7BXKy8huvKD1dtpRLQ/39IfpxXsz1g6Q14mH3LxDOQugk/GhKMWILXZnIipyQosv3IbgLMZ/V/4btK7xrFX/KiOt0PcefChyaerj9A815dA3J4JgpBUNzbOz9VlhvdZMJskrHxzZ5riU1TAuSw/oi68dJfA7S+6XrTmeFDQzYxACHyOzj24RjLi/31+Fc/wiqQXNu9O6oWl8p5+GVoz2xtU4aRqLxVh73L6WAAef/WDeKDMfIge1BtMrxYw==</SignatureValue><KeyInfo><X509Data><X509IssuerSerial><X509IssuerName>OID.1.2.840.113549.1.9.2=Responsable: ACDMA, OID.2.5.4.45=SAT970701NN3, L=Coyoac?n, S=Distrito Federal, C=MX, PostalCode=06300, STREET="Av. Hidalgo 77, Col. Guerrero", E=asisnet@pruebas.sat.gob.mx, OU=Administraci?n de Seguridad de la Informaci?n, O=Servicio de Administraci?n Tributaria, CN=A.C. 2 de pruebas(4096)</X509IssuerName><X509SerialNumber>3230303031303030303030333030303232383135</X509SerialNumber></X509IssuerSerial><X509Certificate>MIIFxTCCA62gAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjUyMTUyMTFaFw0yMDEwMjUyMTUyMTFaMIGxMRowGAYDVQQDExFDSU5ERU1FWCBTQSBERSBDVjEaMBgGA1UEKRMRQ0lOREVNRVggU0EgREUgQ1YxGjAYBgNVBAoTEUNJTkRFTUVYIFNBIERFIENWMSUwIwYDVQQtExxMQU43MDA4MTczUjUgLyBGVUFCNzcwMTE3QlhBMR4wHAYDVQQFExUgLyBGVUFCNzcwMTE3TURGUk5OMDkxFDASBgNVBAsUC1BydWViYV9DRkRJMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAJ/xkL8I+fpilZP+9aO8n93+20XxVomLJjeSL+Ng2ErL2GgatpLuN5JknFBkZAhxVIgMaTS23zzk1RLtRaYvH83lBH5E+M+kEjFGp14Fne1iV2Pm3vL4jeLmzHgY1Kf5HmeVrrp4PU7WQg16VpyHaJ/eonPNiEBUjcyQ1iFfkzJmnSJvDGtfQK2TiEolDJApYv0OWdm4is9Bsfi9j6lI9/T6MNZ+/LM2L/t72Vau4r7m94JDEzaO3A0wHAtQ97fjBfBiO5M8AEISAV7eZidIl3iaJJHkQbBYiiW2gikreUZKPUX0HmlnIqqQcBJhWKRu6Nqk6aZBTETLLpGrvF9OArV1JSsbdw/ZH+P88RAt5em5/gjwwtFlNHyiKG5w+UFpaZOK3gZP0su0sa6dlPeQ9EL4JlFkGqQCgSQ+NOsXqaOavgoP5VLykLwuGnwIUnuhBTVeDbzpgrg9LuF5dYp/zs+Y9ScJqe5VMAagLSYTShNtN8luV7LvxF9pgWwZdcM7lUwqJmUddCiZqdngg3vzTactMToG16gZA4CWnMgbU4E+r541+FNMpgAZNvs2CiW/eApfaaQojsZEAHDsDv4L5n3M1CC7fYjE/d61aSng1LaO6T1mh+dEfPvLzp7zyzz+UgWMhi5Cs4pcXx1eic5r7uxPoBwcCTt3YI1jKVVnV7/w=</X509Certificate></X509Data></KeyInfo></Signature></Cancelacion>"

};

var callback = (err, data) => { //creamos un callback para poder acceder a la información
	if(err) {
		console.log(err)//si ocurre un error aqui se podrá manejar
	} else {
		console.log(data)//en caso contrario accedemos a la respuesta
	}
};

var cancelation = CancelationService.Set(params); //asignamos los parametros al servicio
cancelation.CancelationByXML(callback);//intentamos realizar la cancelación

 

Cancelacion por PFX


Como su nombre lo indica, este servicio recibe todos los elementos que componen el PFX los cuales son los siguientes:

  • PFX
  • Password del archivo key
  • RFC emisor

Esto ya que nuestro servidor generara el acuse de cancelación.
Paso 1: Obtener token de acceso, o en su defecto usar token infinito
Primeramente se deberá autenticar en nuestros servicios en orden de obtener token de acceso, o si se desea,  se puede usar el token infinito.
Paso 2: Enviar datos necesarios
Se envían los datos necesarios para la cancelación, que básicamente es el CSD del emisor que desea cancelar un CFDI, así como el RFC de dicho emisor, el uuid correspondientes al CFDI que se desea cancelar,  y por supuesto el token de acceso anteriormente generado.

Cabe mencionar que los archivos .pfx,  al ser binarios, deberán enviarse en formato base64 para que podamos procesarlos en nuestro servidor.

HTTP Request por PFX

 

HTTP Response por PFX


Cancelacion por UUID


Para utilizar este servicio es necesario cargar los certificados en nuestro administrador de timbres
, así mismo se proporcionan los siguientes elementos:

  • UUID
  • RFC emisor

Esto ya que nuestro servidor generara el acuse de cancelación.
Paso 1: Obtener token de acceso, o en su defecto usar token infinito
Primeramente se deberá autenticar en nuestros servicios en orden de obtener token de acceso, o si se desea,  se puede usar el token infinito.
Paso 2: Enviar datos necesarios
Se envían los datos necesarios para la cancelación, que básicamente es el CSD del emisor que desea cancelar un CFDI, así como el RFC de dicho emisor, el uuid correspondientes al CFDI que se desea cancelar,  y por supuesto el token de acceso anteriormente generado.

Cabe mencionar que los archivos .pfx,  al ser binarios, deberán enviarse en formato base64 para que podamos procesarlos en nuestro servidor.

HTTP Request por UUID

HTTP Response por UUID

Respuestas de cancelación

Todos los response de cancelación retornan la misma estructura en caso de error o en caso de petición satisfactoria, las cuales son las siguientes:

Tipos de respuesta

En caso de una respuesta exitosa, se regresará un 200. En caso de una respuesta no exitosa, se regresará un código diferente de 200, el código puede variar dependiendo del problema dado.

Respuesta exitosa

En este caso se recibe un mensaje JSON, el cual contiene los siguientes datos:

  • Acuse: Xml de acuse que regresa el SAT, Se considera una solicitud de cancelación exitosa, sin embargo esto no asegura su cancelación.
  • UUID: uuid de la solicitud y el estatus de el. (Para más información, consulte la lista de códigos de respuesta de UUID aquí)

Respuesta no exitosa

Códigos de respuesta de folios de cancelación

Codigo
Mensaje
Descripción

201

UUID Cancelado exitosamente Se considera una solicitud de cancelación exitosa, sin embargo esto no asegura su cancelación

202

UUID Previamente cancelado Se considera previamente cancelado. Estatus Cancelado ante el SAT.

203

UUID No corresponde el RFC del emisor y de quien solicita la cancelación.

205

No Existe El sat da una prorroga de 72 hrs para que el comprobante aparezca con estatus Vigente posterior al envió por parte del Proveedor de Certificación de CFDI. Puede que algunos comprobantes no aparezcan al momento, es necesario esperar por lo menos 72 hrs.

 

Para realizar la integración con nuestros servicios recomendamos utilizar POSTMAN , facilita las pruebas previas a la codificación.
Puedes importar el archivo POSTMAN-collection que proporcionamos al final del articulo para su descarga en POSTMAN para que puedas realizar pruebas funcionales de nuestro servicio.

 

Siguientes Pasos: 

Updated on agosto 15, 2019

Article Attachments

Was this article helpful?

Related Articles

  • Eduardo Gm

    ya actualizaron la librería para usar en Package Manager Console los métodos para Cancelar por CSD y XML?

  • Ibrahim Bittar Torres

    ¿Siguen activos los métodos de cancelación vía SOAP?

    • alejandro ramos

      Si, Saludos!

  • Oscar Guillen

    el metodo CancelarByCSD me retorna message:”401″, detailMessage:”Unauthorized”

    • dev

      Hola buenos días, lo que podría haber pasado es que no se le está proporcionando de manera correcta las credenciales para utilizar los servicios. Podrías dar de alta un caso a nuestra mesa de ayuda para poder asesorarte de mejor manera. Saludos

  • Cursos Loxar LTI

    Cuando liberan el metodo de cancelar por PFX en el Nuget Package para C#??

    • Hermes Jimenez

      Que tal Cursos Loxar TI , solo para comentarte que este metodo ya se encuentra disponible en nuestra ultima version del nuget v0.0.2.3 : https://github.com/lunasoft/sw-sdk-dotnet

      Cualquier duda estamos a tus ordenes.

  • Jose Mendoza

    Buenas tardes, me marca el error al querer cancelar un xml timbrado por su metodo Timbrar CFDI V4 (PHP), CA1000 – El xml proporcionado está mal formado o es inválido.
    me marca ese error por ser un timbre de pruebas?, espero puedan responder.

    • Hermes Jimenez

      Que tal Jose buen día. Que método de cancelación estas utilizando? Con gusto te apoyamos, de preferencia nos podrías enviar el HTTP Request o algún ejemplo de como estas consumiendo nuestro servicio al correo soporte@sw.com.mx para poder darle el seguimiento adecuado.

  • Halcon Dev

    Creé un xml de prueba en el entorno de pruebas , me selló correctamente, pero, al mandar la petición de cancelación por método CSD me manda el siguiente error:

    stdClass Object
    (
    [message] => CA305 – La fecha de emisión no esta dentro de la vigencia del CSD del Emisor.
    [status] => error
    )
    El CSD con que se firmo es vigente, que solución hay o es porque es entorno de pruebas?

    • Hermes Jimenez

      Que tal Halcon Dev, esto nos sucede con CSD reales, puedes intentar realizar la prueba con el rfc de pruebas LAN7008173R5. Quedamos atento a tus comentarios.

  • Halcon Dev

    ¿de donde bajo el .key y el .cer del rfc LAN7008173R5? Igual y lo pongo en producción y ya un cfdi real lo puedo cancelar cuando se necesite cancelación y si me da error pues veremos porque no cancela. Porque de sellar si sella bien.

  • Esther Machado

    Buen Dia,
    Quiero hacer la cancelacion por medio de xml y el lenguaje que estoy utilizando es python, no se si podrian ayudarme con algun ejemplo de como tengo que enviar el request??

    • Soporte SW

      Buenas tardes, no ha sido actualizada la página de la información de cancelaciones con Python pero escribenos un correo a soporte@sw.com.mx y te hacemos llegar un ejemplo de tu solicitud, buenas tardes.

  • VALTIERRA VALADEZ JUAN IGNACIO

    Intento realizar una cancelación por JAVA. Me regresa el siguiente error:

    $statusCan = “error”;
    $httpStatuscan = “400”;
    $acuseCan = “null”;
    $uuidCan = “null”;
    $uuidCanStatus = “0”;
    $menCan = “CA1000 – El xml proporcionado está mal formado o es inválido.”;
    $menDetCan = “There is an error in XML document (1, 40).”;

    EL XML Que utilizo esta bien generado y validado, desconozco por que no me deja cancelar. Ya intente por UUID, CSD, KEY y CERT y me regresa el mismo error.

  • Esther Machado

    Y puedo seguir cancelando con el antiguo server o tengo que actualizarlo a estos server??

    • Emmanuel Segoviano

      Buen día, la cancelación puede consumirla como anteriormente lo hacía, este servicio seguira activo hasta nuevo aviso, saludos.

      • Esther Machado

        Gracias!

  • Mashter Ventas

    Buen dia
    Cuando tendran informacion del nuevo metodo de la cancelacion del 3.3
    Saludos

    • admin_cdi

      Buen día, la semana pasada se impartió un taller online referente al tema, este se publicará próximamente en nuestro canal de Youtube. Adicionalmente puede solicitar la informacion escribiendo a soporte@sw.com.mx Saludos!

  • Juan Ignacio Valtierra Valadez

    Buenas tardes. Ya tengo implementada una solución con la cancelación de Java. Será necesario cambiar la libreria, el código o el lenguaje con el que realizo esta tarea para el nuevo proceso de cancelación?

    Saludos.

    • Juan Carlos Gamez Cuevas

      Buenos días Juan Ignacio, actualmente estamos trabajando en añadir los nuevos métodos a la librería que se mencionan arriba, sin embargo el método de cancelación sigue siendo el mismo método [Ejemplo en java: response = (CancelationResponse) app.Cancelation(uuid, password_csd, rfc, b64Cer, b64Key);], solo que para cancelar necesitarás hacer más validaciones antes y después de cancelar.

      Saludos!

  • Talia Maribel Tun Balam

    Hola, buenas tardes tengo una duda cuando llamo el método de Cancelar y el CFDI es Cancelable con aceptación, se envía la solicitud de cancelación ¿cuál es el código del estado que devuelve? supongo que debe ser diferente al 201.

    • Juan Carlos Gamez Cuevas

      Buen día, el status es un 201 ya que se genera un acuse pero de “envio de solicitud”. En el nuevo esquema de cancelación el estatus 201 no significa que se haya cancelado. Por lo que recomendamos verificar el estatus de la factura a través del servicio correspondiente.

      Saludos!

  • Juan Ignacio Valtierra Valadez

    ¿Donde tienen la lista completa de los errores que arroja en la respuesta? 200,400,500?

    • Juan Carlos Gamez Cuevas

      Esos errores son HTTP, 200 (success), 300(Redirecciones), 400 (Error del cliente), 500(Error del Servidor o sin conexión a internet).

      Los otros errores correspondientes al método de cancelación están ya descritos en la sección “Códigos de respuesta”.

      Saludos!

  • Alejandro Sixto Martinez

    Hola, para cancelar una factura con plazo vencido se usa el mismo metodo de cancelacion php que si cancelara una directamente?

    • Juan Carlos Gamez Cuevas

      Buena tarde, es correcto. La validación de si requiere aceptación o se cancela en el instante la realiza el SAT.

      Saludos!

  • Christian Daniel Medina Herrer

    Cuando intento cancelar por UUID siempre me la siguiente respuesta negativa:

    {
    “message”: “CACFDI33 – Problemas con el xml.”,
    “messageDetail”: “CASD – Acuse sin descripción específica.”,
    “data”: null,
    “status”: “error”
    }

    Saludos

    • Juan Carlos Gamez Cuevas

      Buen día, ¿Con que servicio recibe ese error?, y ¿Que es lo que envía en el mismo?

      Saludos!

      • Christian Daniel Medina Herrer

        Hago el POST request en python y con Postman y da lo mismo, envio en headers el token como en el ejemplo y el Content-Type como application Json

        El body lo mando vacio y el endpoint es cfdi33/cancel/{(MI RFC)}/{(el UUID de la factura)}

        • Juan Carlos Gamez Cuevas

          Buena tarde, si tienes el certificado del RFC Emisor en la cuenta con la cual envías a cancelar?

          Saludos!

          • Christian Daniel Medina Herrer

            Si, ya mejor lo hice por CSD y funcionó, gracias

          • Christian Daniel Medina Herrer

            Disculpa ahora me está dando el mismo error con el método CSD, no entiendo… intenté con mis datos, y con su ejemplo también.

            {
            “message”: “CASD – Acuse sin descripción específica.”,
            “messageDetail”: “The remote server returned an error: (500) Internal Server Error.”,
            “data”: null,
            “status”: “error”
            }

            Con su ejemplo estoy intentando en Postman y da lo mismo

          • Christian Daniel Medina Herrer

            Estoy usando su servidor de pruebas y en mi base datos el usuario administrador

          • Juan Carlos Gamez Cuevas

            Buena tarde, el servicio de pruebas del SAT parece que no está funcionando debido a que nos está arrojando un error 500. Es por lo que nuestros servicios marcan un error de que el acuse viene vacío.
            Esperemos que lo solucionen rápido para que puedan seguir realizando pruebas.

            Saludos!

          • Christian Daniel Medina Herrer

            Buen día, gracias por la respuesta, esperemos que vuelva

  • David

    Buenas tardes, tendrán algún ejemplo del xml que se tiene que cargar para la cancelación con xml en php “cancelByXml.xml”?

    saludos!

  • Efrain

    Buenas tardes el método en java para consumir la cancelación por UUID, con la libreria ?

  • David

    Buenas tardes estoy tratando de usar la Cancelar con las librerías por CSD de php y me arroja los siguientes errores:

    object(stdClass)#3 (4) {
    [“message”]=>
    string(36) “CACFDI33 – Problemas con los campos.”
    [“messageDetail”]=>
    string(47) “El certificado no pertenece a la llave privada.”
    [“data”]=>
    NULL
    [“status”]=>
    string(5) “error”
    }

    Pasa usando los .cer y .key de test y también cambiándolos por otros arroja lo mismo.
    https://uploads.disquscdn.com/images/1f17c6167e063ea7607118f34a031d8fb21d64e15fa1ad55fc58b0f2e0202fd5.png

    • Juan Carlos Gamez Cuevas

      Buen día, la contraseña de la llave privada es incorrecta, debería ser “12345678a”. Así mismo una vez corregido eso, te mostrará error de que el certificado está revocado, prueba utilizando los nuevos CSD.

      Saludos!