[英]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
)
)
你的陣列看起來不對勁。 ItemLines
和PaymentLines
應該是數組而不是包含數組的對象。
即使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的外觀,您可能需要傳遞一個關聯數組作為參數,鍵作為sale
和key
(根據WSDL),而不是傳遞兩個單獨的參數:
$response = $client->SaveSale(array('sale' => $Sale->StartSaleResult, 'key' => 'xxxxxxxx'));
將sale
和key
更改為WSDL定義的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.