Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

di il
91 risposte

Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

Ho da realizzare una chiamata SOAP verso il WebService della carta del docente nella documentazione la richiesta l'esempio per Check e Confirm sarebbero la seguenti.
Check request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ver="http://bonus.miur.it/VerificaVoucher/">
    <soapenv:Header/> 
        <soapenv:Body> 
          <ver:CheckRequestObj> 
          <checkReq>
           <tipoOperazione>1</tipoOperazione> 
           <codiceVoucher>FRyVVKwx</codiceVoucher> 
      </checkReq> 
 </ver:CheckRequestObj> 
 </soapenv:Body>
 </soapenv:Envelope>
Confirm request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ver="http://bonus.miur.it/VerificaVoucher/">
	  <soapenv:Header/>
               <soapenv:Body> 
                   <ver:ConfirmRequestObj> 
                      <checkReq> 
                             <tipoOperazione>1</tipoOperazione>
                             <codiceVoucher>2a75f266</codiceVoucher> 
                             <importo>30.20</importo> 
                       </checkReq> 
                 </ver:ConfirmRequestObj> 
             </soapenv:Body> 
 </soapenv:Envelope>
Attualmente effettuo delle prove di richiesta Check da uno script PHP seguente:

<?php

		$wsdl           = dirname(__FILE__) .'/VerificaVoucher.wsdl';
		$endpoint       = 'https://ws.cartadeldocente.istruzione.it/VerificaVoucherDocWEB/VerificaVoucher';
		$certificate    = dirname(__FILE__) .'/php_soap_cert.pem';
		$password       = 'miapassword';
     
		$options = array(
			'location'      => $endpoint,
			'local_cert'    => $certificate,
			'passphrase'    => $password
		);

 			try {
			$client = new SoapClient($wsdl, $options);
			$data = array('checkReq' => array('tipoOperazione' => '1','codiceVoucher' => 'H7LXL7QI'));
			$result = $client->Check($data);
            
 
		} catch(Exception $e) {
			var_dump($e);
		} 
 
	var_dump($result);
   
    
?>
Ho converto il certificato p12 in PEM con il comando:
openssl pkcs12 -in nome_certificato.p12 -out php_certificato.pem -clcerts

Eseguendo lo script però ottengo le notifiche d’errore dal blocco try-catch:

object(SoapFault)#4 (10) { ["message":protected]=> string(45) "it.finanze.verificavoucher.fault.FaultVoucher" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(57) "/var/www/vhosts/sale.ibiscusedizioni.eu/httpdocs/test.php" ["line":protected]=> int(23) ["trace":"Exception":private]=> array(2) { [0]=> array(6) { ["file"]=> string(57) "/var/www/vhosts/sale.ibiscusedizioni.eu/httpdocs/test.php" ["line"]=> int(23) ["function"]=> string(6) "__call" ["class"]=> string(10) "SoapClient" ["type"]=> string(2) "->" ["args"]=> array(2) { [0]=> string(5) "Check" [1]=> array(1) { [0]=> array(1) { ["checkReq"]=> array(2) { ["tipoOperazione"]=> string(1) "1" ["codiceVoucher"]=> string(8) "H7LXL7QI" } } } } } [1]=> array(6) { ["file"]=> string(57) "/var/www/vhosts/sale.ibiscusedizioni.eu/httpdocs/test.php" ["line"]=> int(23) ["function"]=> string(5) "Check" ["class"]=> string(10) "SoapClient" ["type"]=> string(2) "->" ["args"]=> array(1) { [0]=> array(1) { ["checkReq"]=> array(2) { ["tipoOperazione"]=> string(1) "1" ["codiceVoucher"]=> string(8) "H7LXL7QI" } } } } } ["previous":"Exception":private]=> NULL ["faultstring"]=> string(45) "it.finanze.verificavoucher.fault.FaultVoucher" ["faultcode"]=> string(14) "soapenv:Server" ["detail"]=> object(stdClass)#2 (1) { ["FaultVoucher"]=> object(stdClass)#3 (2) { ["exceptionCode"]=> string(2) "02" ["exceptionMessage"]=> string(98) "Il buono richiesto non risulta disponibile sul sistema. Potrebbe essere stato riscosso o annullato" } } } 
Dove sbaglio?

91 Risposte

  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Secondo me non sbagli...

    credo che il webservice soap del ministero lavori come segue:
    per la "check request" se il voucher esiste restituisce un oggetto tipo questo:
    object(stdClass)[2]
     public 'checkResp' =>
       object(stdClass)[3]
         public 'nominativoBeneficiario' => string 'AAABBB10C10C111D (length=22)
         public 'partitaIvaEsercente' => string 'PIVAEsercente' (length=11)
         public 'ambito' => string 'Libri di testo' (length=1)
         public 'bene' => string 'Dizionari' (length=1)
         public 'importo' => float 0
    
    mentre non è prevista una risposta se il voucher non esiste... ma viene restituito l'errore nell'oggetto SoapFault:
    
    object(SoapFault)[4]
      ....
      public 'detail' => 
        object(stdClass)[2]
          public 'FaultVoucher' => 
            object(stdClass)[3]
              public 'exceptionCode' => string '02' (length=2)
              public 'exceptionMessage' => string 'Il buono richiesto non risulta disponibile sul sistema. Potrebbe essere stato riscosso o annullato' 		(length=98)
    
    Quindi direi che il metodo corretto è gestire la chiamata nel try... catch in modo da ottenere entrambi i risultati.. il codice che avevo postato nell'altra discussione (che poi è quello che sto usando io) dovrebbe fare esattamente questo...

    P.S: io sono in attesa di avere qualche voucher "reale" per fare dei test.... visto che dall'assistenza.. come apiamente detto non hanno idea di come sia fatto il loro sistema...
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    4c3 ha scritto:


    Quindi direi che il metodo corretto è gestire la chiamata nel try... catch in modo da ottenere
    Ho qualche dubbio in quanto comunque se il buono non fosse valido dovrei comunque recuperare il codice di errore. Se mi risponde con object(SoapFault) non so come recuperare il dato.

    Sarebbe utile se rispondesse endpoind di test, ma anche con un certificato che mi hanno girato loro, nulla da fare.
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Guarda.. ho appena finito di testare la classe che fa la chiamata..

    l'errore lo recuperi nell'oggetto FaultVoucher:
    
            $client = new SoapClient($wsdl, $soapOpt);
            try {
                $item = $client->Check(array("checkReq"=>array("tipoOperazione"=>"1","codiceVoucher"=>$id)));
                /* here's item structure 
                $item->checkResp->nominativoBeneficiario;
                $item->checkResp->partitaIvaEsercente;
                $item->checkResp->ambito;
                $item->checkResp->bene;
                $item->checkResp->importo;
                */
                return $item;
            } catch (\SoapFault $s) {
                $err = new STDClass();
                $err->exceptionCode = $s->detail->FaultVoucher->exceptionCode;
                $err->exceptionMessage= $s->detail->FaultVoucher->exceptionMessage;
                /* here's err structure
    		$err->exceptionCode
                	$err->exceptionMessage
                */	
                return $err;
            }
    
    il risultato l'oggetto item (se la chiamata è ok) o err (se la chiamata fallisce)
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Sarebbe utile se rispondesse endpoind di test, ma anche con un certificato che mi hanno girato loro, nulla da fare.
    Ti hanno girato un certificato? io non riesco a parlare con uno che ne sappia...
    E' un certificato fatto apposta per il tuo cliente o è generico?
    Nel caso fosse generico.. se ti giro la mia mail in privato me lo mandi così riesco a fare qualche prova???
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    4c3 ha scritto:


    Sarebbe utile se rispondesse endpoind di test, ma anche con un certificato che mi hanno girato loro, nulla da fare.
    Ti hanno girato un certificato? io non riesco a parlare con uno che ne sappia...
    E' un certificato fatto apposta per il tuo cliente o è generico?
    Nel caso fosse generico.. se ti giro la mia mail in privato me lo mandi così riesco a fare qualche prova???
    Comico dover prendere i dati dalla notifica d'errore

    Poi da quello che intuisco una volta recuperato se il buono e valido e relativo importo si dovrà inviare una richiesta confirm per incassare il buono.

    È un certificato generico per l'ambiente di test, ma con esso non accedo comunque all'endpoind di test
    L'ho messo momentaneamente qui su dropbox così puoi scaricarlo.
    https://www.dropbox.com/s/ugze21460h1v2wj/AAAAAA00H01H501P.zip?dl=0
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Salve ad entrambi,

    io ho l'incombenza, di integrare nel sito della mia azienda il pagamento online tramite il buono della carta del docente, quindi seguo volentieri e con attenzione questa discussione.
    Premetto che non sono pratico di SOAP e affini, ma causa forza maggiore lo sto diventando, quindi chiedo perdono se scrivo qualche corbelleria.

    Ho contattato l'assistenza Sogei, mi hanno fornito una password e un certificato di test e anche il mio certificato ha lo stesso nome AAAAAA00H01H501P.P12, quindi capisco che il certificato di test è unico e comune a tutti, per la password non so, ma penso anche quella sia comune a tutti.

    Analizzando il codice PHP di lorismod, la prima cosa che mi viene in mente è che potrebbe essere che tu stia facendo le prove usando il certificato di test, ma stai usando l'endpoid reale e non quello di test che è https://wstest.cartadeldocente.istruzione.it/VerificaVoucherDocWEB/VerificaVoucher e da questo potrebbe dipendere l'oggetto SoapFault restitutito sempre dal webserver, oppure che tu non stia usando la password di test.

    Sono felice di collaborare a questa discussione e se posso essere utile, perché questa discussione mi è stata più utile di tutte le ricerche che negli ultimi giorni ho fatto sul web e di tutte le aziende che ho interpellato fino ad adesso.
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Io sono felice di sapere che sono 2 mesi che contatto l'assistenza e non mi danno risposte se non "sollecito un ticket"... ma che numero chiamate voi?

    Ricapitolo brevemente la strada verso l'uso dell'ambiente di test (che ho appena fatto funzionare..)

    Si prende il certificato (gentilmente passato da lorismod) e si esegue in una shell linux:
    openssl pkcs12 -in AAAAAA00H01H501P.P12 -out AAAAAA00H01H501P.pem -clcerts
    Chiederà prima la password che SOGEI ha dato del certificato e poi una passphrase per il PEM (a scelta)

    Poi la chiamata soap va fatta come segue:
    
    function  getVocher($id){
    	$soapOpt = array('local_cert'=>'AAAAAA00H01H501P.pem',
    					 'location'=>'testServiceUrl,
    					 'stream_context'=> stream_context_create(array('ssl'=> array(
    							'verify_peer'=>false,
    							'verify_peer_name'=>false,
    							'allow_self_signed' => true 
    					 ))),
    					 'passphrase'=>'pemPassphrase');
    	$client = new SoapClient($wsdl, $soapOpt);
    	try {
    		$item = $client->Check(array("checkReq"=>array("tipoOperazione"=>"1","codiceVoucher"=>$id)));
    		$resp->beneficiario = $item->checkResp->nominativoBeneficiario;
    		$resp->pivaEsercente = $item->checkResp->partitaIvaEsercente;
    		$resp->ambito = $item->checkResp->ambito;
    		$resp->bene = $item->checkResp->bene;
    		$resp->importo = $item->checkResp->importo;
    	} catch (Exception $s) {
    		if ($s->detail){
    			$resp->esito->code($s->detail->FaultVoucher->exceptionCode);
    			$resp->esito->message($s->detail->FaultVoucher->exceptionMessage);
    		} else {
    			$resp->esito->code($s->faultcode);
    			$resp->esito->message($s->faultstring);
    		}
    	}	
    	return $resp;
    }	
    
    La parte di chiamata
    					 'stream_context'=> stream_context_create(array('ssl'=> array(
    							'verify_peer'=>false,
    							'verify_peer_name'=>false,
    							'allow_self_signed' => true 
    					 ))),
    
    non va riportata in produzione perchè l'ambiente di test ha un certificato non valido

    Ringrazio l'assistenza SOGEI per essere stata esaustiva nel risolvere prontamente le mie richieste di assistenza

    Seriamente.... Vi ringazio per la collaborazione non sarei riuscito a venirne fuori da solo!
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Anche io ho contattato telefonicamente l'assistenza senza avere successo, finché non è stata proprio l'assistenza Sogei a contattare la mia azienda per dirci che non siamo in regola sul nostro sito, dato che non facciamo la convalida online dei buoni, ma dai clienti in fase di acquisto ci facciamo dare il coupon per lo store fisico che poi validiamo manualmente, questa è stata la soluzione tampone che abbiamo adottato per poter vendere online.
    Ho chiesto loro un recapito telefonico e non me lo hanno voluto dare, mi hanno dato solo la mail (che ho scritto in un messaggio privato a 4c3, lorismod avendo già avuto il certificato penso ne sia già in possesso, se non fosse così sono a disposizione, non l'ho voluta scrivere qui per evitare qualsiasi problema), devo però dire che per mail sono abbastanza funzionali, almeno rispondono.
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Io sono riuscito a chiudere il progetto... ora attendo solo di fare un giro completo "ufficiale" e poi posso rilasciare il servizio....
    tutto grazie a questa discussione...

    Ci facciamo girare da sogei una percentuale per fare assistenza?
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    4c3 ha scritto:



    La parte di chiamata
    					 'stream_context'=> stream_context_create(array('ssl'=> array(
    							'verify_peer'=>false,
    							'verify_peer_name'=>false,
    							'allow_self_signed' => true 
    					 ))),
    
    Seriamente.... Vi ringazio per la collaborazione non sarei riuscito a venirne fuori da solo!
    Grazie pure a te, poi faccio delle prove, l'unica differenza è che quando chiamavo l'ambiente di test non includevo questa parte, anche perché non conoscendo a livello pratico le chiamate SOAP non c'avrei mai pensato
    Poi faccio delle prove e mi metto a sviluppare il modulo prestashoop.
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Con quella modifica per il certificato non valido accedo pure io all'area di test.
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Ciao ragazzi,
    ho usato i vostri script PHP per attivare i voucher 18app
    Riesco a fare la login al sistema ma al momento di fare il check dei voucher la risposta è sempre questa:
    object(SoapFault)#2 (9) {
      ["message":protected]=>
      string(14) "Internal Error"
      ["string":"Exception":private]=>
      string(0) ""
      ["code":protected]=>
      int(0)
      ["file":protected]=>
      string(26) "/volume1/web/18app/CK2.php"
      ["line":protected]=>
      int(16)
      ["trace":"Exception":private]=>
      array(1) {
        [0]=>
        array(6) {
          ["file"]=>
          string(26) "/volume1/web/18app/CK2.php"
          ["line"]=>
          int(16)
          ["function"]=>
          string(6) "__call"
          ["class"]=>
          string(10) "SoapClient"
          ["type"]=>
          string(2) "->"
          ["args"]=>
          array(2) {
            [0]=>
            string(5) "Check"
            [1]=>
            array(1) {
              [0]=>
              array(1) {
                ["checkReq"]=>
                array(3) {
                  ["tipoOperazione"]=>
                  string(1) "1"
                  ["codiceVoucher"]=>
                  string(8) "11aa22bb"
                  ["partitaIvaEsercente"]=>
                  string(11) "XXXXXXXXXXX"
                }
              }
            }
          }
        }
      }
      ["previous":"Exception":private]=>
      NULL
      ["faultstring"]=>
      string(14) "Internal Error"
      ["faultcode"]=>
      string(10) "env:Client"
    }
    NULL
    Avete idea di dove possa essere il problema?
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    aldone ha scritto:


    Ciao ragazzi,
    ho usato i vostri script PHP per attivare i voucher 18app
    Riesco a fare la login al sistema ma al momento di fare il check dei voucher...
    Cosa intendi per login?
    Con il certificato a bordo del server che fa la chiamata non é necessario fare login.. Fai direttamente il check indicando il nome del certificato nell'header della chiamata..

    Puoi postare il codice che usi? Così ci guardiamo
  • Re: Errore Client SOAP Request/Response in PHP (Carta del Docente e 18app)

    Si intendevo che a certificati sembra tutto ok
    Ecco il codice:
    <?php
       $wsdl = "VerificaVoucher18.wsdl";
       $options = [
            'location'      => "https://ws.18app.italia.it/VerificaVoucherWEB/VerificaVoucher",
            'local_cert'    => "./php_soap_cert.pem",
            'passphrase'    => "xxxxxxxx",
    	];
    	
        $soapClient = new SoapClient($wsdl, $options);
    
    	//var_dump($soapClient->__getFunctions());
    	try {
            $result = $soapClient->Check(array("checkReq"=>array("tipoOperazione"=>"1","codiceVoucher"=>"11aa22bb","partitaIvaEsercente"=>"XXXXXXXXXX")));
        } catch(Exception $e) {
            var_dump($e);
        }
    
        var_dump($result);   
    ?>
    Con lo stesso codice sono riuscito a fare la prima richiesta e ad attivare l'esercente su carta del docente, mentre su 18app ho sempre l'errore env:Client postato sopra
Devi accedere o registrarti per scrivere nel forum
91 risposte