SDK NetStandard
Librería NetStandard para el consumo de los servicios de SW sapien®.
Contenido
Compatibilidad
- CFDI 4.0
-
Net Framework 4.5 o superior.
Dependencias
Documentación
Instalación
Instalar la librería a traves Package Manager Console nuget.org
Install-Package SW-sdk-netstandard
En caso de no utilizar Package Manager Console puedes descargar la librería directamente a través del siguiente link y agregarla como Referencia local a tu proyecto. Asegurate de utilizar la última versión publicada.
Implementación
La librería contará con los servicios principales como lo son Timbrado de CFDI, Cancelación, Consulta estatus CFDI, etc.
Autenticación
El servicio de Autenticación es utilizado principalmente para obtener el token el cual será utilizado para poder timbrar nuestro CFDI (xml) ya emitido (sellado), para poder utilizar este servicio es necesario que cuente con un usuario y contraseña para posteriormente obtenga el token, usted puede utilizar los que están en este ejemplo para el ambiente de Pruebas.
Ejemplo de consumo de la librería para obtener token
using SW.Services.Authentication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Authentication
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
Authentication auth = new Authentication("http://services.test.sw.com.mx", "user", "password");
AuthResponse response = await auth.GetTokenAsync();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Timbrado
Timbrado CFDI V1
**TimbrarV1** Recibe el contenido de un **XML** ya emitido (sellado) en formato **String** ó tambien puede ser en **Base64**, posteriormente si la factura y el token son correctos devuelve el complemento timbre en un string (**TFD**), en caso contrario lanza una excepción.
Este método recibe los siguientes parámetros:
* Archivo en formato **String** ó **Base64**
* Usuario y contraseña ó Token
* Url Servicios SW
**Ejemplo de consumo de la librería para timbrar XML en formato string utilizando usuario y contraseña**
```cs
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Stamp
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el xml
Stamp stamp = new Stamp("http://services.test.sw.com.mx", "user", "password");
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("file.xml"));
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para timbrar XML en formato string utilizando token** [¿Como obtener token?](http://developers.sw.com.mx/knowledge-base/generar-un-token-infinito/)
```cs
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Stamp
//A esta le pasamos la Url y el token
//Despues se procedera a timbrar el xml
Stamp stamp = new Stamp("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("file.xml"));
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para timbrar XML en Base64 utilizando token**
```cs
using SW.Services.Stamp;
using System;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Stamp
//A esta le pasamos la Url y el token
//Despues se procedera a timbrar el xml
Stamp stamp = new Stamp("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var xml = Convert.ToBase64String(Encoding.UTF8.GetBytes("file.xml"));
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml,true);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Emisión Timbrado V1
**Emisión Timbrado** Realiza el sellado y timbrado de un comprobante CFDI 4.0. Recibe el contenido de un **XML** en formato **String** ó tambien puede ser en **Base64**, posteriormente si la factura y el token son correctos devuelve el complemento timbre en un string (**TFD**), en caso contrario lanza una excepción.
Este método recibe los siguientes parámetros:
* Archivo en formato **String** ó **Base64**
* Usuario y contraseña ó Token
* Url Servicios SW
**Ejemplo de consumo de la librería para la emisión Timbrado XML en formato string utilizando usuario y contraseña**
```cs
using SW.Services.Issue;
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Issue
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el xml
Issue issue = new Issue("http://services.test.sw.com.mx", "user", "password");
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("file.xml"));
var response = (StampResponseV1)await issue.TimbrarV1Async(xml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para la emisión Timbrado XML en formato string utilizando token**
```cs
using SW.Services.Issue;
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Issue
//A esta le pasamos la Url y el token
//Despues se procedera a timbrar el XML
Issue issue = new Issue("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("file.xml"));
var response = (StampResponseV1)await issue.TimbrarV1Async(xml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Emisión Timbrado JSON V1
**Emisión Timbrado JSON** Realiza el sellado y timbrado de un CFDI 4.0. Recibe el contenido de un **JSON** en formato **String**, posteriormente si la factura y el token son correctos devuelve el complemento timbre en un string (**TFD**), en caso contrario lanza una excepción
Este método recibe los siguientes parámetros:
* Archivo en formato **String**
* Usuario y contraseña ó Token
* Url Servicios SW
**Ejemplo de consumo de la librería para la emisión Timbrado JSON en formato string utilizando usuario y contraseña**
```cs
using SW.Services.Issue;
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo IssueJson
//A esta le pasamos la Url, usuario y contraseña
//Despues se procedera a timbrar el XML
IssueJson issue = new IssueJson("http://services.test.sw.com.mx", "user", "password");
var json = Encoding.UTF8.GetString(File.ReadAllBytes("file.json"));
var response = (StampResponseV1)await issue.TimbrarJsonV1Async(json);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para la emisión Timbrado JSON en formato string utilizando token**
```cs
using SW.Services.Issue;
using SW.Services.Stamp;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo IssueJson
//A esta le pasamos la Url y su Token infinito
//Despues se procedera a timbrar el XML
IssueJson issue = new IssueJson("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var json = Encoding.UTF8.GetString(File.ReadAllBytes("file.json"));
var response = (StampResponseV1)await issue.TimbrarJsonV1Async(json);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
:pushpin: NOTA: Existen varias versiones de respuesta, las cuales son las siguientes:
Version |
Respuesta |
V1 |
Devuelve el timbre fiscal digital |
V2 |
Devuelve el timbre fiscal digital y el CFDI timbrado |
V3 |
Devuelve el CFDI timbrado |
V4 |
Devuelve todos los datos del timbrado |
Para mayor referencia de estas versiones de respuesta, favor de visitar el siguiente link.
Cancelación
Este servicio se utiliza para cancelar documentos xml y se puede hacer mediante varios métodos Cancelación CSD, Cancelación PFX, Cancelacion por XML y Cancelación UUID.
Cancelación por CSD
Como su nombre lo indica, este método realiza la cancelacion mediante los CSD.
Este método recibe los siguientes parámetros:
* Usuario y contraseña
* Url Servicios SW
* Certificado (.cer) en **Base64**
* Key (.key) en **Base64**
* RFC emisor
* Password del archivo key
* UUID
* Motivo
* Folio Sustitución (Si el motivo es 01: "Comprobante emitido con errores con relación")
**Ejemplo de consumo de la librería para cancelar con CSD con motivo de cancelación 02 "Comprobante emitido con errores sin relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string password = "12345678a";
string rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
//Obtenemos Certificado y lo convertimos a Base 64
string csdBase64 = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.cer"));
//Obtenemos LLave y lo convertimos a Base 64
string keyBase64 = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.key"));
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByCSDAsync(csdBase64, keyBase64, rfc, password, uuid, "02");
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para cancelar con CSD con motivo de cancelación 01 "Comprobante emitido con errores con relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string password = "12345678a";
string rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
string folioSustitucion = "01724196-ac5a-4735-b621-e3b42bcbb459";
//Obtenemos Certificado y lo convertimos a Base 64
string csdBase64 = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.cer"));
//Obtenemos LLave y lo convertimos a Base 64
string keyBase64 = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.key"));
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByCSDAsync(csdBase64, keyBase64, rfc, password, uuid, "01", folioSustitucion);
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Cancelación por PFX
Como su nombre lo indica, este método realiza la cancelacion mediante el PFX.
Este método recibe los siguientes parámetros:
* Usuario y contraseña
* Url Servicios SW
* Archivo PFX en **Base64**
* RFC emisor
* Password (CSD)
* UUID
* Motivo
* Folio Sustitución
**Ejemplo de consumo de la libreria para cancelar con PFX con motivo de cancelación 02 "Comprobante emitido con errores con relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string password = "12345678a";
string Rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
//Obtenemos y convertimos el PFX a base 64
string Pfx = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.pfx"));
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByPFXAsync(Pfx, Rfc, password, uuid, "02");
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para cancelar con PFX con motivo 01 "Comprobante emitido con errores con relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string password = "12345678a";
string Rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
string folioSustitucion = "01724196-ac5a-4735-b621-e3b42bcbb459";
//Obtenemos Certificado y lo convertimos a Base 64
string Pfx = Convert.ToBase64String(File.ReadAllBytes("EKU9003173C9.pfx"));
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByPFXAsync(Pfx, Rfc, password, uuid, "02");
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Cancelación por XML
Como su nombre lo indica, este método realiza la cancelación mediante el XML sellado con los UUID a cancelar.
Este método recibe los siguientes parámetros:
* Usuario y contraseña
* Url Servicios SW
* XML sellado con los UUID a cancelar.
**Ejemplo de XML para Cancelar**
```xml
XEdUtCptjdlz9DsYAP7nnU6MytU=
ZnWh91e5tUc4/t1ZWnb3yOgB8zuCXNPioND+rv6aLOEwIw26/8sYYb+GT4wgyqlc09wOs32XTUwWoGQwtWMG8Euqq+4xJyobWvPCsX6CiURvD/Pd33xgkH92A0AGQxEMYGVT7wK+GFS2gDTYEYAXvZqzCe6+rXnlQvHML0TOOmhVu/wc8YrCbGt4z/F5sRxhjpa0eqwFEq4RmB4nkWjcD3Pnudn3XAI5NHIiOd8KVGVcDR+LvYvKj7h+18WxZgujpggYjbFN79i1jEsAEPDfgryUdTvjDw+KC7Mg+/ge6pssH42buEMIwVE4VX9Y3NtWSGTwdIK/8pxXk+Y5wyR6Gg==
OID.1.2.840.113549.1.9.2=responsable: ACDMA-SAT, OID.2.5.4.45=2.5.4.45, L=COYOACAN, S=CIUDAD DE MEXICO, C=MX, PostalCode=06370, STREET=3ra cerrada de cadiz, E=oscar.martinez@sat.gob.mx, OU=SAT-IES Authority, O=SERVICIO DE ADMINISTRACION TRIBUTARIA, CN=AC UAT
292233162870206001759766198444326234574038512436
MIIFuzCCA6OgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0MzQwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MTk0NDE0WhcNMjMwNjE3MTk0NDE0WjCB4jEnMCUGA1UEAxMeRVNDVUVMQSBLRU1QRVIgVVJHQVRFIFNBIERFIENWMScwJQYDVQQpEx5FU0NVRUxBIEtFTVBFUiBVUkdBVEUgU0EgREUgQ1YxJzAlBgNVBAoTHkVTQ1VFTEEgS0VNUEVSIFVSR0FURSBTQSBERSBDVjElMCMGA1UELRMcRUtVOTAwMzE3M0M5IC8gWElRQjg5MTExNlFFNDEeMBwGA1UEBRMVIC8gWElRQjg5MTExNk1HUk1aUjA1MR4wHAYDVQQLExVFc2N1ZWxhIEtlbXBlciBVcmdhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCN0peKpgfOL75iYRv1fqq+oVYsLPVUR/GibYmGKc9InHFy5lYF6OTYjnIIvmkOdRobbGlCUxORX/tLsl8Ya9gm6Yo7hHnODRBIDup3GISFzB/96R9K/MzYQOcscMIoBDARaycnLvy7FlMvO7/rlVnsSARxZRO8Kz8Zkksj2zpeYpjZIya/369+oGqQk1cTRkHo59JvJ4Tfbk/3iIyf4H/Ini9nBe9cYWo0MnKob7DDt/vsdi5tA8mMtA953LapNyCZIDCRQQlUGNgDqY9/8F5mUvVgkcczsIgGdvf9vMQPSf3jjCiKj7j6ucxl1+FwJWmbvgNmiaUR/0q4m2rm78lFAgMBAAGjHTAbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMA0GCSqGSIb3DQEBCwUAA4ICAQBcpj1TjT4jiinIujIdAlFzE6kRwYJCnDG08zSp4kSnShjxADGEXH2chehKMV0FY7c4njA5eDGdA/G2OCTPvF5rpeCZP5Dw504RZkYDl2suRz+wa1sNBVpbnBJEK0fQcN3IftBwsgNFdFhUtCyw3lus1SSJbPxjLHS6FcZZ51YSeIfcNXOAuTqdimusaXq15GrSrCOkM6n2jfj2sMJYM2HXaXJ6rGTEgYmhYdwxWtil6RfZB+fGQ/H9I9WLnl4KTZUS6C9+NLHh4FPDhSk19fpS2S/56aqgFoGAkXAYt9Fy5ECaPcULIfJ1DEbsXKyRdCv3JY89+0MNkOdaDnsemS2o5Gl08zI4iYtt3L40gAZ60NPh31kVLnYNsmvfNxYyKp+AeJtDHyW9w7ftM0Hoi+BuRmcAQSKFV3pk8j51la+jrRBrAUv8blbRcQ5BiZUwJzHFEKIwTsRGoRyEx96sNnB03n6GTwjIGz92SmLdNl95r9rkvp+2m4S6q1lPuXaFg7DGBrXWC8iyqeWE2iobdwIIuXPTMVqQb12m1dAkJVRO5NdHnP/MpqOvOgLqoZBNHGyBg4Gqm4sCJHCxA1c8Elfa2RQTCk0tAzllL4vOnI1GHkGJn65xokGsaU4B4D36xh7eWrfj4/pgWHmtoDAYa8wzSwo2GVCZOs+mtEgOQB91/g==
```
Para caso de motivo 01 deberá añadir el atributo "FolioSustitucion" dentro del Nodo
Ejemplo de nodo Folio:
```
```
**Ejemplo de consumo de la librería para cancelar con XML mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Obtenemos el XML de cancelacion
byte[] xml = File.ReadAllBytes("cancelacion.xml");
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByXMLAsync(xml);
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Cancelación por UUID
Como su nombre lo indica, este método realiza la cancelacion mediante el UUID a cancelar.
Este método recibe los siguientes parámetros:
* Usuario y contraseña
* Url Servicios SW
* RFC emisor
* UUID
* Motivo
* Folio Sustitución
**Ejemplo de consumo de la libreria para cancelar con UUID con motivo de cancelación 02 "Comprobante emitido sin errores con relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByRfcUuidAsync(rfc, uuid, "02");
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la libreria para cancelar con UUID con motivo de cancelación 01 "Comprobante emitido con errores con relación", mediante usuario y contraseña**
```cs
using SW.Services.Cancelation;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos de Cancelación
string rfc = "EKU9003173C9";
string uuid = "478569b5-c323-4dc4-91cf-b6e9f6979527";
string folioSustitucion = "01724196-ac5a-4735-b621-e3b42bcbb459";
//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", "user", "password");
//Realizamos la petición de cancelación al servicio.
var response = await cancelation.CancelarByRfcUuidAsync(rfc, uuid, "01", folioSustitucion);
if (response.Status == "success" && response.Data != null)
{
//Acuse de cancelación
Console.WriteLine(response.Data.Acuse);
//Estatus por UUID
foreach (var folio in response.Data.Uuid)
{
Console.WriteLine("UUID: {0} Estatus: {1}", folio.Key, folio.Value);
}
}
else
{
//Obtenemos el detalle del Error
Console.WriteLine("Error al Cancelar\n\n");
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Usuarios
Servicios para trabajar con usuarios, incluye métodos para crear, modificar, obtener y eliminar usuarios.
Inicializar
AccountUser user = new AccountUser(_build.UrlApi, _build.Url, _build.User, _build.Password);
AccountUser user = new AccountUser(_build.UrlApi, _build.Token);
Crear Usuario
```cs
var response = await user.CrearUsuarioAsync(new AccountUserRequest()
{
Email = $"hijo_{_build.User}",
Password = $"${_build.Password}",
ProfileType = SW.Helpers.AccountUserProfile.Hijo,
Rfc = "XAXX010101000",
Name = "Pruebas UT Hijo",
Unlimited = false,
Stamps = 1
});
```
Obtener Usuario Por Token
```cs
var response = await user.ObtenerUsuarioAsync();
```
Obtener Usuario Por UUID
```cs
var response = await user.ObtenerUsuarioAsync(_idUser);
```
Obtener Usuarios
```cs
var response = await user.ObtenerUsuariosAsync();
```
Editar Usuario
```cs
var response = await user.ModificarUsuarioAsync(_idUser, "XAXX010101000", "Nombre Usuario");
```
Eliminar Usuario
```cs
var response = await user.EliminarUsuarioAsync(_idUser);
```
Consulta de Saldos
Método mediante el cual puedes realizar la consulta de tu saldo para consumir los servicios de SW.
Ejemplos
Este método recibe los siguientes parametros:
* Usuario y contraseña o Token
* Url Servicios SW
* Id de usuario
**Ejemplo de consumo de la libreria para consultar el saldo mediante usuario y contraseña**
```cs
using SW.Services.Account;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo BalanceAccount
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a la consulta de saldo
AccountBalance balance = new AccountBalance("http://api.test.sw.com.mx" ,"http://services.test.sw.com.mx","user", "password");
Guid idUser = Guid.Parse("f0f11ef6-e4c5-425b-8fc9-b17465bf6f53");
BalanceResponse response = await balance.ConsultarSaldoAsync(idUser);
if (response.Status != "error")
{
//Para Obtener el saldo Timbres
Console.WriteLine(response.Data.SaldoTimbres);
//Para Obtenerlos timbres Utilizados
Console.WriteLine(response.Data.TimbresUtilizados);
//Para Obtener si es Ilimitado (para cuentas hijo)
Console.WriteLine(response.Data.Unlimited);
}
else
{
//En caso de error, se pueden visualizar los campos message y/o messageDetail
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para consultar el saldo mediante token**
```cs
using SW.Services.Account;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo BalanceAccount
//A esta le pasamos la Url y el token
//Despues se procedera a la consulta de saldo
AccountBalance balance = new AccountBalance("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
Guid idUser = Guid.Parse("f0f11ef6-e4c5-425b-8fc9-b17465bf6f53");
BalanceResponse response = await balance.ConsultarSaldoAsync(idUser);
if (response.Status != "error")
{
//Para Obtener el saldo Timbres
Console.WriteLine(response.Data.SaldoTimbres);
//Para Obtenerlos timbres Utilizados
Console.WriteLine(response.Data.TimbresUtilizados);
//Para Obtener si es Ilimitado (para cuentas hijo)
Console.WriteLine(response.Data.Unlimited);
}
else
{
//En caso de error, se pueden visualizar los campos message y/o messageDetail
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Consulta de la lista 69-B
Método mediante el cual puedes identificar EFOS, es decir, si un contribuyente esta en la lista 69-B. comprobantes.
Ejemplos
Este método recibe los siguientes parametros:
* Url Servicios SW
* Usuario y contraseña o Token
* RFC a consultar
**Ejemplo de consumo de la libreria para consultar el RFC en la lista 69-B mediante usuario y contraseña**
```cs
using System;
using System.Threading.Tasks;
using SW.Services.Taxpayer;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Taxpayer
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a la consulta del RFC en la lista
Taxpayer taxpayer = new Taxpayer("http://services.test.sw.com.mx", "user", "password");
TaxpayerResponse response = await taxpayer.GetTaxpayer("ZNS1101105T3");
if (response.Status != "error")
{
//Obtenemos los datos del cliente
Console.WriteLine(response.Data.id);
Console.WriteLine(response.Data.rfc);
Console.WriteLine(response.Data.situacion_del_contribuyente);
Console.WriteLine(response.Data.numero_y_fecha_oficio_global_presuncion);
Console.WriteLine(response.Data.publicacion_pagina_SAT_presuntos);
Console.WriteLine(response.Data.publicacion_DOF_presuntos);
Console.WriteLine(response.Data.publicacion_pagina_SAT_desvirtuados);
Console.WriteLine(response.Data.numero_fecha_oficio_global_contribuyentes_que_desvirtuaron);
Console.WriteLine(response.Data.publicacion_DOF_desvirtuados);
Console.WriteLine(response.Data.numero_fecha_oficio_global_definitivos);
Console.WriteLine(response.Data.publicacion_pagina_SAT_definitivos);
Console.WriteLine(response.Data.publicacion_DOF_definitivos);
Console.WriteLine(response.Data.numero_fecha_oficio_global_sentencia_favorable);
Console.WriteLine(response.Data.publicacion_pagina_SAT_sentencia_favorable);
Console.WriteLine(response.Data.publicacion_DOF_sentencia_favorable);
}
else
{
//En caso de error, se pueden visualizar los campos message y/o messageDetail
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la libreria para consultar el RFC en la lista 69-B mediante token**
```cs
using System;
using System.Threading.Tasks;
using SW.Services.Taxpayer;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Taxpayer
//A esta le pasamos la Url y token
//Despues se procedera a la consulta del RFC en la lista
Taxpayer taxpayer = new Taxpayer("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
TaxpayerResponse response = await taxpayer.GetTaxpayer("ZNS1101105T3");
if (response.Status != "error")
{
//Obtenemos los datos del cliente
Console.WriteLine(response.Data.id);
Console.WriteLine(response.Data.rfc);
Console.WriteLine(response.Data.situacion_del_contribuyente);
Console.WriteLine(response.Data.numero_y_fecha_oficio_global_presuncion);
Console.WriteLine(response.Data.publicacion_pagina_SAT_presuntos);
Console.WriteLine(response.Data.publicacion_DOF_presuntos);
Console.WriteLine(response.Data.publicacion_pagina_SAT_desvirtuados);
Console.WriteLine(response.Data.numero_fecha_oficio_global_contribuyentes_que_desvirtuaron);
Console.WriteLine(response.Data.publicacion_DOF_desvirtuados);
Console.WriteLine(response.Data.numero_fecha_oficio_global_definitivos);
Console.WriteLine(response.Data.publicacion_pagina_SAT_definitivos);
Console.WriteLine(response.Data.publicacion_DOF_definitivos);
Console.WriteLine(response.Data.numero_fecha_oficio_global_sentencia_favorable);
Console.WriteLine(response.Data.publicacion_pagina_SAT_sentencia_favorable);
Console.WriteLine(response.Data.publicacion_DOF_sentencia_favorable);
}
else
{
//En caso de error, se pueden visualizar los campos message y/o messageDetail
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
:pushpin: NOTA: La propiedad situacion_del_contribuyente obtenida en la respuesta puede tener los siguientes 4 estatus:
Estatus |
Descripción |
Definitivo |
Contribuyente que aportó evidencias insuficientes o en su caso las omitió, confirmando la inexistencia de las operaciones. |
Presunto |
Contribuyente recién publicado, está pendiente de presentar evidencias para desvirtuarse. |
Desvirtuado |
Contribuyente que aportó evidencias suficientes para demostrar la existencia de las operaciones. |
Sentencia Favorable |
Contribuyente que presentó un medio de defensa ante la presunción de operaciones inexistentes. |
Validación
Validación XML
Este servicio recibe un comprobante CFDI 4.0 en formato XML mediante el cual se valida integridad, sello, errores de estructura, matriz de errores del SAT incluyendo complementos, se valida que exista en el SAT, así como el estatus en el SAT.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña o token
* XML
**Ejemplo de consumo de la librería para validación de XML mediante usuario y contraseña**
```cs
using SW.Services.Validate;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Validate
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
Validate validate = new Validate("http://services.test.sw.com.mx", "user", "password");
//Obtenemos el XML a validar
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("validacion.xml"));
//Realizamos la peticion de validacion pasando el XML
ValidateXmlResponse response = await validate.ValidateXmlAsync(xml);
//El objeto response tendra los siguientes atributos:
List Detail1 = response.Detail;
Console.Write("Status: " + response.Status);
Console.Write("\ndetail: ");
foreach (var i in Detail1)
{
foreach (var j in i.Detail)
{
Console.Write("\n\tdetail: ");
Console.Write("\n\t\tMessage: " + j.Message);
Console.Write("\n\t\tMessageDetail: " + j.MessageDetail);
Console.Write("\n\t\tType: " + j.Type);
}
Console.Write("\n\tSection: \n" + i.Section);
}
//Para obtener la cadena original SAT
Console.Write(response.CadenaOriginalSAT + "\n");
//Para obtener la cadena original del comprobante
Console.Write(response.CadenaOriginalComprobante + "\n");
//Para obtener el uuid
Console.Write(response.Uuid + "\n");
//Para obtener el status SAT
Console.Write(response.StatusSat + "\n");
//Para obtener el status code SAT
Console.Write(response.StatusCodeSat + "\n");
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para validación de XML mediante token**
```cs
using SW.Services.Validate;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Validate
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
Validate validate = new Validate("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Obtenemos el XML a validar
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("validacion.xml"));
//Realizamos la peticion de validacion pasando el XML
ValidateXmlResponse response = await validate.ValidateXmlAsync(xml);
//El objeto response tendra los siguientes atributos:
List Detail1 = response.Detail;
Console.Write("Status: " + response.Status);
Console.Write("\ndetail: ");
foreach (var i in Detail1)
{
foreach (var j in i.Detail)
{
Console.Write("\n\tdetail: ");
Console.Write("\n\t\tMessage: " + j.Message);
Console.Write("\n\t\tMessageDetail: " + j.MessageDetail);
Console.Write("\n\t\tType: " + j.Type);
}
Console.Write("\n\tSection: \n" + i.Section);
}
//Para obtener la cadena original SAT
Console.Write(response.CadenaOriginalSAT + "\n");
//Para obtener la cadena original del comprobante
Console.Write(response.CadenaOriginalComprobante + "\n");
//Para obtener el uuid
Console.Write(response.Uuid + "\n");
//Para obtener el status SAT
Console.Write(response.StatusSat + "\n");
//Para obtener el status code SAT
Console.Write(response.StatusCodeSat + "\n");
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Consulta Estatus
Consulta Estatus SAT
Este servicio sirve para consultar el estatus de un CFDI antes y después de enviarlo a cancelar, con él sabremos sí puede ser cancelado de forma directa, o en caso de que se necesite consultar los CFDI relacionados para poder generar la cancelación.
:pushpin: ***NOTA:*** El servicio de consulta es de tipo SOAP y es proporcionado directamente por parte del SAT.
Para hacer uso de los servicios `Consulta Estatus SAT en ambiente QA`, sera necesario instalar el certificado correspondiente de manera local, para más información contáctanos a **soporte@sw.com.mx**.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña o token
* RFC Emisor
* RFC Receptor
* Total declarado en el comprobante
* UUID del comprobante
* Sello digital del emisor
**Ejemplo de consumo de la librería para la consulta del estatus SAT**
```cs
using SW.Services.Status;
using System;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Creamos una instancia de tipo Status
//A esta le pasamos la Url.
//Despues realizamos la peticion pasando los parametros necesarios en el orden mencionados.
Status status = new Status("https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc");
var response = status.GetStatusCFDI("GOM0809114P5", "LSO1306189R5", "206.85", "021ea2fb-2254-4232-983b-9808c2ed831b", "WBjHe+9loaYIMM5wYwLxfhT6FnotG0KLRNheOlIxXoVMvsafsRdWY/aZ....");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
CFDI Relacionados
A través de estos siguientes métodos obtendremos un listado de los UUID que se encuentren relacionados a una factura.
Relacionados por CSD
## Relacionados por CSD ##
Este método obtendra un listado de los UUID relacionados mediante CSD
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* Certificado en base64
* Llave en base64
* RFC del emisor
* Contraseña del certificado
* UUID de la factura.
**Ejemplo de consumo de la librería para la consulta de CFDI relacionados por CSD mediante usuario y contraseña**
```cs
sing SW.Services.Relations;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string Rfc = "EKU9003173C9";
string CerPassword = "12345678a";
//Obtenemos Certificado y lo convertimos a Base 64
string Cer = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/EKU9003173C9.cer"));
//Obtenemos LLave y lo convertimos a Base 64
string Key = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/EKU9003173C9.key"));
//Creamos una instancia de tipo Relations
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a consultar las facturas relacionadas
Relations relations = new Relations("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
RelationsResponse response = await relations.RelationsByCSDAsync(Cer, Key, Rfc, CerPassword, "31c885c8-6dcb-4d82-9cfd-01707c828c50");
if (response.Status == "success")
{
Console.WriteLine(response.codStatus);
//Para obtener el Uuid consultado
Console.WriteLine(response.Data.UuidConsultado);
//Para obtener el resultado de la consulta
Console.WriteLine(response.Data.Resultado);
//Para obtener los uuid padres
Console.WriteLine(response.Data.UuidsRelacionadosPadres);
//Para obtener los uuid hijo
Console.WriteLine(response.Data.UuidsRelacionadosHijos);
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Relacionados por PFX
## Relacionados por PFX ##
Este método obtendra un listado de los UUID relacionados mediante PFX.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* UUID del comprobante
* RFC del emisor
* Archivo Pfx en Base64
* Contraseña del certificado
**Ejemplo de consumo de la librería para la consulta CFDI relacionados por PFX mediante usuario y contraseña**
```cs
using SW.Services.Relations;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string Rfc = "EKU9003173C9";
string CerPassword = "12345678a";
//Obtenemos PFX y lo convertimos a Base 64
string Pfx = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/EKU9003173C9.pfx"));
//Creamos una instancia de tipo Relations
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a consultar las facturas relacionadas
Relations relations = new Relations("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
RelationsResponse response = await relations.RelationsByPFXAsync(Pfx, Rfc, CerPassword, "31c885c8-6dcb-4d82-9cfd-01707c828c50");
if (response.Status == "success")
{
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener el uuid consultado
Console.WriteLine(response.Data.UuidConsultado);
//Para obtener el resultado de la consulta
Console.WriteLine(response.Data.Resultado);
//Para obtener los uuid padres
Console.WriteLine(response.Data.UuidsRelacionadosPadres);
//Para obtener los uuid hijo
Console.WriteLine(response.Data.UuidsRelacionadosHijos);
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Relacionados por XML
## Relacionados por XML ##
Este método obtendra un listado de los UUID relacionados mediante el XML.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* XML del comprobante
**Ejemplo de XML**
```xml
yYGkb9DCJgiGl2O4vCf5B3gXTTI=
VBBjMXJgS/oCb4iTazKrPmhWSICGT5wbeTf8G4tW2UuqnKBLS1NWD7Uf37kAX8+GBB04So7YlTcEw3I/X2JkHDadSxCiZ940YksNIVddmCqllJL6giMHVQJoXcTH8WQ9pO/4TbREQZ8/jxPqIvxCXrOn963PKFrZFB8eo5RQxLUa12WMi5RWgh8dSUwQxS2W3dm1XXP8bqXPOjy7GtZc3ObeTLMcXo/YoLyEAobVCnP+igOEXLxKEN2HZPzHGtA2g/5ONxuhu3UTxix9D/5ItjXdH9nk7VL0A58Xgw3qv6Q0vjmlxyu7RO0E2O3D2tLejfExt3WvsjZ8xvEKXSFp+A==
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)
3230303031303030303030333030303232383135
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=
```
**Ejemplo de consumo de la librería para la consulta CFDI relacionados por XML mediante usuario y contraseña**
```cs
using SW.Services.Relations;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Obtenemos el XML
byte[] Rxml = File.ReadAllBytes("cancelacion.xml");
//Creamos una instancia de tipo Relations
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a consultar las facturas relacionadas
Relations relations = new Relations("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
RelationsResponse response = await relations.RelationsByXMLAsync(Rxml);
if (response.Status == "success")
{
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener el uuid consultado
Console.WriteLine(response.Data.UuidConsultado);
//Para obtener el resultado de la consulta
Console.WriteLine(response.Data.Resultado);
//Para obtener los uuid padres
Console.WriteLine(response.Data.UuidsRelacionadosPadres);
//Para obtener los uuid hijo
Console.WriteLine(response.Data.UuidsRelacionadosHijos);
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Relacionados por UUID
## Relacionados por UUID ##
Este método obtendra un listado de los UUID relacionados mediante el UUID de la factura.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* UUID de la factura que ser requiere consultar relacionados
* RFC del emisor
:pushpin: ***NOTA:*** El usuario deberá tener sus certificados en el administrador de timbres para la utilización de este método.
**Ejemplo de consumo de la librería para la consulta CFDI relacionados por UUID mediante usuario y contraseña**
```cs
using SW.Services.Relations;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string Rfc = "EKU9003173C9";
string uuid = "31c885c8-6dcb-4d82-9cfd-01707c828c50";
//Creamos una instancia de tipo Relations
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a consultar las facturas relacionadas
Relations relations = new Relations("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
RelationsResponse response = await relations.RelationsByRfcUuidAsync(Rfc, uuid);
if (response.Status == "success")
{
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener el uuid consultado
Console.WriteLine(response.Data.UuidConsultado);
//Para obtener el resultado de la consulta
Console.WriteLine(response.Data.Resultado);
//Para obtener los uuid padres
Console.WriteLine(response.Data.UuidsRelacionadosPadres);
//Para obtener los uuid hijo
Console.WriteLine(response.Data.UuidsRelacionadosHijos);
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Consulta solicitudes pendientes Aceptar / Rechazar
Este método obtendra una lista de los UUID que tenemos pendientes por aceptar o rechazar.
Ejemplos
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* RFC Receptor
**Ejemplo de consumo de la librería para la consulta de solicitudes pendientes mediante usuario y contraseña**
```cs
using SW.Services.Pendings;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Pending
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a consultar las facturas relacionadas
Pending pendientes = new Pending("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
PendingsResponse response = await pendientes.PendingsByRfcAsync("EKU9003173C9");
//Para obtener el status de la consulta
Console.Write(response.Status);
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener la lista de uuid's
Console.WriteLine(response.Data.Uuid);
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Aceptar / Rechazar
Servicio mediante el cual aceptaremos o rechazaremos los UUID solicitados para el proceso de cancelación.
Aceptar / Rechazar por CSD
Método mediante el cual el receptor podrá manifestar la aceptación o rechazo de la solicitud de cancelación mediante CSD.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* Certificado del receptor en Base64
* Llave(key) del receptor en Base64
* RFC del emisor
* Contraseña del certificado
* Arreglo de objetos donde se especifican los UUID y acción a realizar
**Ejemplo de consumo de la librería para la aceptacion/rechazo de la solicitud por CSD mediante usuario y contraseña**
```cs
using SW.Services.AcceptReject;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string RfcReceptor = "CACX7605101P8";
string CerPassword = "12345678a";
//Obtenemos Certificado del receptor y lo convertimos a Base 64
string CerReceptor = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/CACX7605101P8.cer"));
//Obtenemos LLave del receptor y lo convertimos a Base 64
string KeyReceptor = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/CACX7605101P8.key"));
//Creamos una instancia de tipo AcceptReject
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a procesar las facturas con su acción
AcceptReject acceptReject = new AcceptReject("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
var response = await acceptReject.AcceptByCSD(CerReceptor, KeyReceptor, RfcReceptor, CerPassword, new AceptacionRechazoItem[] { new AceptacionRechazoItem() { uuid = "DB68450F-355B-4915-AFDC-A980497C4D70", action = SW.Helpers.EnumAcceptReject.Aceptacion } });
//Para obtener el status de la consulta
Console.Write(response.Status);
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener una lista con los folios
Console.WriteLine(response.Data.Folios);
//Para obtener el acuse
Console.WriteLine(response.Data.Acuse);
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Aceptar / Rechazar por PFX
Método mediante el cual el receptor podrá manifestar la aceptación o rechazo de la solicitud de cancelación mediante PFX.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* Archivo Pfx en Base64
* Contraseña del certificado
* RFC del emisor
* Arreglo de objetos donde se especifican los UUID y acción a realizar
**Ejemplo de consumo de la librería para la aceptación/rechazo de la solicitud por PFX mediante usuario y contraseña**
```cs
using SW.Services.AcceptReject;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string RfcReceptor = "CACX7605101P8";
string CerPassword = "12345678a";
//Obtenemos PFX del receptor y lo convertimos a Base 64
string PfxReceptor = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/CACX7605101P8.pfx"));
//Creamos una instancia de tipo AcceptReject
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a procesar las facturas con su acción
AcceptReject acceptReject = new AcceptReject("http://services.test.sw.com.mx", "user", "password");
//Realizamos la peticion
var response = await acceptReject.AcceptByPFX(PfxReceptor, RfcReceptor, CerPassword, new AceptacionRechazoItem[] { new AceptacionRechazoItem() { uuid = "DB68450F-355B-4915-AFDC-A980497C4D70", action = SW.Helpers.EnumAcceptReject.Aceptacion } });
//Para obtener el status de la consulta
Console.Write(response.Status);
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener una lista con los folios
Console.WriteLine(response.Data.Folios);
//Para obtener el acuse
Console.WriteLine(response.Data.Acuse);
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Aceptar / Rechazar por XML
Método mediante el cual el receptor podrá manifestar la aceptación o rechazo de la solicitud de cancelación mediante XML.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* XML con datos requeridos para la aceptación/rechazo de la cancelación
**Ejemplo de XML**
```xml
06a46e4b-b154-4c12-bb77-f9a63ed55ff2
Aceptacion
AQ36cbqKJKHy5vaS6GhDTWtwKE4=
HVlFUPmRLyxeztem827eaasDObRXi+oqedCNNvDyMsRizqsS99cHt5mJCEE4vWgpDGPGLrph/yd++R4aN+V562DPp9qreFkisFpEvJy5Z8o/KzG7vc5qqaD8z9ohPpRERPHvxFrIm3ryEBqnSV6zqJG02PuxkWvYonVc+B7RdsO5iAiDTMs9guUhOvHBK8BVXQHKCbUAPCp/4YepZ4LUkcdloCAMPsN0x9GaUty2RMtNJuwaRWy+5IIBUCeXXZmQhoQfS0QfPpCByt0ago5v+FocJQiYQrsUV/8mesmNw5JoOCmufQYliQFyZgsstV8+h76dU/rwLr6R8YlFOkTxKg==
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)
3230303031303030303030333030303232383135
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=
```
**Ejemplo de consumo de la librería para la aceptación/rechazo de la solicitud por XML mediante usuario y contraseña**
```cs
using SW.Services.AcceptReject;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo AcceptReject
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a procesar las facturas con su acción
AcceptReject acceptReject = new AcceptReject("http://services.test.sw.com.mx", "user", "password");
var xml = File.ReadAllText("Resources/aceptacionRechazo.xml");
var response = await acceptReject.AcceptByXML(Encoding.UTF8.GetBytes(xml));
//Para obtener el status de la consulta
Console.Write(response.Status);
//Para obtener el codigoStatus
Console.WriteLine(response.CodStatus);
//Para obtener una lista con los folios
Console.WriteLine(response.Data.Folios);
//Para obtener el acuse
Console.WriteLine(response.Data.Acuse);
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Aceptar / Rechazar por UUID
Método mediante el cual el receptor podrá manifestar la aceptación o rechazo de la solicitud de cancelación mediante UUID.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Usuario y contraseña ò token
* RFC del receptor
* UUID de la factura que se requiere aceptar/rechazar
* Acción que se requiera realizar Aceptación/Rechazo
:pushpin: ***NOTA:*** El usuario deberá tener sus certificados en el administrador de timbres para la utilización de este método.
**Ejemplo de consumo de la librería para la aceptación/rechazo de la solicitud por UUID mediante usuario y contraseña**
```cs
using SW.Services.AcceptReject;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Dato necesario
string RfcReceptor = "CACX7605101P8";
//Creamos una instancia de tipo AcceptReject
//A esta le pasamos la Url, usuario y password o token
//Automaticamente despues de obtenerlo se procedera a procesar las facturas con su acción
AcceptReject acceptReject = new AcceptReject("http://services.test.sw.com.mx", "user", "password");
//Realizamos peticion
var response = await acceptReject.AcceptByRfcUuid(RfcReceptor, "DB68450F-355B-4915-AFDC-A980497C4D70", SW.Helpers.EnumAcceptReject.Aceptacion);
//Para obtener el status de la consulta
Console.Write(response.status);
//Para obtener el codigoStatus
Console.WriteLine(response.codStatus);
//Para obtener una lista con los folios
Console.WriteLine(response.data.folios);
//Para obtener el acuse
Console.WriteLine(response.data.acuse);
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.message);
Console.WriteLine(response.messageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Recuperar XML
Servicio para recuperar información de un XML timbrado con SW.
Recuperar por UUID
Método para recuperar la información de un XML enviando el UUID de la factura, así como el token de la cuenta en la cual fue timbrada.
Este método recibe los siguientes parámetros:
* Url Api SW
* Url Servicios SW (Cuando se use usuario y contraseña)
* Usuario y contraseña ò token
* UUID
**Ejemplo de consumo de la libreria para la recuperación de XML mediante usuario y contraseña**
```cs
using SW.Services.Storage;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Storage
//A esta le pasamos la Url de servicios y api, usuario y password
//Automaticamente despues de obtenerlo se procedera a la recuperación
Storage storage = new Storage("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
//Realizamos peticion enviando el UUID
var response = await storage.GetXmlAsync(Guid.Parse("6d5ee4ad-102e-4db6-8806-6df891c2253e"));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la libreria para la recuperación de XML mediante token**
```cs
using SW.Services.Storage;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Storage
//A esta le pasamos la Url de api y token
//Automaticamente despues de obtenerlo se procedera a la recuperación
Storage storage = new Storage("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos peticion enviando el UUID
var response = await storage.GetXmlAsync(Guid.Parse("6d5ee4ad-102e-4db6-8806-6df891c2253e"));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
PDF
Generar PDF
Este método genera y obtiene un PDF en base64 a partir de un documento XML timbrado y una plantilla. Puede ser consumido ingresando tu usuario y contraseña así como tambien ingresando solo el token. Este método recibe los siguientes parámetros:
* Url servicios SW
* Url API
* Logo Base64 (opcional)
* Template ID
* XML timbrado
* Datos extra (opcional)
**Ejemplo de consumo de la librería para la generación de PDF mediante usuario y contraseña**
```cs
using SW.Services.Pdf;
using sw_sdk.Helpers;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
//Creamos una instancia de tipo Pdf
//A esta le pasamos la Url de servicios, url api, usuario y contraseña
//Automaticamente despues de obtenerlo se procedera a la generación
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await pdf.GenerarPdfAsync(xml,null, templateId);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puedes enviar logo en base 64
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puedes solicitar customizar tu propia plantilla para agregar datos adicionales que no vengan incluidos en el xml
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
Dictionary observaciones = new Dictionary() { { "Observaciones", "Entregar de 9am a 6pm" } };
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId, observaciones);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
Dictionary observaciones = new Dictionary() { { "Observaciones", "Entregar de 9am a 6pm" } };
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId, observaciones);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la librería para la generación de PDF mediante token**
```cs
using SW.Services.Pdf;
using sw_sdk.Helpers;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
//Creamos una instancia de tipo Pdf
//A esta le pasamos la Url api y token
//Automaticamente despues de obtenerlo se procedera a la generación
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await pdf.GenerarPdfAsync(xml,null, templateId);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puedes enviar logo en base 64
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puedes solicitar customizar tu propia plantilla para agregar datos adicionales que no vengan incluidos en el xml
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
Dictionary observaciones = new Dictionary() { { "Observaciones", "Entregar de 9am a 6pm" } };
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId, observaciones);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
try
{
//Datos necesarios
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
PdfTemplates templateId = PdfTemplates.cfdi40;
Dictionary observaciones = new Dictionary() { { "Observaciones", "Entregar de 9am a 6pm" } };
string b64Logo = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgs......";
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await pdf.GenerarPdfAsync(xml,b64Logo, templateId, observaciones);
//Devuleve el pdf en formato Base64
Console.WriteLine(response.Data.ContentB64);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
:pushpin: ***NOTA:*** Existen varias plantillas de PDF segun el tipo de comprobante que necesites, las cuales son las siguientes:
| Versión 4.0 | Plantilla para el complemento |
|--------------------|---------------------------------|
| :white_check_mark: | Factura ingreso, egreso |
| :white_check_mark: | Nómina |
| :white_check_mark: | Pagos |
| :white_check_mark: | Carta porte |
Para mayor referencia de estas plantillas de PDF, favor de visitar el siguiente [link](https://developers.sw.com.mx/knowledge-base/plantillas-pdf/).
Regenerar PDF
El servicio podrá generar o regenerar un PDF de un CFDI previamente timbrados y podrá guardar o remplazar el archivo PDF para ser visualizado posteriormente desde el portal de Smarter. Puede ser consumido ingresando tu usuario y contraseña así como tambien ingresando solo el token. Este método recibe los siguientes parámetros:
* Url Servicios SW(cuando se añaden usuario y contraseña)
* Url Api
* UUID
**Ejemplo de consumo de la librería para la regeneración de PDF mediante usuario y contraseña**
```cs
using SW.Services.Pdf;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Pdf
//A esta le pasamos la Url api, Url Servicios, usuario y contraseña
//Automaticamente despues de obtenerlo se procedera a la regeneración
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await pdf.RegenerarPdfAsync(Guid.Parse("ac45f6b1-9b1b-473c-8a35-6fab7a3a3c36"));
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo de consumo de la libreria para la regeneración de PDF mediante token**
```cs
using SW.Services.Pdf;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Pdf
//A esta le pasamos la Url api y token
//Automaticamente despues de obtenerlo se procedera a la regeneración
Pdf pdf = new Pdf("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await pdf.RegenerarPdfAsync(Guid.Parse("ac45f6b1-9b1b-473c-8a35-6fab7a3a3c36"));
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Reenvio Email
Este servicio realiza el reenvío de un xml y/o pdf existente mediante su UUID
a través de correo electrónico.
Este método recibe los siguientes parámetros:
* Url Servicios SW(cuando se añaden usuario y contraseña)
* Url Api
* UUID: Folico fiscal del comprobante timbrado
* Email: Correo electrónico (máximo 5 correos separados por ”,” )
**Ejemplo de consumo de la librería para el reenvio de email mediante usuario y contraseña**
```cs
using SW.Services.Resend;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Resend
//A esta le pasamos la Url api, Url Servicios, usuario y contraseña
//Automaticamente despues de obtenerlo se procedera al reenvio de email
Resend resend = new Resend("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await resend.ResendEmailAsync(Guid.Parse("9c50a99e-93d4-499d-a6bc-ef1ad1360814"), "someemail@some.com");
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puede enviarse a mas de un correo
try
{
//Lista de correos
var emails = new[]
{
"someemail@some.com",
"someemail@some.com",
"someemail@some.com",
"someemail@some.com",
"someemail@some.com"
};
Resend resend = new Resend("http://api.test.sw.com.mx", "http://services.test.sw.com.mx", "user", "password");
var response = await resend.ResendEmailAsync(Guid.Parse("9c50a99e-93d4-499d-a6bc-ef1ad1360814"), emails);
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
**Ejemplo de consumo de la librería para el reenvio de email mediante token**
```cs
using SW.Services.Resend;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo Pdf
//A esta le pasamos la Url api y token
//Automaticamente despues de obtenerlo se procedera al reenvio de email
Resend resend = new Resend("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await resend.ResendEmailAsync(Guid.Parse("9c50a99e-93d4-499d-a6bc-ef1ad1360814"), "someemail@some.com");
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Puede enviarse a mas de 5 correos
try
{
//Lista de correos
var emails = new[]
{
"someemail@some.com",
"someemail@some.com",
"someemail@some.com",
"someemail@some.com",
"someemail@some.com"
};
Resend resend = new Resend("http://api.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await resend.ResendEmailAsync(Guid.Parse("9c50a99e-93d4-499d-a6bc-ef1ad1360814"), emails);
//Obtenemos el detalle de la respuesta
Console.WriteLine(response.Status);
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
Certificados
Servicio para gestionar los certificados CSD de tu cuenta, será posible cargar, consultar y eliminar los certificados.
Para administrar los certificados de manera gráfica, puede hacerlo desde el Administrador de timbres.
Consultar Certificados
Método para consultar todos los certificados cargados en la cuenta.
Este método recibe los siguientes parametros:
* Url Servicios SW(cuando se añaden usuario y contraseña)
* Token
**Ejemplo de consumo de la librería para la consulta de certificados mediante token**
```cs
using SW.Services.Csd;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo CsdUtils
//A esta le pasamos la Url y token
//Automaticamente se procedera a la consulta
CsdUtils csd = new CsdUtils("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await csd.GetAllCsdAsync();
//En caso exitoso se podran obtener los siguientes datos
List detail = response.data;
Console.Write("Status: " + response.Status);
if(response.Status == "success")
{
Console.Write("\ndetail: ");
foreach (var i in detail)
{
Console.Write(i.issuer_rfc + "\n");
Console.Write(i.certificate_number + "\n");
Console.Write(i.csd_certificate + "\n");
Console.Write(i.is_active + "\n");
Console.Write(i.issuer_business_name + "\n");
Console.Write(i.valid_from + "\n");
Console.Write(i.valid_to + "\n");
Console.Write(i.certificate_type + "\n");
}
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Consultar Certificado Por RFC
Método para obtener un certificado cargado enviando como parámetro el RFC del contribuyente.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Token
* RFC del contribuyente
**Ejemplo de consumo de la librería para la consulta de certificados por RFC mediante token**
```cs
using SW.Services.Csd;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo CsdUtils
//A esta le pasamos la Url y token
//Automaticamente se procedera a la consulta
CsdUtils csd = new CsdUtils("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await csd.GetAllCsdAsync("EKU9003173C9");
//En caso exitoso se podran obtener los siguientes datos
List detail = response.data;
Console.Write("Status: " + response.Status);
if(response.Status == "success")
{
Console.Write("\ndetail: ");
foreach (var i in detail)
{
Console.Write(i.issuer_rfc + "\n");
Console.Write(i.certificate_number + "\n");
Console.Write(i.csd_certificate + "\n");
Console.Write(i.is_active + "\n");
Console.Write(i.issuer_business_name + "\n");
Console.Write(i.valid_from + "\n");
Console.Write(i.valid_to + "\n");
Console.Write(i.certificate_type + "\n");
}
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Consultar Certificado Por NoCertificado
Método para obtener un certificado cargado enviando como parámetro el número de certificado.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Token
* Número de certificado a obtener
**Ejemplo de consumo de la librería para la consulta de certificados por Número de Certificado mediante token**
```cs
using SW.Services.Csd;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo CsdUtils
//A esta le pasamos la Url y token
//Automaticamente se procedera a la consulta
CsdUtils csd = new CsdUtils("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await csd.GetCsdAsync("30001000000500003416");
//En caso exitoso se podran obtener los siguientes datos
List detail = response.data;
Console.Write("Status: " + response.Status);
if(response.Status == "success")
{
Console.Write("\ndetail: ");
foreach (var i in detail)
{
Console.Write(i.issuer_rfc + "\n");
Console.Write(i.certificate_number + "\n");
Console.Write(i.csd_certificate + "\n");
Console.Write(i.is_active + "\n");
Console.Write(i.issuer_business_name + "\n");
Console.Write(i.valid_from + "\n");
Console.Write(i.valid_to + "\n");
Console.Write(i.certificate_type + "\n");
}
}
else
{
//En caso de error se pueden consultar los siguientes campos
Console.WriteLine(response.Message);
Console.WriteLine(response.MessageDetail);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Cargar Certificado
Método para cargar un certificado en la cuenta.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Token
* CSD en Base64
* Key en Base64
* Contraseña del certificado
**Ejemplo de consumo de la libreria para la carga de certificado mediante token**
```cs
using SW.Services.Csd;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Datos necesarios
string CerPassword = "12345678a";
//Obtenemos Certificado y lo convertimos a Base 64
string Cer = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/EKU9003173C9.cer"));
//Obtenemos LLave y lo convertimos a Base 64
string Key = Convert.ToBase64String(File.ReadAllBytes("Resources/CertificadosDePrueba/EKU9003173C9.key"));
//Creamos una instancia de tipo CsdUtils
//A esta le pasamos la Url y token
//Automaticamente se procedera a la carga de los certificados
CsdUtils csd = new CsdUtils("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await csd.UploadCsdAsync(Cer, Key, CerPassword);
//obtenemos la respuesta
Console.WriteLine(response.data);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Eliminar Certificado
Método para eliminar un certificado de la cuenta.
Este método recibe los siguientes parámetros:
* Url Servicios SW
* Token
* Número de certificado a eliminar
**Ejemplo de consumo de la libreria para eliminar un certificado mediante token**
```cs
using SW.Services.Csd;
using System;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//Creamos una instancia de tipo CsdUtils
//A esta le pasamos la Url y token
//Automaticamente se procedera a la eliminacion
CsdUtils csd = new CsdUtils("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
var response = await csd.DeleteCsdAsync("30001000000500003416");
//obtenemos la respuesta
Console.WriteLine(response.data);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
TimbradoV4
Email
Este servicio recibe un comprobante CFDI para ser timbrado y recibe un listado de uno o hasta 5 correos electrónicos a los que se requiera enviar el XML timbrado.
Existen varias versiones de respuesta a este método, las cuales puede consultar mas a detalle en el siguiente link.
Timbrado CFDI (StampV4)
**Ejemplo del consumo de la librería para el servicio StampV4(Email) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio StampV4(Email) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url y el token
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Emisión Timbrado (IssueV4)
**Ejemplo del consumo de la librería para el servicio IssueV4(Email) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueV4(Email) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url y el token
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Timbrado Json (IssueJsonV4)
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (Email) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarJsonV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (Email) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url y el token
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarJsonV1Async(xml, "someemail@some.com");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
CustomId
Este servicio recibe un comprobante CFDI para ser timbrado y que recibe un header conocido como CustomID, el cuál tiene el objetivo de agregar un filtro adicional al timbrado para evitar la duplicidad de timbrado.
El CustomId es un string y el valor es asignado por el usuario, el cual tiene un límite de 100 caracteres.
Existen varias versiones de respuesta a este método, las cuales puede consultar mas a detalle en el siguiente link.
Timbrado CFDI (StampV4)
**Ejemplo del consumo de la librería para el servicio StampV4(CustomId) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio StampV4(CustomId) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url y el token
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Emisión Timbrado (IssueV4)
**Ejemplo del consumo de la librería para el servicio IssueV4(CustomId) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueV4(CustomId) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url y el token
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Timbrado Json (IssueJsonV4)
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (CustomId) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (CustomId) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable de nuestro customId
var customId = Guid.NewGuid().ToString();
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url y el token
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, customId);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
PDF
Este servicio recibe un comprobante CFDI para ser timbrado y que recibe un header conocido como extra mediante el cual se confirma la generación de un PDF del CFDI timbrado que será guardado en automático en el ADT.
Existen varias versiones de respuesta a este método, las cuales puede consultar mas a detalle en el siguiente link.
NOTA: En caso de que no se cuente con una plantilla PDF customizada los PDF’s serán generados con las plantillas genéricas.
Timbrado CFDI (StampV4)
**Ejemplo del consumo de la librería para el servicio StampV4 (PDF) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio StampV4 (PDF) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo StampV4
//A esta le pasamos la Url y el token
StampV4 stamp = new StampV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Emisión Timbrado (IssueV4)
**Ejemplo del consumo de la librería para el servicio IssueV4 (PDF) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueV4 (PDF) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo IssueV4
//A esta le pasamos la Url y el token
IssueV4 stamp = new IssueV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Timbrado Json (IssueJsonV4)
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (PDF) XML en formato string mediante usuario y contraseña con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
//Automaticamente despues de obtenerlo se procedera a timbrar el XML
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "user", "password");
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
**Ejemplo del consumo de la librería para el servicio IssueJsonV4 (CustomId) XML en formato string mediante token con la versión de respuesta 1**
```cs
using SW.Services.Stamp;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ExampleSDK
{
class Program
{
static async Task Main(string[] args)
{
try
{
//obtenemos el XML
var xml = Encoding.UTF8.GetString(File.ReadAllBytes(file));
//creamos la variable para la confirmación del PDF
var pdf = new String[] { "pdf" };
//Creamos una instancia de tipo IssueJsonV4
//A esta le pasamos la Url y el token
IssueJsonV4 stamp = new IssueJsonV4("http://services.test.sw.com.mx", "T2lYQ0t4L0R....ReplaceForRealToken");
//Realizamos la peticion
var response = (StampResponseV1)await stamp.TimbrarV1Async(xml, null, null,false,pdf);
Console.WriteLine(response.Status);
Console.WriteLine(response.Data.Tfd);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
```
Para mayor referencia de un listado completo de los servicios favor de visitar el siguiente link.
Si deseas contribuir a la librería o tienes dudas envianos un correo a soporte@sw.com.mx.