2016-02-10 14 views
5

Abbiamo avuto alcuni problemi con la creazione di un client SOAP PHP per utilizzare l'API di Royal Mail Tracking. Abbiamo un account tutto configurato con Royal Mail e abbiamo i nostri ID e segreti. Possiamo farlo funzionare con SOAPUI ma riceviamo sempre un errore "Wrong Version" quando proviamo ad implementarlo in PHP. Abbiamo il file WSDL localmente (che Royal Mail ha fornito tramite il loro portale per sviluppatori) funziona con SOAPUI ma non con PHP SOAP Client. Speravamo che qualcuno potesse vedere se stiamo facendo qualcosa di sbagliato. Pubblicherò il codice qui sotto ma ometterò il nostro segreto e ID dal codice.API di tracciamento PHP e Royal Mail

<?php 
ini_set('soap.wsdl_cache_enabled', 0); 
ini_set('soap.wsdl_cache_ttl', 900); 
ini_set('default_socket_timeout', 15); 

$trackingNumber = 'F111111111JD'; 
$time = gmdate('Y-m-d\TH:i:s'); 

$intHeaders = [ 
    'dateTime' => $time, 
    'version' => '1.0', 
    'identification' => [ 
     'applicationId' => '***********', 
     'transactionId' => 123456 
    ] 
]; 

$wsdl = 'WSDL/Tracking_API_V1_1_1.wsdl'; 

$options = array(
    'uri'=>'http://schemas.xmlsoap.org/soap/envelope/', 
    'style'=>SOAP_RPC, 
    'use'=>SOAP_ENCODED, 
    'soap_version'=>SOAP_1_2, 
    'cache_wsdl'=>WSDL_CACHE_NONE, 
    'connection_timeout'=>15, 
    'trace'=>true, 
    'encoding'=>'UTF-8', 
    'exceptions'=>true, 
    'stream_context' => stream_context_create([ 
     "http" => [ 
      'Accept' => 'application/soap+xml', 
      'X-IBM-Client-Secret' => '****', 
      'X-IBM-Client-Id'=> '****' 
     ] 
    ]) 
); 
try { 
    $soap = new SoapClient($wsdl, $options); 
    $data = $soap->getSingleItemHistory(['integrationHeader' => $intHeaders, 'trackingNumber' => $trackingNumber]); 
} 
catch(Exception $e) { 
    die($e->getMessage()); 
} 

var_dump($data); 
die; 

Abbiamo provato utilizzando SOAP_1_1 e SOAP_1_2 per il 'soap_version' ma torna sempre con l'errore "versione sbagliata".

Spero che qualcuno sia in grado di aiutare.

risposta

7

È necessario impostare la chiave header all'interno della matrice http in questo modo:

'stream_context' => stream_context_create(
    [ 
     'http' => 
      [ 
       'header'   => implode(
        "\r\n", 
        [ 
         'Accept: application/soap+xml', 
         'X-IBM-Client-Id: ' . $clientId, 
         'X-IBM-Client-Secret: ' . $clientSecret, 
        ] 
       ), 
      ], 
    ] 
) 
+0

Grazie mille. Questo ha funzionato per noi. Ci scusiamo per il ritardo nella risposta alla tua risposta dato che sono stato via e nessun accesso al sito. – Flyingearl

+0

@alexbibie, risparmi la mia giornata. Ho sbattuto la testa per 2 giorni in uno scenario simile in una delle API della banca che sto implementando. – Anon30