Come creare una richiesta SOAP corretta con PHP

Ho bisogno di formattare / compilare una richiesta per questo "servizio" SOAP: http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl

Idealmente mi piacerebbe usare la class SOAP PHP nativa, ma sto cominciando a chiedermi se questa class non è la causa dei miei problemi.

Il manuale fornisce questo esempio:

<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://mypath/to/my/image.gif" width="50" height="50" border="0" /> </td>]]></value> </entry> </content> <dyn> <entry> <key>FIRSTNAME</key> <value>john</value> </entry> </dyn> <email>[email protected]</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> 

Ecco la spazzatura che produce la mia richiesta PHP (da __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> 

La mia chiamata:

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

I parametri sono simili a questo (modificati con dati fittizi):

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

Quindi eseguo la richiesta in questo modo:

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

Perché PHP non è in grado di formattare correttamente la mia richiesta? C'è un approccio più diretto where potrei scrivere l'XML "a mano" e poi postarlo usando cURL?

"Esiste un approccio più diretto in cui potrei scrivere l'XML?"

Usando un SoapVar e impostando il parametro encode del constructor su XSD_ANYXML è ansible scrivere l'XML raw.

Ci dovrebbe essere un modo in cui il WSDL aiuta a build l'XML però.

Potresti provare qualcosa come questo:

 $wsdl = "http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl"; $client = new SoapClient($wsdl, arrays( '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://mypath/to/my/image.gif" width="50" height="50" border="0" /> </td>]]></value> </entry> </content> <dyn> <entry> <key>FIRSTNAME</key> <value>john</value> </entry> </dyn> <email>[email protected]</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 = arrays(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>"; 

so che l'argomento è di circa 1 anno, ma trovo delle buone informazioni in esso, che mi danno un ottimo aiuto, e infine sono riuscito a farlo funzionare con il metodo php sendObject () quindi spero che il mio contributo possa aiutare anche altre persone …

all'inizio la chiamata di sendObject () in questo modo: $ client -> __ soapCall sembra non funzionare affatto devi chiamarlo direttamente: $ client-> sendObject

in questo argomento, penso che sia un uso dell'API di emailvision (smartfocus, ora …) questo metodo sendObject non ha bisogno di un token generato da openApiConnection ()

oki, ora è il codice per farlo funzionare

 <?php $email = 'johann.******@gmail.com'; $encrypt = '******************************'; $notification_id = '**************'; $random = '********************'; $senddate = '2013-09-09T00:00:00'; $synchrotype = 'NOTHING'; $uidkey = 'EMAIL'; $params = arrays( 'arg0' => arrays( 'content' => arrays( 1 => 'mon_test'), 'dyn' => arrays( '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', arrays( '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 />"; 

?>

devi sapere che $ encrypt, $ notification_id, $ random sono generati creando un messaggio transazionale, puoi get queste informazioni nell'interface di campagn commander

prendersi cura dello schema di input xml, c'è un nodo arg0, quindi devi fare un livello arg0 nei parametri dell'arrays

per farlo funzionare direttamente con xml:

 <?php $wsdl = "http://api.notificationmessaging.com/NMSOAP/NotificationService?wsdl"; $client = new SoapClient($wsdl, arrays( '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://mypath/to/my/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 = arrays(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>"; ?> 

è importnte scrivere il primo nodo in questo modo: <ns1:sendObject>

<api:sendObject> non funziona