jpcandioti / php-ws-afip
用于管理阿根廷联邦收入税务局(AFIP - 阿根廷财政机构)Web服务的库。
Requires
- php: >=5.6
- ext-soap: *
- phpseclib/phpseclib: ~2.0
Requires (Dev)
- phpunit/phpunit: >=5.0.0
- victorjonsson/markdowndocs: ^1.3
This package is not auto-updated.
Last update: 2024-09-29 05:27:50 UTC
README
用于管理阿根廷联邦收入税务局(AFIP - 阿根廷财政机构)Web服务的库。
phpWsAfip 是一个轻量级的库,允许任何PHP系统连接到AFIP的服务。
特性
- 使用 秘密短语 生成 RSA 私钥。
- 生成 证书签名请求 (CSR)。
- 从 CSR 中提取 唯一名称 (DN)。
- 提取 X.509 证书信息。
- 缓存每个 WebService 的 WSDL。
- 通过 __call 方法执行 WebService 提供的任何函数。
- 签名 访问请求票 (TRA)。
- 请求 访问票 (TA)。
- 管理任何 业务 WebService (WSN) 的会话。
- 实现 WSFEv1。
安装
$ composer require jpcandioti/php-ws-afip
创建证书
要创建允许在 AFIP WebService 平台上操作的证书,需要一个 私钥 和一个 证书签名请求 (CSR)。从 phpWsAfip 可以创建这两者。
有关更多信息,请参阅以下 AFIP 文档:生产环境证书生成
有关测试/同质化证书创建的更多信息,请参阅以下 AFIP 文档:WSASS: 如何加入服务
生成私钥
请务必将 私钥 保存在安全的地方。
示例
use phpWsAfip\WS\WSASS; $private_key = WSASS::generatePrivateKey(); echo $private_key;
使用 秘密短语 生成私钥
为了确保生成的密钥的安全性,密钥和其秘密短语不应一起存储。例如,可以不存储秘密短语,并在需要签名时让用户输入。
示例
use phpWsAfip\WS\WSASS; $bits = 4096; $passphrase = 'Una frase secreta'; $private_key = WSASS::generatePrivateKey($bits, $passphrase); echo $private_key;
生成 CSR
要向 AFIP 申请证书,需要生成 CSR。
示例
use phpWsAfip\WS\WSASS; $key_file = 'example.key'; // Distinguished Name (DN) para el Certificate Signing Request (CSR). // Los siguientes datos son de ejemplo y no concuerdan con una persona real. $dn = array( 'countryName' => 'AR', 'stateOrProvinceName' => 'Santa Fe', 'localityName' => 'Rosario', 'organizationName' => 'Juan Gutiérrez', 'commonName' => 'jgutierrez', 'serialNumber' => 'CUIT 20260795326' ); $csr = WSASS::generateCsr($key_file, $dn); echo $csr;
会话管理
为了在 业务 WebService (WSN) 中操作,需要请求一个 访问票 (TA)。
有关更多信息,请参阅以下 AFIP 文档:Web服务认证和授权技术规范
请求 TA
示例
use phpWsAfip\WS\WSAA; // Nombre y ubicación de las credenciales. $alias = 'jgutierrez'; $key_file = 'file://credentials/' . $alias . '.key'; $crt_file = 'file://credentials/' . $alias . '.pem'; // Configuración del servicio WSAA. $config = [ 'testing' => true, // Utiliza el servicio de homologación. 'wsdl_cache_file' => 'tmp/wsaahomo_wsdl.xml', // Define la ubicación del caché WSDL. 'tra_tpl_file' => 'tmp/tra_%s.xml' // Define la ubicación de los archivos temporarios con el TRA. ]; $wsaa = new WSAA('wsfe', $crt_file, $key_file, $config); // Si el TA se generó con éxito... if ($ta = $wsaa->requestTa()) { // Se visualiza los datos del encabezado. print_r($ta->header); // Guardar el XML en una variable. Luego puede almacenarse en una base de datos. //$xml = $ta->asXml(); //echo $xml; // Guardar el TA en un archivo. $ta->asXml('tmp/ta.xml'); }
业务 WebService (WSN)
该库包含 phpWsAfip/WS/WSN.php 类,该类是所有需要管理 TA 的服务的基类。
目前实现的唯一 WSN 是 电子发票 WebService (WSFE)。
如果需要使用其他 AFIP WebService,可以自己实现,并使用 phpWsAfip/WS/WSFE.php 类作为示例。然后,可以通过 Pull Request 将其添加到项目中,以便其他人可以利用它。
电子发票 WebService (WSFE)
要操作 WSFEv1 服务,需要有一个活动的 TA。
实例化后,可以执行官方文档中定义的所有方法(WSFEv1: 开发者手册 V.2.10),并将所有参数放入一个数组中。以下示例执行了 FECompUltimoAutorizado 和 FECAESolicitar 方法。
示例
use phpWsAfip\WS\WSFE; $ta_file = 'tmp/ta.xml'; // Configuración del servicio WSFE. $config = [ 'testing' => true, // Utiliza el servicio de homologación. 'wsdl_cache_file' => 'tmp/wsfehomo_wsdl.xml', // Define la ubicación del caché WSDL. ]; $wsfe = new WSFE($config); // Se precisa un TA. if (file_exists($ta_file)) { $wsfe->setXmlTa(file_get_contents($ta_file)); // Consulta el número del último comprobante y le sumo 1. $pto_vta = array( 'PtoVta' => 1, 'CbteTipo' => 6 // 6 Factura B ); $result = $wsfe->FECompUltimoAutorizado($pto_vta); $cbte_nro = $result->FECompUltimoAutorizadoResult->CbteNro + 1; $today = date('Ymd'); // Factura B por $302,50. $invoice = array( 'FeCAEReq' => array( 'FeCabReq' => array( 'CantReg' => 1, 'CbteTipo' => 6, // 6 Factura B 'PtoVta' => 1, ), 'FeDetReq' => array( 'FECAEDetRequest' => array( 'Concepto' => 2, // 2 Servicios. 'DocTipo' => 96, // 96 DNI. 'DocNro' => 32472807, 'CbteDesde' => $cbte_nro, 'CbteHasta' => $cbte_nro, 'CbteFch' => $today, 'ImpTotal' => 302.5, 'ImpTotConc' => 0, 'ImpNeto' => 250, 'ImpOpEx' => 0, 'ImpIVA' => 52.5, 'ImpTrib' => 0, 'FchServDesde' => $today, 'FchServHasta' => $today, 'FchVtoPago' => $today, 'MonId' => 'PES', 'MonCotiz' => 1, 'Iva' => array( 'AlicIva' => array( 'Id' => 5, 'BaseImp' => 250, 'Importe' => 52.5 ) ) ) ) ) ); // Se visualiza el resultado con el CAE correspondiente al comprobante. $result = $wsfe->FECAESolicitar($invoice); print_r($result); }
使用 SoapClient 缓存
phpWsAfip 在一个文件上实现了一个自己的 WSDL 缓存。如果您想使用 SoapClient 的缓存,可以在 WSAA 或任何 WSN 中使用。
示例
use phpWsAfip\WS\WSFE; // Configuración de SoapClient. $soap_options = array( 'cache_wsdl'=> WSDL_CACHE_DISK ); // Configuración del servicio WSFE. $config = [ 'wsdl_cache_file' => null, 'soap_options' => $soap_options ]; $wsfe = new WSFE($config);
代码文档
phpWsAfip 的文档,使用 PHP-Markdown-Documentation-Generator 生成。
开发和测试
要构建开发环境,需要遵循以下步骤:
$ git clone https://github.com/jpcandioti/php-ws-afip.git
$ cd php-ws-afip
$ composer install
运行测试需要有一个与相应 私钥 的同等级别认证证书。
这些证书必须存储在 credentials 目录下,名称由环境变量 TEST_ALIAS 指定,并且文件扩展名为 .key、.csr 和 .pem。
示例
$ TEST_ALIAS=jgutierrez phpunit phpWsAfip
许可协议
phpWsAfip 采用 Apache License Version 2.0 许可协议。
Copyright 2018 Juan Pablo Candioti
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://apache.ac.cn/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
合作
您可以通过以下 Bitcoin 钱包向项目开发者捐款:
132r6sUhqz44gfXAj5EpWxH2pWB59HbWKY