anglemx / sat-cfdi
解析和验证与SAT墨西哥的CFDI
Requires
- php: >=7.2
- ext-curl: *
- ext-dom: *
- ext-intl: *
- ext-json: *
- ext-libxml: *
- ext-openssl: *
- ext-simplexml: *
- ext-xsl: *
- anglemx/mexico-rfc: ^1.0
- fgrosse/phpasn1: ^2.1
- genkgo/xsl: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7.5
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-dom
,ext-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