自 2021 年 4 月 1 日起,这些服务将不再可用,新版本的 API 具有这些以及更多工具,将方便并节省您大量的验证时间或审计中的 SAT 处罚,我们强烈建议您查看https://developers.facturoporti.com.mx/reference/api-facturacion-Electronica 中的新文档作为新功能的一部分,您将能够:
新的 API 访问服务发布于:
https://testapi.facturoporti.com.mx/
https://api.facturoporti.com.mx/
根据您所处的环境,您应该使用沙箱或生产环境。
您需要帮助还是需要雇用服务?给我们发送电子邮件至 [email protected] [email protected],转到页面 https://www.facturoporti.com.mx/api-de-facturacion-electrica/ 在线与我们交谈或致电请致电 555 546 2288 或 558 421 7675,我们将很乐意为您提供所需的服务。
.Net Standard中的库允许您生成任何类型的数字收据收入、费用、转账、工资、付款等(Xml 和 PDF),通过填写相应的数据,您可以在几分钟内轻松生成数字发票。
它非常适合集成到任何类型的项目中,无论是 Web 应用程序、桌面、移动(Mono、Xamarin)、silverlight、WPF、.Net Core、通用 Windows 平台、Unity 等。直接在项目中使用库或使用 - NuGet Package 添加引用
通过此库,您还可以拨打、取消、获取 SAT 的 CFDI 状态、查询剩余的响铃等。
您不需要了解任何 SAT 规则,图书馆将根据附件 20 生成 XML,图书馆负责处理一切,促进您的系统和/或应用程序、服务的集成过程,以符合 SAT 的要求。
该库非常轻且快速,它使用 Rest Api 调用,允许您生成 CFDI 并同时通过电子邮件发送它们。
建议使用Visual Studio 2015或2017社区开发IDE或更高版本。所有社区版本都是免费的,可以从 https://visualstudio.microsoft.com/es/vs/community/ 下载
图书馆有以下要求:
另外根据您的项目检查您需要的框架版本:
在NuGet中获取最新版本的 FacturoPorTi 图章库: FacturoPorTi.CFDI
在 GitHub - FacturoPorTi-Factura-Electronica-dll 中,有一个使用该库的所有方法的完整示例项目;我们强烈建议您下载并测试它。
要向ring发送请求,必须生成CFDIpetition类型的对象,这又必须填充其他对象:
using System ;
using System . Collections . Generic ;
using System . IO ;
using System . Linq ;
using System . Text ;
using System . Threading . Tasks ;
using FacturoPorTi . Api . Cfdi ;
using FacturoPorTi . Api . Cfdi . Entidades ;
using FacturoPorTi . Api . Cfdi . Genericos ;
private static void TimbrarDocumento ( )
{
Archivos manager = new Archivos ( ) ;
TimbreFiscalDigital Timbre = new TimbreFiscalDigital ( ) ;
CFDIPeticion Peticion = new CFDIPeticion ( ) ;
Utilerias utilerias = new Utilerias ( ) ;
string NombreArchivo = string . Empty ;
#region "Datos Generales"
Peticion . DatosGenerales = new DatosGeneralesCFDI ( ) ;
Peticion . DatosGenerales . Usuario = "PruebasTimbrado" ; // Este usuario se genera desde la pagina de https://cfdi.facturoporti.com.mx/ se debe de registrar para usar el productivo
Peticion . DatosGenerales . Password = "@Notiene1" ; // Es la contraseña del usuario cuando se registró
Peticion . DatosGenerales . GeneraPDF = "true" ;
Peticion . DatosGenerales . EnviaEmail = "false" ; // Valores permitidos "true" : "false";
Peticion . DatosGenerales . ReceptorEmail = "[email protected]" ;
//Logotipo (opcional) acepta una imagen jpeg o png en base 64 menor a 100 KB
//Peticion.DatosGenerales.Logotipo = manager.ConvertirByteToBase64(manager.ConvertirStreamToByte(manager.Abrir("Cambiar la ruta de lectura o enviar la imagen en base 64")));
enumTipoDocumento TipoDocumentoActual = enumTipoDocumento . Factura ;
switch ( TipoDocumentoActual )
{
case enumTipoDocumento . Factura :
Peticion . DatosGenerales . CFDI = "Factura" ;
Peticion . DatosGenerales . TipoCFDI = "Ingreso" ;
break ;
case enumTipoDocumento . NotaCargo :
Peticion . DatosGenerales . CFDI = "NotaCargo" ;
Peticion . DatosGenerales . TipoCFDI = "Ingreso" ;
break ;
case enumTipoDocumento . NotaCredito :
Peticion . DatosGenerales . CFDI = "NotaCredito" ;
Peticion . DatosGenerales . TipoCFDI = "Egreso" ;
break ;
case enumTipoDocumento . CartaPorte :
Peticion . DatosGenerales . CFDI = "CartaPorte" ;
Peticion . DatosGenerales . TipoCFDI = "Traslado" ;
break ;
case enumTipoDocumento . Pago :
Peticion . DatosGenerales . CFDI = "Pago" ;
Peticion . DatosGenerales . TipoCFDI = "Pago" ;
break ;
case enumTipoDocumento . ReciboNominaCFDI :
Peticion . DatosGenerales . CFDI = "ReciboNomina" ;
Peticion . DatosGenerales . TipoCFDI = "ReciboNomina" ;
break ;
}
Peticion . DatosGenerales . OpcionDecimales = ( ( int ) enumOpcionDecimales . Redondear ) . ToString ( ) ; // Valores permitidos 1: Truncar (Operaciones exactas) 2: Redondear hacia arriba o hacia abajo las cantidades
Peticion . DatosGenerales . NumeroDecimales = "2" ; // El valor predeterminado es 2 hasta un máximo de 6 decimales
#endregion "Datos Generales"
#region "Encabezado"
#region "Emisor"
Peticion . Encabezado = new EncabezadoCFDI ( ) ;
Peticion . Encabezado . Emisor = new EmisorCFDI ( ) ;
Peticion . Encabezado . Emisor . RFC = "AAA010101AAA" ; // Para realizar pruebas solamente se puede usar este RFC AAA010101AAA
Peticion . Encabezado . Emisor . NombreRazonSocial = "Mi nombre o el nombre de mi empresa" ;
Peticion . Encabezado . Emisor . RegimenFiscal = "601" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
// El domicilio de emision es opcional pero se agrega por peticion del usuario
DireccionCFDI direccion = new DireccionCFDI ( ) ;
direccion . Calle = "Avenida Reforma" ;
direccion . NumeroExterior = "1234" ;
direccion . NumeroInterior = "XA" ;
direccion . Colonia = "Roma Norte" ;
direccion . Estado = "Ciudad de México" ;
direccion . Municipio = "Benito Juarez" ;
direccion . Pais = "México" ;
direccion . CodigoPostal = "06470" ;
Peticion . Encabezado . Emisor . Direccion = new List < DireccionCFDI > ( ) ;
Peticion . Encabezado . Emisor . Direccion . Add ( direccion ) ;
#endregion "Emisor"
#region "Receptor"
Peticion . Encabezado . Receptor = new ReceptorCFDI ( ) ;
Peticion . Encabezado . Receptor . RFC = "XEXX010101000" ;
Peticion . Encabezado . Receptor . NombreRazonSocial = "Nombre del cliente" ;
Peticion . Encabezado . Receptor . UsoCFDI = "G03" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
// El domicilio del receptor es opcional pero se agrega por peticion del usuario
direccion = new DireccionCFDI ( ) ;
direccion . Calle = "Leo" ;
direccion . NumeroExterior = "9876" ;
direccion . NumeroInterior = "A-34" ;
direccion . Colonia = "San Rafael" ;
direccion . Estado = "Morelos" ;
direccion . Municipio = "Cuernavaca" ;
direccion . Pais = "México" ;
direccion . CodigoPostal = "62775" ;
Peticion . Encabezado . Receptor . Direccion = direccion ;
#endregion "Receptor"
Peticion . Encabezado . Fecha = DateTime . Now . ToString ( "yyyy-MM-ddTHH:mm:ss" ) ; // Se debe de enviar con el formato indicado yyyy-MM-ddTHH:mm:ss
Peticion . Encabezado . Serie = "A" ; // Es el numero de serie es un valor opcional
Peticion . Encabezado . Folio = "12" ; // Es el numero de folio es un valor opcional
Peticion . Encabezado . MetodoPago = "PUE" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
Peticion . Encabezado . FormaPago = "99" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
Peticion . Encabezado . Moneda = "MXN" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
Peticion . Encabezado . LugarExpedicion = "06470" ;
Peticion . Encabezado . SubTotal = "1500" ; // Es la suma de los importes en bruto
Peticion . Encabezado . Total = "1740" ; // Es la suma de los importes + los impuestos trasladados - los impuestos retenidos
#endregion "Encabezado"
#region "Conceptos"
Peticion . Conceptos = new List < ConceptoCFDI > ( ) ;
ConceptoCFDI concepto = new ConceptoCFDI ( ) ;
concepto . Cantidad = "1" ;
concepto . CodigoUnidad = "E48" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
//concepto.Unidad = "Pieza"; // Este es un valor opcional
//concepto.Serie = ""; // Este es un valor opcional se agregan numero de series, partes, etc.
concepto . CodigoProducto = "53112101" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
concepto . Producto = "Zapatos de caballero marca patito" ;
concepto . PrecioUnitario = "1000" ;
concepto . Importe = "1000" ;
concepto . Impuestos = new List < ImpuestosCFDI > ( ) ;
ImpuestosCFDI impuesto = new ImpuestosCFDI ( ) ;
impuesto . TipoImpuesto = ( ( int ) enumTipoImpuesto . Trasladado ) . ToString ( ) ; // Tipo de impuesto se envía la clave 1 traslado 2 retenido
impuesto . Impuesto = ( ( int ) enumImpuesto . IVA ) . ToString ( ) ;
impuesto . Factor = ( ( int ) enumFactor . Tasa ) . ToString ( ) ;
impuesto . Base = concepto . Importe ;
impuesto . Tasa = "0.160000" ; // Se debe de enviar con los 6 decimales la tasa para revisar las tasas actuales vea http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
impuesto . ImpuestoImporte = utilerias . RegresaStringDecimalesXOpcion ( Convert . ToDecimal ( concepto . Importe ) * Convert . ToDecimal ( "0.160000" ) , ( int ) enumOpcionDecimales . Redondear , 2 ) ;
concepto . Impuestos . Add ( impuesto ) ;
// En caso de llevar IEPS se llena esta seccion
//if (TasaIEPS != null)
//{
// impuesto.TipoImpuesto = ((int)enumTipoImpuesto.Trasladado).ToString(); // Tipo de impuesto se envía la clave 1 traslado 2 retenido
// impuesto.Impuesto = ((int)enumImpuesto.IEPS).ToString();
// impuesto.Factor = ((int)enumFactor.Tasa).ToString();
// impuesto.Base = concepto.Importe;
// impuesto.Tasa = "0.08000"; // en el ejemplo la tasa es de 8 porciento Se debe de enviar con los 6 decimales la tasa para revisar las tasas actuales vea http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
// impuesto.ImpuestoImporte = utilerias.RegresaStringDecimalesXOpcion(Convert.ToDecimal(concepto.Importe) * Convert.ToDecimal("0.080000"), (int)enumOpcionDecimales.Redondear, 2);
// concepto.Impuestos.Add(impuesto);
//}
//if (RetencionIVA != null)
//{
// impuesto.TipoImpuesto = ((int)enumTipoImpuesto.Retenido).ToString(); // Tipo de impuesto se envía la clave 1 traslado 2 retenido
// impuesto.Impuesto = ((int)enumImpuesto.IVA).ToString();
// impuesto.Factor = ((int)enumFactor.Tasa).ToString();
// impuesto.Base = concepto.Importe;
// impuesto.Tasa = "0.106667"; // en el ejemplo la tasa es de 2/3 partes de IVA 10.66667 porciento Se debe de enviar con los 6 decimales la tasa para revisar las tasas actuales vea http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
// impuesto.ImpuestoImporte = utilerias.RegresaStringDecimalesXOpcion(Convert.ToDecimal(concepto.Importe) * Convert.ToDecimal("0.106667"), (int)enumOpcionDecimales.Redondear, 2);
// concepto.Impuestos.Add(impuesto);
//}
//if (RetencionISR != null)
//{
// impuesto.TipoImpuesto = ((int)enumTipoImpuesto.Retenido).ToString(); // Tipo de impuesto se envía la clave 1 traslado 2 retenido
// impuesto.Impuesto = ((int)enumImpuesto.ISR).ToString();
// impuesto.Factor = ((int)enumFactor.Tasa).ToString();
// impuesto.Base = concepto.Importe;
// impuesto.Tasa = "0.10000"; // en el ejemplo la tasa es de 10 porciento Se debe de enviar con los 6 decimales la tasa para revisar las tasas actuales vea http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
// impuesto.ImpuestoImporte = utilerias.RegresaStringDecimalesXOpcion(Convert.ToDecimal(concepto.Importe) * Convert.ToDecimal("0.100000"), (int)enumOpcionDecimales.Redondear, 2);
// concepto.Impuestos.Add(impuesto);
//}
Peticion . Conceptos . Add ( concepto ) ;
concepto = new ConceptoCFDI ( ) ;
concepto . Cantidad = "2" ;
concepto . CodigoUnidad = "E48" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
//concepto.Unidad = "Pieza"; // Este es un valor opcional
//concepto.Serie = ""; // Este es un valor opcional se agregan numero de series, partes, etc.
concepto . CodigoProducto = "53112102" ; // Se agrega la clave de acuerdo al catálogo del SAT http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
concepto . Producto = "Zapatos de mujer marca patito" ;
concepto . PrecioUnitario = "250" ;
concepto . Importe = "500" ;
concepto . Impuestos = new List < ImpuestosCFDI > ( ) ;
impuesto = new ImpuestosCFDI ( ) ;
impuesto . TipoImpuesto = ( ( int ) enumTipoImpuesto . Trasladado ) . ToString ( ) ; // Tipo de impuesto se envía la clave 1 traslado 2 retenido
impuesto . Impuesto = ( ( int ) enumImpuesto . IVA ) . ToString ( ) ;
impuesto . Factor = ( ( int ) enumFactor . Tasa ) . ToString ( ) ;
impuesto . Base = concepto . Importe ;
impuesto . Tasa = "0.160000" ; // Se debe de enviar con los 6 decimales la tasa para revisar las tasas actuales vea http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI.xls
impuesto . ImpuestoImporte = utilerias . RegresaStringDecimalesXOpcion ( Convert . ToDecimal ( concepto . Importe ) * Convert . ToDecimal ( "0.160000" ) , ( int ) enumOpcionDecimales . Redondear , 2 ) ;
concepto . Impuestos . Add ( impuesto ) ;
Peticion . Conceptos . Add ( concepto ) ;
#endregion "Conceptos"
#region "Realiza el Timbrado"
FacturoPorTi . Api . Cfdi . ComprobanteDigital comprobante = new FacturoPorTi . Api . Cfdi . ComprobanteDigital ( ) ;
comprobante . SandBox = true ; // True = pruebas, False= Productivo
//Para el ejercicio se usan los certificados de prueba del SAT
// Tambien se puede enviar un stream o arreglo de bytes
string RutaCertificado = ObtieneDirectorioAplicacion ( ) + @"CertificadoAAA010101AAA.cer" ;
string RutaLlavePrivada = ObtieneDirectorioAplicacion ( ) + @"CertificadoAAA010101AAA.key" ;
string RutaTimbrados = ObtieneDirectorioAplicacion ( ) + @"Timbrados" ;
Console . WriteLine ( "Inicio de Timbrado " + DateTime . Now ) ;
var resultado = comprobante . GeneraCFDI ( Peticion , RutaCertificado , RutaLlavePrivada , "12345678a" ) ;
if ( resultado == true )
{
NombreArchivo = Peticion . Encabezado . Receptor . RFC + AcronimoArchivo ( TipoDocumentoActual ) + ( Peticion . Encabezado . Serie == null ? "" : Peticion . Encabezado . Serie ) + Peticion . Encabezado . Folio + "_" + Convert . ToDateTime ( Peticion . Encabezado . Fecha ) . ToString ( "yyyyMMdd" ) ;
manager . Guardar ( manager . ConvertirBase64ToByte ( comprobante . Timbrado . CFDITimbrado . Respuesta . CFDIXML ) , RutaTimbrados + NombreArchivo + ".xml" ) ;
manager . Guardar ( manager . ConvertirBase64ToByte ( comprobante . Timbrado . CFDITimbrado . Respuesta . PDF ) , RutaTimbrados + NombreArchivo + ".pdf" ) ;
Timbre = utilerias . CargaObjetoDeXML < TimbreFiscalDigital > ( new TimbreFiscalDigital ( ) , new Archivos ( ) . ConvertirBase64ToString ( comprobante . Timbrado . CFDITimbrado . Respuesta . TimbreXML ) ) ;
UUID = Timbre . UUID ;
Console . WriteLine ( comprobante . Mensaje + " UUID " + UUID ) ;
Console . WriteLine ( " Para ver los archivos ingrese a la carpeta " + RutaTimbrados ) ;
}
else
{
Console . WriteLine ( "" ) ;
Console . WriteLine ( comprobante . Mensaje ) ;
}
Console . WriteLine ( "Fin de Timbrado" ) ;
Console . WriteLine ( "" ) ;
//Console.ReadLine();
#endregion "Realiza el Timbrado"
}
如果您使用带有示例代码的项目运行或调试应用程序,则将使用您输入的数据自动生成 Xml 和 PDF(它是一个控制台应用程序,可帮助您调试发送和接收的信息)。如果您将其集成到您的解决方案中,请记住提供符合上述要求的参考资料。
查看响应对象 CFDITimbradoRespuesta,您将在其中找到 XML、PDF、印花税票、状态、错误等。 **“000”以外的任何错误代码都表示存在某种类型的错误**,必须进行检查和更正。
CFDIXML、TimbreXML 和 PDF 属性采用 Base64 格式,必须转换为文本才能获取 XML 和/或 CFDI 标记。对于 PDF,它们可以以二进制形式保存或转换以获得打印表示形式。这已经在示例项目中完成了。
图书馆允许您同时发送一份或多份财务开本进行取消,您只需发送用户名、密码、发行者的RFC和数字证书即可。
private static void CancelarUUID ( )
{
CancelarCFDIPeticion Peticion = new CancelarCFDIPeticion ( ) ;
Peticion . Usuario = "PruebasTimbrado" ; // Este usuario se genera desde la pagina de https://cfdi.facturoporti.com.mx/ se debe de registrar para usar el productivo
Peticion . Password = "@Notiene1" ; // Es la contraseña del usuario cuando se registró
Peticion . RFC = "AAA010101AAA" ;
Peticion . UUIDs = new List < string > ( ) ;
Peticion . UUIDs . Add ( UUID ) ;
#region "Realiza la cancelación"
FacturoPorTi . Api . Cfdi . ComprobanteDigital comprobante = new FacturoPorTi . Api . Cfdi . ComprobanteDigital ( ) ;
comprobante . SandBox = true ; // True = pruebas, False= Productivo
//Para el ejercicio se usan los certificados de prueba del SAT
// Tambien se puede enviar un stream o arreglo de bytes
string RutaCertificado = ObtieneDirectorioAplicacion ( ) + @"CertificadoAAA010101AAA.cer" ;
string RutaLlavePrivada = ObtieneDirectorioAplicacion ( ) + @"CertificadoAAA010101AAA.key" ;
Console . WriteLine ( "Inicio de cancelación " + DateTime . Now ) ;
var resultado = comprobante . CancelarCFDI ( Peticion , RutaCertificado , RutaLlavePrivada , "12345678a" ) ;
if ( resultado == true )
{
Console . WriteLine ( comprobante . Mensaje + " Respuesta del Folio " + comprobante . Cancelaciones . FoliosRespuesta [ 0 ] . EstatusCancelacionSAT ) ;
}
else
{
Console . WriteLine ( "" ) ;
Console . WriteLine ( comprobante . Mensaje ) ;
}
Console . WriteLine ( "Fin de la cancelación" ) ;
Console . WriteLine ( "" ) ;
//Console.ReadLine();
#endregion "Realiza el Timbrado"
}
如果您使用带有示例代码的项目运行或调试应用程序,取消将自动与您输入的数据一起发送(它是一个控制台应用程序,可帮助您调试发送和接收的信息)。如果您将其集成到您的解决方案中,请记住提供与上述要求相对应的参考资料。
图书馆允许您查阅一份或多份财政对开本以查看取消的状态;根据国家税务总局的规定,CFDI可以立即取消,具体取决于适用的规则,或者最多必须等待72小时,等待接收CFDI的用户接受或拒绝CFDI的取消。
在这72小时期间,CFDI的状态可以自动更新,因此需要定期咨询服务来验证CFDI的当前状态。不建议这样做的频率少于 1 小时,因为 SAT 也需要 1 到 72 小时才能看到反映的状态变化。所以建议您每次调用该服务的时间不要超过1小时,在此之前查询CFDI的状态是徒劳的。
private static void ConsultarEstatusUUID ( )
{
ConsultaEstatusPeticion Peticion = new ConsultaEstatusPeticion ( ) ;
Peticion . Usuario = "PruebasTimbrado" ; // Este usuario se genera desde la pagina de https://cfdi.facturoporti.com.mx/ se debe de registrar para usar el productivo
Peticion . Password = "@Notiene1" ; // Es la contraseña del usuario cuando se registró
Peticion . UUIDs = new List < string > ( ) ;
Peticion . UUIDs . Add ( UUID ) ;
#region "Realiza la cancelación"
FacturoPorTi . Api . Cfdi . ComprobanteDigital comprobante = new FacturoPorTi . Api . Cfdi . ComprobanteDigital ( ) ;
comprobante . SandBox = true ; // True = pruebas, False= Productivo
Console . WriteLine ( "Inicio de consulta " + DateTime . Now ) ;
var resultado = comprobante . ConsultaEstatusCFDI ( Peticion ) ;
if ( resultado == true )
{
Console . WriteLine ( comprobante . Mensaje + " " + comprobante . EstatusFolios . FoliosRespuesta [ 0 ] . EstatusCancelacionSAT ) ;
}
else
{
Console . WriteLine ( "" ) ;
Console . WriteLine ( comprobante . Mensaje ) ;
}
Console . WriteLine ( "Fin de la consulta" ) ;
Console . WriteLine ( "" ) ;
//Console.ReadLine();
#endregion "Realiza el Timbrado"
}
为了发出或取消任何类型的 CFDI,需要有一个 Rest Service 收费包。如果您与示例中的用户一起使用测试模式,他有一个您可以随时使用的收费包。
当您通过生产环境时,您必须拥有一个有效的帐户才能访问 FacturoPorTi 在此处注册,以及用于 Rest 服务的铃声包。您可以直接在以下网址查阅最新的门铃价格表:
价格表
由于我们有几个在使用和价格方面具有不同特征的软件包,因此您必须输入Rest Api Service Stamps 表,在那里您可以找到每个软件包的条款和用途。
private static void ConsultarTimbresRestantes ( )
{
ConsultaTimbresRestantesPeticion Peticion = new ConsultaTimbresRestantesPeticion ( ) ;
Peticion . Usuario = "PruebasTimbrado" ; // Este usuario se genera desde la pagina de https://cfdi.facturoporti.com.mx/ se debe de registrar para usar el productivo
Peticion . Password = "@Notiene1" ; // Es la contraseña del usuario cuando se registró
#region "Realiza la cancelación"
FacturoPorTi . Api . Cfdi . ComprobanteDigital comprobante = new FacturoPorTi . Api . Cfdi . ComprobanteDigital ( ) ;
comprobante . SandBox = true ; // True = pruebas, False= Productivo
Console . WriteLine ( "Inicio de consulta de timbres restantes " + DateTime . Now ) ;
var resultado = comprobante . ConsultaTimbresRestantes ( Peticion ) ;
if ( comprobante . Resultado == true )
{
Console . WriteLine ( comprobante . Mensaje ) ;
Console . WriteLine ( " Fecha de Compra = " + resultado . FechaCompra + " Timbres Utilizados= " + resultado . TimbresUtilizados + " CreditosRestantes = " + resultado . CreditosRestantes ) ;
}
else
{
Console . WriteLine ( "" ) ;
Console . WriteLine ( comprobante . Mensaje ) ;
}
Console . WriteLine ( "Fin de la consulta de timbres restantes" ) ;
Console . ReadLine ( ) ;
#endregion "Realiza el Timbrado"
}
如果您想了解有关如何生成任何类型的 CFDI 的更多选项,请阅读包含所有属性及其允许值的描述的数据字典的文档 https://developers.facturoporti.com.mx /reference/api-电子账单
如果您需要帮助或有疑问,请通过 [email protected] 联系我们或访问 FacturoPorTi 来帮助您满足您的需求。
分叉存储库
克隆存储库
git克隆 [email protected]:yourUserName/factura-electrica-Dll-Api-Rest.git
创建分支
git checkout desarrollo
git pull al original desarrollo
# Podrás escoger el nombre de tu rama
git checkout -b <feature/my_branch>
git add .
git commit -m "mis cambios"
git push origin <feature/my_branch>
***-
由 FacturoPorTi 在墨西哥开发。使用许可证 查看更多。