2017-02-15 2 views
1

Я пытаюсь сделать мыльный звонок на сервер с минимальным количеством кода. Но у меня есть проблемы с проверкой подлинности (для этого вызова нет заголовков). Это код, который у меня есть:Несоответствие версии в PHP SOAP Call

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 
header('Content-Type: text/html; charset=utf-8'); 

$data = array('Username' => 'someusername', 'Userpass' => 'somepass'); 

try 
{ 
    $client = new SoapClient(null, array( 
     "location" => "http://relaxdays.plentymarkets-x1.com/plenty/api/soap/version115/?xml", 
     "uri" => "http://relaxdays.plentymarkets-x1.com/plenty/api/soap/version115/", 
     "trace" => true, 
     "soap_version" => SOAP_1_1, 
     "exceptions" => false 
    )); 
    $response = $client->__soapCall("PlentySoapRequest_GetAuthentificationToken", $data); 
} 

catch (Exception $e) 
{ 
    echo "Error!"; 
    echo $e -> getMessage(); 
    echo '<br/><br/>Last response:<button type="button" onclick="if(document.getElementById(\'spoiler1\').style.display==\'none\') {document.getElementById(\'spoiler1\') .style.display=\'\'}else{document.getElementById(\'spoiler1\') .style.display=\'none\'}">Show/Hide</button><div id="spoiler1" style="display:none; font-family:monospace;">'. htmlspecialchars($client->__getLastResponse()).'</div>'; 
} 

echo '<br/><br/>Last request:<button type="button" onclick="if(document.getElementById(\'spoiler2\').style.display==\'none\') {document.getElementById(\'spoiler2\') .style.display=\'\'}else{document.getElementById(\'spoiler2\') .style.display=\'none\'}">Show/Hide</button><div id="spoiler2" style="display:none; font-family:monospace;">'. htmlspecialchars($client->__getLastRequest()).'</div>'; 

echo '<br/><br/>Response:<button type="button" onclick="if(document.getElementById(\'spoiler3\').style.display==\'none\') {document.getElementById(\'spoiler3\') .style.display=\'\'}else{document.getElementById(\'spoiler3\') .style.display=\'none\'}">Show/Hide</button><div id="spoiler3" style="display:none; font-family:monospace;">'. htmlspecialchars($response).'</div>';  
?> 

Однако, независимо от того, что я пытаюсь, он, похоже, не работает. Дальше я пришел эта ошибка:

SoapFault exception: [VersionMismatch] Wrong Version in /var/www/htdocs/plentyimport/tester.php:18 
Stack trace: #0 /var/www/htdocs/plentyimport/tester.php(18): SoapClient->__soapCall('PlentySoapReque...', Array) #1 {main} 

Я уже пробовал использовать "soap_version" => SOAP_1_2 или переключение мыльный URL для разных версий, но ошибка просто не хочет уходить (например, /version112/.).

Любая помощь будет оценена по достоинству.

Большое спасибо

virhonestum

ответ

1

Вы должны пройти определение SOAP в качестве первого параметра, например:

$client = new SoapClient('http://relaxdays.plentymarkets-x1.com/plenty/api/soap/version115/?xml'); 

Я раздели другие аргументы, как те, которые не требуется для выполнения этой работы.

Вызов должен быть сделан на operation, в данном случае, как это:

$response = $client->__soapCall("GetAuthentificationToken", $data); 

, наконец, данные должны содержать структуру PlentySoapRequest_GetAuthentificationToken, как это:

$data = [ 
    'PlentySoapRequest_GetAuthentificationToken' => [ 
    'Username' => 'someusername', 
    'Userpass' => 'somepassword' 
    ] 
]; 

Примечание: Я «Не отправляйте это как полный ответ. Я не знаю SOAP и не могу объяснить, что было не так, и как я его исправил, только опубликовать это, чтобы помочь автору выйти из этого этапа.

+0

Хорошо, благодаря вашей помощи он теперь работает. Однако имя массива данных кажется несущественным, оно отлично работает с использованием моих исходных '$ data' и обертыванием' $ data' в методе '__soapCall' в другом' array() ' Так что большое вам спасибо !! – virhonestum

Смежные вопросы