phpcraft/fatturazione-elettronica

意大利电子发票系统的连接接口

dev-master 2018-12-15 08:13 UTC

This package is auto-updated.

Last update: 2024-09-15 20:38:26 UTC


README

用于连接意大利交换系统以管理电子发票的库。

注意:该库正在开发中,目前不可用

注意:要实际连接SdI,必须是一个授权实体

Web服务

这个库旨在提供中间件发送和接收SdI电子发票所需的功能,即

  • 公开SOAP RicezioneFattureTrasmissioneFatture Web服务
  • 通过SOAP客户端连接到部长的 SdIRiceviFileSdIRiceviNotifica Web服务

为了在连接SdI之前进行测试,该库还提供相反的功能,即

  • 公开SOAP SdIRiceviFileSdIRiceviNotifica Web服务,以便可以通过库本身生成的SOAP客户端连接
  • 通过SOAP客户端连接到库本身公开的 RicezioneFattureTrasmissioneFatture Web服务

以下是完整Web服务和相关操作的方案

  • SdICoop接收服务
    • ws RicezioneFatture(由中间件公开)
      • op. RiceviFatture
      • op. NotificaDecorrenzaTermini
    • ws SdIRiceviNotifica(由SdI公开)
      • op. NotificaEsito
  • SdICoop传输服务
    • ws SdIRiceviFile(由SdI公开)
      • op. RiceviFile
    • ws TrasmissioneFatture(由中间件公开)
      • op. RicevutaConsegna
      • op. NotificaMancataConsegna
      • op. NotificaScarto
      • op. NotificaEsito
      • op. NotificaDecorrenzaTermini
      • op. AttestazioneTrasmissioneFattura
  • SDIDati服务
    • ws SdITrasmissioneFile
      • op. Trasmetti
      • op. Esito

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证书的公钥部分

SdI文档