2013-07-19 14 views
7

sto accede a un webservice usando SOAP e PHP. Posso collegarmi a una serie di funzioni tramite l'API del servizio web. Ma uno mi sfugge. Ho un esempio ma è in C#.Convert C# per PHP

ho cercato di emulare l'esempio in PHP senza fortuna.

Ho allegato il codice C# e il mio tentativo in PHP. Anche il messaggio di errore è incluso.

codice C#

public void MakeSale() 
{ 
    string yourKey = "your key"; 
    using(DdDSaleService.SaleServiceClient client = new SaleServiceClient()) 
    { 
     Sale sale = client.StartSale(); 
     //header info 
     sale.ClientNumber = 996001; 
     sale.Date = DateTime.Now; 
     sale.Employee = 1; 
     sale.NoteID = 123; 
     sale.Terminal = 1; 
     sale.Type = SaleType.Sale; 

     //items in basket. 
     ItemLine line1 = new ItemLine(); 
     line1.Type = ItemLineType.Sale; 
     line1.ItemGroup = 1; 
     line1.Supplier = 1; 
     line1.Qty = 3; //should -3 if a return of goods. 
     line1.LineAmount = 600; //The normal amount of the goods. 
     line1.EDBNumber = 1; //unique key in our system. You have this if you got the articles by our service. 
     line1.DiscountAmount = -100; //the discount. 

     //line2 comes here.... 

     //add the lines to the sale 
     sale.ItemLines = new ItemLine[] { line1 }; 

     //The payment lines 
     //1 with cash, and one with the change. the sale MUST sum to zero (itemlines + paymentlines) 
     PaymentLine cash = new PaymentLine(); 
     cash.Type = PaymentLineType.Cash; 
     cash.Qty = 1; 
     cash.LineAmount = 600; 

     PaymentLine change = new PaymentLine(); 
     change.Type = PaymentLineType.Change; 
     change.Qty = 1; 
     change.LineAmount = -100; 

     //add the paymentlines 
     sale.PaymentLines = new PaymentLine[]{cash,change}; 

     //submit the sale. 
     Status response = client.SaveSale(sale, yourKey); 
     Console.WriteLine(string.Format("got response from save sale saved: {0}, message: {1}",response.Saved,response.Message)); 
     Console.ReadLine(); 
    } 
} 

codice PHP

$client = new SoapClient("http://xxx.xxxxx.xxxx/xxxxxxx.svc?wsdl", array("trace" => 1, "connection_timeout" => 500)); 

// Initialize sale 
// $client is a valid SOAP connection 
// That has been setup earlier 
$Sale = $client->StartSale(); 

// Output what initalize sale returns 
print_r($Sale); 

// Format order date/time 
$timezone = new DateTimeZone("Europe/Copenhagen"); 
$date = new DateTime("now", $timezone); 
$order_date_time = $date->format("Y-m-d\TH:i:s"); 

// Set header information 
$Sale->StartSaleResult->ClientNumber = 996001; 
$Sale->StartSaleResult->Date = $order_date_time; 
$Sale->StartSaleResult->Employee = 1; 
$Sale->StartSaleResult->NoteID = 123; 
$Sale->StartSaleResult->Terminal = 1; 
$Sale->StartSaleResult->Type = 'Sale'; 

// Itemline 
$line = new stdClass(); 
$line->Type = 'Sale'; 
$line->ItemGroup = 1; 
$line->Supplier = 1; 
$line->Qty = 3; 
$line->LineAmount = 600; 
$line->EDBNumber = 1; 
$line->DiscountAmount = 1-100; 
$Sale->StartSaleResult->ItemLines->ItemLine[] = $line; 

// Payment line, cash 
$cash = new stdClass(); 
$cash->Type = 'Cash'; 
$cash->Qty = 1; 
$cash->LineAmount = 600; 
$Sale->StartSaleResult->PaymentLines->PaymentLine[] = $cash; 

// Payment line, Change 
$change = new stdClass(); 
$change->Type = 'Change'; 
$change->Qty = 1; 
$change->LineAmount = -100; 
$Sale->StartSaleResult->PaymentLines->PaymentLine[] = $change; 

// Save sale 
$response = $client->SaveSale($Sale->StartSaleResult, 'xxxxxxxx'); 

print_r($response); 

Uscita cosa webservice restituisce quando si collega

print_r($Sale); 

stdClass Object 
(
    [ClientNumber] => 0 
    [Date] => 0001-01-01T00:00:00 
    [Employee] => 0 
    [ItemLines] => stdClass Object 
     (
     ) 

    [NoteID] => 0 
    [PaymentLines] => stdClass Object 
     (
     ) 

    [Terminal] => 0 
    [Type] => Sale 
) 

Messaggio di errore

[previous:Exception:private] => 
    [faultstring] => End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 149. 
    [faultcode] => a:InternalServiceFault 
    [detail] => stdClass Object 
     (
      [ExceptionDetail] => stdClass Object 
       (
        [HelpLink] => 
        [InnerException] => 
        [Message] => End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 149. 
        [StackTrace] => at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3) 
    at System.Xml.XmlExceptionHelper.ThrowEndElementExpected(XmlDictionaryReader reader, String localName, String ns) 
    at System.Xml.XmlBaseReader.ReadEndElement() 
    at System.ServiceModel.Channels.Message.ReadFromBodyContentsToEnd(XmlDictionaryReader reader, EnvelopeVersion envelopeVersion) 
    at System.ServiceModel.Channels.Message.ReadFromBodyContentsToEnd(XmlDictionaryReader reader) 
    at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest) 
    at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 
        [Type] => System.Xml.XmlException 
       ) 

     ) 
+1

cos'è $ client? – DevZer0

+0

Connessione al servizio web utilizzando SOAP. Ho modificato la mia domanda per ogni evenienza. – Cudos

risposta

9

gli array non guardare a destra. ItemLines e PaymentLines dovrebbero essere matrici invece di un oggetto contenente un array.

Anche se StartSale li restituisce come oggetti, devono comunque essere una matrice per la chiamata a SaveSale. Il motivo per cui vengono restituiti come oggetti è una stranezza del PHP SoapClient. Quello che succede è che se c'è solo un elemento nella matrice, SoapClient ti dà un oggetto con le sue proprietà impostate come proprietà di un singolo elemento. Tuttavia, se c'è più di un elemento nella matrice, si ottiene invece una matrice di oggetti, e quindi è un livello più profondo del risultato quando c'è solo un singolo elemento. Quindi, poiché vengono restituiti senza elementi da StartSale, vengono assegnati come oggetti anziché come array vuoto.

... 
... 
$Sale->StartSaleResult->ItemLines = array($line); 

// Payment line, cash 
$cash = new stdClass(); 
$cash->Type = 'Cash'; 
$cash->Qty = 1; 
$cash->LineAmount = 600; 

// Payment line, Change 
$change = new stdClass(); 
$change->Type = 'Change'; 
$change->Qty = 1; 
$change->LineAmount = -100; 
$Sale->StartSaleResult->PaymentLines = array($cash, $change); 

Inoltre secondo ciò che il WSDL sembra, potrebbe essere necessario passare un array associativo come parametri, con i tasti come sale e key (secondo il WSDL), invece di passare due argomenti distinti:

$response = $client->SaveSale(array('sale' => $Sale->StartSaleResult, 'key' => 'xxxxxxxx')); 

Modificare sale e key in qualunque sia il WSDL che lo definisce.

+0

Fantastico! Funziono come un incantesimo, grazie un pacchetto! – Cudos

+0

Nessun problema .. :) – MrCode