Как создать правильный SOAP-запрос с помощью PHP

Мне нужно отформатировать / построить запрос для этого SOAP-сервиса: http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl

В идеале я хотел бы использовать собственный PHP SOAP-класс, но я начинаю задаваться вопросом, не является ли этот класс причиной моих проблем.

В этом руководстве приведен пример:

<soapenv:Body> <api:sendObject> <arg0> <content> <entry> <key>1</key> <value> <![CDATA[ <table width="600"> <tr> <td> <font size="2" face="Arial">Our powerful algorithms already found a matching profile that matches your criteria: <br>Celina72&nbsp;</font> <img src="http://img.ruphp.com/php/image.gif" width="50" height="50" border="0" /> </td>]]></value> </entry> </content> <dyn> <entry> <key>FIRSTNAME</key> <value>john</value> </entry> </dyn> <email>johnblum@flowerpower.com</email> <encrypt>BdX7CqkmjSivyBgIcZoN4sPVLkx7FaXGiwsO</encrypt> <notificationId>6464</notificationId> <random>985A8B992601985A</random> <senddate>2008-12-12T00:00:00</senddate> <synchrotype>NOTHING</synchrotype> <uidkey>EMAIL</uidkey> </arg0> </api:sendObject> </soapenv:Body> </soapenv:Envelope> 

Вот мусор, который производит мой запрос PHP (из __getLastRequest ())

 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.nsapi.emailvision.com/" xmlns:ns2="http://xml.apache.org/xml-soap"> <SOAP-ENV:Body> <ns1:sendObject/> <param1>AAAAAAAAAAAAAAAAAAAAAAAAAAA</param1> <param2>123456789</param2> <param3>BBBBBBBBBBBB</param3> <param4>2013-09-09T00:00:00</param4> <param5>NOTHING</param5> <param6>EMAIL</param6> <param7> <ns2:Map> <item> <key>2</key> <value>TEST</value> </item> </ns2:Map> </param7> <param8> <ns2:Map> <item> <key>FIRSTNAME</key> <value>John</value> </item> </ns2:Map> <ns2:Map> <item> <key>LASTNAME</key> <value>Smith</value> </item> </ns2:Map> </param8> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Мой вызов:

 $client = new SoapClient('http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl', array( 'trace' => 1, 'exceptions' => 0 ) ); 

Параметры выглядят так (измененные с помощью фиктивных данных):

 $email = 'john.smith@example.com'; $encrypt = 'AAAAAAAAAAAAAAAAAAAAAAAAAAA'; $notification_id = 123456789; $random = 'BBBBBBBBBBBB'; $senddate = '2013-09-09T00:00:00'; $synchrotype = 'NOTHING'; $uidkey = 'EMAIL'; $content = array(); $content[] = array( 2 => 'TEST' ); $dyn = array(); $dyn[] = array( 'FIRSTNAME' => 'John' ); $dyn[] = array( 'LASTNAME' => 'Smith' ); $params = array( 'email' => $email, 'encrypt' => $encrypt, 'notificationId' => $notification_id, 'random' => $random, 'senddate' => $senddate, 'synchrotype' => $synchrotype, 'uidkey' => $uidkey, 'content' => $content, 'dyn' => $dyn ); 

Затем я выполняю запрос следующим образом:

 $res = $client->__soapCall( 'sendObject', array( $email, $encrypt, $notification_id, $random, $senddate, $synchrotype, $uidkey, $content, $dyn ) ); 

Почему PHP не может правильно отформатировать мой запрос? Есть ли прямой подход, когда я могу написать XML «вручную», а затем опубликовать его с помощью cURL?

«Есть ли более прямой подход, когда я мог бы написать XML?»

Используя SoapVar и задав параметр кодирования конструктора для XSD_ANYXML вы можете написать необработанный XML.

Должен быть способ, которым WSDL помогает создавать XML.

Вы можете попробовать что-то вроде этого:

 $wsdl = "http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl"; $client = new SoapClient($wsdl, array( 'soap_version' => SOAP_1_1, 'trace' => true, )); try { $xml = '<arg0> <content> <entry> <key>1</key> <value> <![CDATA[ <table width="600"> <tr> <td> <font size="2" face="Arial">Our powerful algorithms already found a matching profile that matches your criteria: <br>Celina72&nbsp;</font> <img src="http://img.ruphp.com/php/image.gif" width="50" height="50" border="0" /> </td>]]></value> </entry> </content> <dyn> <entry> <key>FIRSTNAME</key> <value>john</value> </entry> </dyn> <email>johnblum@flowerpower.com</email> <encrypt>BdX7CqkmjSivyBgIcZoN4sPVLkx7FaXGiwsO</encrypt> <notificationId>6464</notificationId> <random>985A8B992601985A</random> <senddate>2008-12-12T00:00:00</senddate> <synchrotype>NOTHING</synchrotype> <uidkey>EMAIL</uidkey> </arg0>'; $args = array(new SoapVar($xml, XSD_ANYXML)); $res = $client->__soapCall('sendObject', $args); return $res; } catch (SoapFault $e) { echo "Error: {$e}"; } echo "<hr>Last Request"; echo "<pre>", htmlspecialchars($client->__getLastRequest()), "</pre>"; 

Я знаю, что тема около 1 года, но я нахожу в ней хорошую информацию, которая дает мне очень хорошую помощь, и я, наконец, добился, чтобы она работала с методом php sendObject (), поэтому я надеюсь, что мой вклад поможет другие люди тоже …

сначала вызов sendObject () следующим образом: $ client -> __ soapCall, похоже, не работает вообще, вы должны называть его напрямую: $ client-> sendObject

в этом разделе, я думаю, что это использование API электронной почты (smartfocus, now …), этот метод sendObject не нуждается в сгенерированном токере openApiConnection ()

oki, теперь это код, чтобы заставить его работать

 <?php $email = 'johann.******@gmail.com'; $encrypt = '******************************'; $notification_id = '**************'; $random = '********************'; $senddate = '2013-09-09T00:00:00'; $synchrotype = 'NOTHING'; $uidkey = 'EMAIL'; $params = array( 'arg0' => array( 'content' => array( 1 => 'mon_test'), 'dyn' => array( 'FIRSTNAME' => 'yoyo'), 'email' => $email, 'encrypt' => $encrypt, 'notificationId' => $notification_id, 'random' => $random, 'senddate' => $senddate, 'synchrotype' => $synchrotype, 'uidkey' => $uidkey ) ); $client = new SoapClient('http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl', array( 'trace' => 1, 'exceptions' => 0 ) ); $res = $client->sendObject( $params ); echo "<br /><br /><br />"; echo "REQUEST 1 :" . htmlspecialchars($client->__getLastRequest()) . "<br />"; echo "RESPONSE 1 :" . htmlspecialchars($client->__getLastResponse()) . "<br /><br /><br />"; 

?>

вы должны знать, что $ encrypt, $ notification_id, $ random генерируются путем создания транзакционного сообщения, вы можете получить эту информацию в интерфейсе командира лагеря

позаботьтесь о схеме ввода xml, есть узел arg0, тогда вы должны сделать уровень arg0 в параметрах массива

чтобы он работал напрямую с xml:

 <?php $wsdl = "http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl"; $client = new SoapClient($wsdl, array( 'soap_version' => SOAP_1_1, 'trace' => true, )); try { $xml = ' <ns1:sendObject> <arg0> <content> <entry> <key>1</key> <value> <![CDATA[ <table width="600"> <tr> <td> <font size="2" face="Arial">Our powerful algorithms already found a matching profile that matches your criteria: <br>Celina72&nbsp;</font> <img src="http://img.ruphp.com/php/image.gif" width="50" height="50" border="0" /> </td>]]> </value> </entry> </content> <dyn> <entry> <key>FIRSTNAME</key> <value>john</value> </entry> </dyn> <email>johann*******@gmail.com</email> <encrypt>*********************</encrypt> <notificationId>**************</notificationId> <random>**********************</random> <senddate>2008-12-12T00:00:00</senddate> <synchrotype>NOTHING</synchrotype> <uidkey>EMAIL</uidkey> </arg0> </ns1:sendObject> '; $args = array(new SoapVar($xml, XSD_ANYXML)); $res = $client->__soapCall('sendObject', $args); //return $res; } catch (SoapFault $e) { echo "Error: {$e}"; } echo "<hr>Last Request"; echo "<pre>", htmlspecialchars($client->__getLastRequest()), "</pre>"; echo "<hr>Last Response"; echo "<pre>", htmlspecialchars($client->__getLastResponse()), "</pre>"; ?> 

важно записать первый узел следующим образом: <ns1:sendObject>

<api:sendObject> не работает