phpcraft / fatturazione-elettronica
意大利电子发票系统的连接接口
Requires
- php: ^5.6.37 || ^7.0
- robrichards/wse-php: ^2.0
- zendframework/zend-soap: ^2.7
This package is auto-updated.
Last update: 2024-09-15 20:38:26 UTC
README
用于连接意大利交换系统以管理电子发票的库。
注意:该库正在开发中,目前不可用
注意:要实际连接SdI,必须是一个授权实体
Web服务
这个库旨在提供中间件发送和接收SdI电子发票所需的功能,即
- 公开SOAP RicezioneFatture 和 TrasmissioneFatture Web服务
- 通过SOAP客户端连接到部长的 SdIRiceviFile 和 SdIRiceviNotifica Web服务
为了在连接SdI之前进行测试,该库还提供相反的功能,即
- 公开SOAP SdIRiceviFile 和 SdIRiceviNotifica Web服务,以便可以通过库本身生成的SOAP客户端连接
- 通过SOAP客户端连接到库本身公开的 RicezioneFatture 和 TrasmissioneFatture Web服务
以下是完整Web服务和相关操作的方案
- SdICoop接收服务
- ws RicezioneFatture(由中间件公开)
- op. RiceviFatture
- op. NotificaDecorrenzaTermini
- ws SdIRiceviNotifica(由SdI公开)
- op. NotificaEsito
- ws RicezioneFatture(由中间件公开)
- SdICoop传输服务
- ws SdIRiceviFile(由SdI公开)
- op. RiceviFile
- ws TrasmissioneFatture(由中间件公开)
- op. RicevutaConsegna
- op. NotificaMancataConsegna
- op. NotificaScarto
- op. NotificaEsito
- op. NotificaDecorrenzaTermini
- op. AttestazioneTrasmissioneFattura
- ws SdIRiceviFile(由SdI公开)
- SDIDati服务
- ws SdITrasmissioneFile
- op. Trasmetti
- op. Esito
- ws SdITrasmissioneFile
XML发票
该库还包含生成和解析发票XML所需的所有类
使用方法
创建webservice
对于想要公开的每个webservice,需要使用一个实现了相应webservice接口的类,这些接口包含在\PHPCraft\FatturazioneElettronica\ServerSOAP\InterfacceWebservice中,并因此公开了webservice的所有对应方法,例如
class MiaClassePerWebserviceRicezioneFatture implements \PHPCraft\FatturazioneElettronica\ServerSOAP\InterfacceWebservice\RicezioneFatture
{
public function RiceviFatture($fileSdIConMetadati)
{
//eseguire le operazioni necessarie per l'operazione RiceviFatture
....
//ritornare l'oggetto corretto per la risposta
return new \PHPCraft\FatturazioneElettronica\TipiDati\RispostaRiceviFatture('ER01');
}
public function NotificaDecorrenzaTermini($fileSdI)
{
//eseguire le operazioni necessarie per l'operazione NotificaDecorrenzaTermini
...
//ritornare nullo per questa operazione
return null;
}
}
因此可以创建webservice实例
//disabilitare la cache wsdl se si stanno utilizzando dei wsdl non ancora definitivi
ini_set("soap.wsdl_cache_enabled", "0");
//istanziare SOAP server Zend, il wsdl e le opzioni SOAP vengono impostate successivamente
$zendSOAPServer = new Zend\Soap\Server;
//istanziare la classe appropriata al server SOAP che si intende esporre fra RicezioneFatture, TrasmissioneFatture, SdIRiceviFile e SdIRiceviNotifica, per esempio RicezioneFatture
$server = new \PHPCraft\FatturazioneElettronica\ServerSOAP\RicezioneFatture(
$opzioniSOAP //array di opzioni SOAP come accettate dal SOAP server Zend
);
//iniettare l'istanza del SOAP server Zend
$server->injectServerSOAP($zendSOAPServer);
//iniettare l'istanze della classe che gestisce le operazioni del webservice
$miaClassePerWebserviceRicezioneFatture = new MiaClassePerWebserviceRicezioneFatture;
$server->injectIstanzaGestoreWebservice($miaClassePerWebserviceRicezioneFatture);
//porre il server SOAP in ascolto
$server->listen();
通过客户端调用操作
//disabilitare la cache wsdl se si stanno utilizzando dei wsdl non ancora definitivi
ini_set("soap.wsdl_cache_enabled", "0");
//istanziare il client SOAP Zend
$zendSOAPClient = new Zend\Soap\Client;
//istanziare il client SOAP PHPCraft in base al webservice da chiamare, per esempio RicezioneFatture
$client = new $\PHPCraft\FatturazioneElettronica\ClientSOAP\RicezioneFatture();
//inietta il SOAP client Zend
$client->injectClientSOAP($zendSOAPClient);
//impostare location SE diversa da quella ufficiale contenuta nei wsdl, per esempio se si stanno testando i webservice sul proprio dominio
$client->setLocation('https://fatturazione-elettronica.mio.dominio/nome-webservice');
//preparare i parametri in input a seconda dell'operazione del webservice che si desidera chiamare, verificandoli nelle interfacce disponibili in \PHPCraft\FatturazioneElettronica\ServerSOAP\InterfacceWebservice, per esempio per RicezioneFatture -> RiceviFatture
$fileFattura = base64_encode(file_get_contents('percorso/alla/fattura.xml'));
$fileMetadati = base64_encode(file_get_contents('percorso/al/file/metadati.xml'));
$fileSdIConMetadati = new \PHPCraft\FatturazioneElettronica\TipiDati\FileSdIConMetadati(
123, //identificatiovo bumerico file
'nome del file',
$fileFattura,
'nome del file metadati',
$fileMetadati
);
//la classe del client espone i metodi con i nomi delle operazioni (in questo caso RiceviFatture)
$return = $client->RiceviFatture($fileSdIConMetadati);
证书
涉及加密文件的文档概述(密钥、证书请求、证书);代码块包含使用的openssl命令,斜体字来自文档和SdI提供的消息
-
客户端私钥和公钥:client-private-public.pem
openssl genrsa –out client-private-public.pem 2048
-
客户端公钥:client-public.pem
- 从私钥和公钥中提取
openssl rsa -in client-private-public.pem -out client-public.pem -outform PEM -pubout
-
客户端CSR:client.csr
openssl req -new -key client-private-public.pem -out client.csr
- 对于客户端CSR,需要确保在请求的"cn"(通用名)中指明了订阅者的税号,前面加上'SDI-'(SDI-03084840168)
-
服务器私钥和公钥:server-private-public.pem
openssl genrsa –out server-private-public.pem 2048
-
客户端CSR:client.csr
openssl req -new -key server-private-public.pem -out server.csr
- 对于CSR服务器,可以选择按照CSR客户端的方式处理,或者将服务器托管服务的hostname插入到“cn”中(已插入hostname)。
-
与CSR相关的证书:可以从https://sdi.fatturapa.gov.it在“工具”>“管理渠道”>“测试互操作性”>“下载文件”中下载,发送pec请求后(发送的RichiestaAccreditamento.zip.p7m请求已数字签名)
- 根据在认证阶段发送的CSR,为配置SSL环境所需的证书
- 客户端证书:SDI-[CSR客户端中插入的税号].cer
- 服务器证书:[CSR服务器中插入的CN字段值].cer
-
测试套件:可以从https://sdi.fatturapa.gov.it在“工具”>“管理渠道”>“测试互操作性”>“下载文件”中下载,发送pec请求后(发送的RichiestaAccreditamento.zip.p7m请求已数字签名)
- CA(认证机构)证书:
- caentrate.cer:生产环境的CA证书
- CAEntratetest.cer:用于验证SdI测试证书的CA证书
- 测试证书:
- testservizi.fatturapa.it.cer:系统交换测试服务的SERVER证书
- SistemaInterscambioFatturaPATest.cer:系统交换用于调用您提供的测试服务的CLIENT证书的公钥部分
- 生产证书:
- servizi.fatturapa.it.cer:系统交换服务的SERVER证书
- SistemaInterscambioFatturaPA.cer:系统交换用于调用您提供服务的CLIENT证书的公钥部分
- CA(认证机构)证书: