Как правильно построить запрос 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://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>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?

2 ответа

Решение

"Есть ли более прямой подход, где я мог бы написать 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://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>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 emailvision (smartfocus, сейчас...), этот метод sendObject не нуждается в сгенерированном токене openApiConnection()

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

<?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 генерируются путем создания транзакционного сообщения, вы можете получить эту информацию в интерфейсе Campagn Commander

позаботьтесь о схеме ввода 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://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 = 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> не работает

Другие вопросы по тегам