/*
         *  Wsdl=http://testing.solucionfactible.com/ws/services/Timbrado?wsdl
         *  [email protected]
         *  Password=timbrado.SF.16672
         */
        override protected void RequestTimbrar(XmlDocument xml, string wsdl, string user, string password, string idCliente)
        {
            byte[] bytes     = Encoding.UTF8.GetBytes(xml.InnerXml);
            string xmlBase64 = Convert.ToBase64String(bytes);

            BasicHttpBinding binding = new BasicHttpBinding();
            EndpointAddress  address = new EndpointAddress(wsdl);

            TimbradoPortTypeClient client        = new TimbradoPortTypeClient(binding, address);
            CFDICertificacion      certificacion = client.timbrarBase64(user, password, xmlBase64, false);

            if (certificacion.status != 200)
            {
                throw new ComprobanteFiscalDigitalException(certificacion.mensaje);
            }

            CFDIResultadoCertificacion result = certificacion.resultados[0];

            if (result.status != 200)
            {
                throw new ComprobanteFiscalDigitalException(result.mensaje);
            }

            this.FechaTimbrado  = result.fechaTimbrado == null ? DateTime.Now : result.fechaTimbrado.Value;
            this.NoCertificado  = result.certificadoSAT;
            this.Sello          = result.selloSAT;
            this.UUID           = result.uuid;
            this.CadenaOriginal = result.cadenaOriginal;
            this.QRCode         = result.qrCode;
            this.XmlTimbrado    = new XmlDocument();
            XmlTimbrado.LoadXml(Encoding.UTF8.GetString(result.cfdiTimbrado));
        }
        override protected void RequestCancelar(XmlDocument xml, string certFilePath, string keyFilePath, string passwordKeyFile, string wsdl, string user, string password, string idCliente)
        {
            byte[] bytes     = Encoding.UTF8.GetBytes(xml.InnerXml);
            string xmlBase64 = Convert.ToBase64String(bytes);

            BasicHttpBinding binding = new BasicHttpBinding();
            EndpointAddress  address = new EndpointAddress(wsdl);

            string[]            uuids = new string[1];
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);

            nsmgr.AddNamespace("tfd", @"http://www.sat.gob.mx/TimbreFiscalDigital");
            uuids[0] = xml.DocumentElement.SelectSingleNode("//tfd:TimbreFiscalDigital/@UUID", nsmgr).Value;

            TimbradoPortTypeClient client      = new TimbradoPortTypeClient(binding, address);
            CFDICancelacion        cancelacion = client.cancelarBase64(user, password, uuids,
                                                                       Convert.ToBase64String(File.ReadAllBytes(certFilePath)),
                                                                       Convert.ToBase64String(File.ReadAllBytes(keyFilePath)),
                                                                       passwordKeyFile);

            if (cancelacion.status != 200)
            {
                throw new ComprobanteFiscalDigitalException(cancelacion.mensaje);
            }

            CFDIResultadoCancelacion resultado = cancelacion.resultados[0];

            if (resultado.status != 200)
            {
                throw new ComprobanteFiscalDigitalException(resultado.mensaje);
            }

            if (resultado.statusUUID != "201")
            {
                if (resultado.statusUUID == "202")
                {
                    throw new ComprobanteFiscalDigitalException("El folio ya se había cancelado previamente");
                }
                if (resultado.statusUUID == "203")
                {
                    throw new ComprobanteFiscalDigitalException("El comprobante que intenta cancelar no corresponde al contribuyente con el que se ha firmado la solicitud de cancelación");
                }
                if (resultado.statusUUID == "204")
                {
                    throw new ComprobanteFiscalDigitalException("El CFDI no aplica para cancelación");
                }
                if (resultado.statusUUID == "205")
                {
                    throw new ComprobanteFiscalDigitalException("No se encuentra el folio del CFDI para su cancelación");
                }
            }
        }