anglemx/sat-cfdi

解析和验证与SAT墨西哥的CFDI

安装: 309

依赖: 0

建议者: 0

安全性: 0

星星: 1

关注者: 5

分支: 4

开放问题: 1

类型:git

v2.3.2 2024-01-28 06:41 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:09 UTC


README

一个纯PHP库,用于简化CFDI的处理和操作。创建新的CFDI并解析和验证现有的CFDI文件。

CFDI是墨西哥SAT(税务行政服务)的“Comprobante Fiscal Digital por Internet”的简称。

特性

  • 解析CFDI的XML表示形式
  • 从CFDI写入XML文件
  • 验证加密签名
  • 在线验证CFDI状态

安装

需要PHP 7.2+和Composer。

composer require anglemx/sat-cfdi

用法

<?

use Angle\CFDI\CFDI33;
use Angle\CFDI\XmlLoader;

// ...
// ...
// ...

$xmlFile = 'invoice.xml';

$loader = new XmlLoader();

$cfdi = $loader->fileToCFDI($xmlFile);

if (!$cfdi) {
    // Parsing failed
    // All the helper classes and utilities keep a log of errors that are meant for internal debugging
    echo "Errors:" . PHP_EOL;
    echo print_r($loader->getErrors(), true) . PHP_EOL;

    // And the utilities also keep a log of validations, which are user-friendly and meant for public display
    echo "Validations:" . PHP_EOL;
    echo print_r($loader->getValidations(), true) . PHP_EOL;
}

// Parsing success!
print_r($cfdi);

// The validations log is also available upon success
echo "Validations:" . PHP_EOL;
echo print_r($loader->getValidations(), true) . PHP_EOL;

有关更多实现示例,请查看测试文件。

依赖

为了使这个库尽可能强大,我们使用了大多数环境中默认包含的许多库。

  • 实现XSD模式文件以验证XML。(ext-domext-libxml
  • 实现XSLT样式表以生成签名验证的原链序列。(ext-xsl
  • 实现OpenSSL来操作和验证X.509证书。( ext-openssl

翻译

这个库是用英语编写的,以保持代码一致性。然而,一些关键词对这个领域非常具体。

资源

这个库捆绑了一些资源,以简化生产服务器上的安装过程,并允许离线处理。所有这些文件都是由SAT发布的,并且通过SAT的官方网站免费提供。

证书

我们将生产根X.509证书(CA)打包在一个方便的PEM文件中。如果您愿意,可以从官方网站下载它们并本地安装这些文件:http://omawww.sat.gob.mx/tramitesyservicios/Paginas/certificado_sello_digital.htm

SAT发布了一份所有注册和活跃纳税人的证书列表。您可以使用SAT的官方工具“Recuperación de Certificados”查询任何特定证书。

您可以使用该系统通过搜索他们的RFC查找SAT的所有证书:SAT970701NN3

参考

有关CFDI的官方出版物称为“附件20”,我们目前处于CFDI版本3.3。在线查看

Web服务

这使用一些公共Web服务来验证CFDI的状态。

待定..

验证

有关验证步骤的示例实现,请参阅tests/ValidatorTest.php

  • 步骤1:将XML解析为发票
  • 步骤2:验证属性
  • 步骤3:验证CFDI签名
  • 步骤4:验证财政印花税(TFD)
  • 步骤5:将CFDI的UUID与SAT进行验证

测试

要使用PHPUnit运行测试,只需安装开发依赖项

composer install

在库的根路径中创建一个/test-data/目录,并将您要测试的所有XML文件放入其中。

最后,运行测试

php vendor/bin/phpunit tests

待办事项

  • 解析时验证属性
  • 验证基本业务规则
  • 实现X.509证书的缓存
  • 在验证之前检查证书撤销状态
  • 实现XSLT 2.0转译的缓存
  • 文档和更多示例

待修复

  • 当文档有任何子节点(即使不在根节点)具有与文档默认命名空间不同的命名空间时,在 CFDI::toXML() 上会重复命名空间声明。我们应该在美化打印我们的XML时清理这些。
  • setChildrenFromDOMNodes() 内将所有 Node::NODE_NS_NAME 实例替换为 Node::NODE_NS_URI_NAME。参见 CFDI40\Complements 以获取参考。

其他说明

echo 'Node class: ' . get_class($node) . PHP_EOL;
echo 'Node Name: ' . $node->nodeName . PHP_EOL;
echo 'Node Prefix ' . $node->prefix . PHP_EOL;
echo 'Node Local Name: ' . $node->localName . PHP_EOL;
echo 'Node Base URI: ' . $node->baseURI . PHP_EOL;
echo 'Node Namespace URI: ' . $node->namespaceURI . PHP_EOL;
echo PHP_EOL;
Node class: DOMElement
Node Name: tfd:TimbreFiscalDigital
Node Prefix tfd
Node Local Name: TimbreFiscalDigital
Node Base URI: /Users/mundofr/GitHub/Angle/sat-cfdi/test-data/4D75D60D-48CF-434C-96A6-26DABB3AC5AF.xml
Node Namespace URI: http://www.sat.gob.mx/TimbreFiscalDigital

Node class: DOMElement
Node Name: Pagos20:Pagos
Node Prefix Pagos20
Node Local Name: Pagos
Node Base URI: /Users/mundofr/GitHub/Angle/sat-cfdi/test-data/4D75D60D-48CF-434C-96A6-26DABB3AC5AF.xml
Node Namespace URI: http://www.sat.gob.mx/Pagos20