Я пытаюсь просто отправить RAW xml в webservice через PHP и SoapClient. Проблема в том, что когда я кодирую свой XML, он меняет порядок элементов в XML, который преобразуется в ассоциативный массив.
// Initialize the Soap Client: $this->_transactionServicesClient = new SoapClient($soapWSDLUrl);
Как или что было бы лучшим способом отправить следующий XML в виде строки в мой SoapClient?
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices"> <SOAP-ENV:Body> <ns1:PostTransaction> <ns1:REQ> <ns1:RequestHeader> <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion> <ns1:ClientName>TRANS_SERVICES</ns1:ClientName> </ns1:RequestHeader> <ns1:CheckDetailEntries> <ns1:MenuItem> <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry> <ns1:Count>1</ns1:Count> <ns1:Price>10.00</ns1:Price> <ns1:ItemNumber>112001</ns1:ItemNumber> <ns1:PriceLevel>1</ns1:PriceLevel> <ns1:Seat xsi:nil="true"/> </ns1:MenuItem> </ns1:CheckDetailEntries> <ns1:CheckHeaderRequest> <ns1:CheckId>03:21:05.050505</ns1:CheckId> <ns1:GuestCount>1</ns1:GuestCount> <ns1:GuestInformation> <ns1:ID>001</ns1:ID> <ns1:FirstName>xxx</ns1:FirstName> <ns1:LastName>xxx</ns1:LastName> <ns1:Address1>xxx Rd</ns1:Address1> <ns1:Address2>xx</ns1:Address2> <ns1:Address3>xx</ns1:Address3> <ns1:PhoneNum>xx</ns1:PhoneNum> <ns1:UserText1>None</ns1:UserText1> <ns1:UserText2>None</ns1:UserText2> <ns1:UserText3>None</ns1:UserText3> <ns1:GUID></ns1:GUID></ns1:GuestInformation> </ns1:CheckHeaderRequest> <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber> </ns1:REQ> </ns1:PostTransaction> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Уровень<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices"> <SOAP-ENV:Body> <ns1:PostTransaction> <ns1:REQ> <ns1:RequestHeader> <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion> <ns1:ClientName>TRANS_SERVICES</ns1:ClientName> </ns1:RequestHeader> <ns1:CheckDetailEntries> <ns1:MenuItem> <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry> <ns1:Count>1</ns1:Count> <ns1:Price>10.00</ns1:Price> <ns1:ItemNumber>112001</ns1:ItemNumber> <ns1:PriceLevel>1</ns1:PriceLevel> <ns1:Seat xsi:nil="true"/> </ns1:MenuItem> </ns1:CheckDetailEntries> <ns1:CheckHeaderRequest> <ns1:CheckId>03:21:05.050505</ns1:CheckId> <ns1:GuestCount>1</ns1:GuestCount> <ns1:GuestInformation> <ns1:ID>001</ns1:ID> <ns1:FirstName>xxx</ns1:FirstName> <ns1:LastName>xxx</ns1:LastName> <ns1:Address1>xxx Rd</ns1:Address1> <ns1:Address2>xx</ns1:Address2> <ns1:Address3>xx</ns1:Address3> <ns1:PhoneNum>xx</ns1:PhoneNum> <ns1:UserText1>None</ns1:UserText1> <ns1:UserText2>None</ns1:UserText2> <ns1:UserText3>None</ns1:UserText3> <ns1:GUID></ns1:GUID></ns1:GuestInformation> </ns1:CheckHeaderRequest> <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber> </ns1:REQ> </ns1:PostTransaction> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Уровень<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices"> <SOAP-ENV:Body> <ns1:PostTransaction> <ns1:REQ> <ns1:RequestHeader> <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion> <ns1:ClientName>TRANS_SERVICES</ns1:ClientName> </ns1:RequestHeader> <ns1:CheckDetailEntries> <ns1:MenuItem> <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry> <ns1:Count>1</ns1:Count> <ns1:Price>10.00</ns1:Price> <ns1:ItemNumber>112001</ns1:ItemNumber> <ns1:PriceLevel>1</ns1:PriceLevel> <ns1:Seat xsi:nil="true"/> </ns1:MenuItem> </ns1:CheckDetailEntries> <ns1:CheckHeaderRequest> <ns1:CheckId>03:21:05.050505</ns1:CheckId> <ns1:GuestCount>1</ns1:GuestCount> <ns1:GuestInformation> <ns1:ID>001</ns1:ID> <ns1:FirstName>xxx</ns1:FirstName> <ns1:LastName>xxx</ns1:LastName> <ns1:Address1>xxx Rd</ns1:Address1> <ns1:Address2>xx</ns1:Address2> <ns1:Address3>xx</ns1:Address3> <ns1:PhoneNum>xx</ns1:PhoneNum> <ns1:UserText1>None</ns1:UserText1> <ns1:UserText2>None</ns1:UserText2> <ns1:UserText3>None</ns1:UserText3> <ns1:GUID></ns1:GUID></ns1:GuestInformation> </ns1:CheckHeaderRequest> <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber> </ns1:REQ> </ns1:PostTransaction> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Обновление / Разрешение: вот код, который я использовал для расширения SOAP-клиента и отправки моего необработанного конверта Soap: Мой ответ ниже
Обновление / разрешение: Вот код, который я использовал для расширения SOAP-клиента и отправки моего необработанного конверта Soap
Вот как я расширил SoapClient:
<?php class MySoapClient extends SoapClient { function __construct($wsdl, $options) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); } public function __doRequest($request, $location, $action, $version) { $result = parent::__doRequest($request, $location, $action, $version); return $result; } function __myDoRequest($array,$op) { $request = $array; $location = 'http://xxxxx:xxxx/TransactionServices/TransactionServices6.asmx'; $action = 'http://www.micros.com/pos/les/TransactionServices/'.$op; $version = '1'; $result =$this->__doRequest($request, $location, $action, $version); return $result; } } // To invoke my new custom method with my Soap Envelope already prepared. $soapClient = new MySoapClient("http://xxxx:xxxx/TransactionServices/TransactionServices6.asmx?WSDL", array("trace" => 1)); $PostTransaction = $soapClient->__myDoRequest($orderRequest,$op); ?>
Также опубликовано на pastie.org: http://pastie.org/3687935, прежде чем я включил это в ответ.
Для целей тестирования вы можете подклассифицировать SoapClient и переопределить метод __doRequest – он получает сгенерированный XML, и вы можете его предварительно обработать.
Но лучше найти, что происходит с кодировкой XML. Вы можете использовать экземпляры SoapVar и SoapParam для указания точного способа представления данного объекта. Те, кто спасли мою жизнь, когда должны были быть указаны пространства имён