これらのサービスは、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-electronica/ のページにアクセスして、オンラインでお問い合わせいただくか、お電話ください。 555 546 2288 または 558 421 7675 までお電話ください。喜んでご要望に応じます。
.Net Standardのライブラリ。収入、支出、振込、給与計算、支払いなど、あらゆるタイプのデジタル領収書 (Xml および PDF)を生成できます。対応するデータを入力することで、数分でデジタル請求書を簡単に生成できます。
Web アプリケーション、デスクトップ、モバイル (Mono、Xamarin)、Silverlight、WPF、.Net Core、ユニバーサル Windows プラットフォーム、Unity など、あらゆる種類のプロジェクトに統合するのに理想的で互換性があります。プロジェクト内でライブラリを直接使用するか、NuGet パッケージを使用して参照を追加します
このライブラリを使用すると、呼び出し音を鳴らしたり、キャンセルしたり、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 には、ライブラリのすべてのメソッドを使用する完全なサンプル プロジェクトがあります。ダウンロードしてテストすることを強くお勧めします。
呼び出し要求を送信するには、 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 が自動的に生成されます (これは、送受信する情報のデバッグに役立つコンソール アプリケーションです)。これをソリューションに統合する場合は、上で指定した要件に対応する参照を忘れずに用意してください。
XML、PDF、納税印紙、ステータス、エラーなどが含まれる応答オブジェクト CFDITimbradoRespuesta を確認します。 **「000」以外のエラー コードは、確認して修正する必要がある何らかのエラーを示しています**。
CFDIXML、TimbreXML、および PDF 属性は Base64 であり、XML および/または CFDI スタンプを取得するにはテキストに変換する必要があります。PDF の場合は、印刷表現を取得するためにバイナリで保存または変換できます。これはサンプル プロジェクトですでに行われています。
このライブラリを使用すると、1 つ以上の Fiscal Folio を送信して同時にキャンセルできます。送信する必要があるのは、ユーザー名、パスワード、発行者の 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"
}
サンプル コードでプロジェクトを使用する場合アプリケーションを実行またはデバッグすると、入力したデータとともにキャンセルが自動的に送信されます (これは、送受信する情報のデバッグに役立つコンソール アプリケーションです)。これをソリューションに統合する場合は、上で指定した要件に対応する参照を忘れずに用意してください。
ライブラリを使用すると、1 つ以上の Fiscal Folio を参照してキャンセルのステータスを確認できます。 SAT が定める規則によれば、適用される規則に応じて、CFDI はすぐにキャンセルできますが、CFDI を受信するユーザーが CFDI のキャンセルを受け入れるか拒否するまでに最大 72 時間待つ必要があります。
この 72 時間の間、CFDI のステータスは自動的に更新される可能性があるため、定期的にサービスに問い合わせて CFDI の現在のステータスを確認する必要があります。 SAT もステータスの変更が反映されるまでに 1 ~ 72 時間かかるため、1 時間未満の頻度で実行することはお勧めできません。したがって、毎回 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 Register Here にアクセスするための有効なアカウントと、Rest Service の着信音のパッケージが必要です。ドアホンの最新の価格リストは、次の場所で直接確認できます。
価格表
使用法と価格の点で異なる特徴を持ついくつかのパッケージがあるため、 Rest API サービス スタンプ テーブルに入力する必要があります。そこに各パッケージの条件と使用法が表示されます。
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 clone [email protected]:yourUserName/factura-electronica-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 によってメキシコで開発されました。ライセンスを使用する 詳細を参照してください。