簡體   English   中英

將C#轉換為PHP

[英]Convert C# to PHP

我正在使用SOAP和PHP訪問Web服務。 我可以通過webservice API連接到許多功能。 但有人躲過了我。 我有一個例子,但它在C#中。

我試圖在PHP中模擬這個例子沒有運氣。

我已經附加了C#代碼和我在PHP中的嘗試。 還包括錯誤消息。

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();
    }
}

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);

輸出連接時返回的webservice

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
)

錯誤信息

    [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
                )

        )

你的陣列看起來不對勁。 ItemLinesPaymentLines應該是數組而不是包含數組的對象。

即使StartSale將它們作為對象返回,它們仍然應該是一個用於調用SaveSale的數組。 它們作為對象返回的原因是PHP SoapClient的一個怪癖。 發生的情況是,如果數組中只有一個元素,SoapClient會為您提供一個對象,其屬性設置為單個元素屬性。 但是,如果數組中有多個元素,則會得到一個對象數組,因此當只有一個元素時,它會比結果更深一級。 因為它們返回時沒有來自StartSale元素,所以它們被賦予對象而不是空數組。

...
...
$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);

同樣取決於WSDL的外觀,您可能需要傳遞一個關聯數組作為參數,鍵作為salekey (根據WSDL),而不是傳遞兩個單獨的參數:

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

salekey更改為WSDL定義的任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM