У меня была та же проблема, когда я динамически добавлял параметры SOAP, и мне приходилось получать их в правильном порядке, чтобы мой вызов SOAP работал.
Поэтому мне пришлось написать что-то, что получит все методы SOAP из WSDL, а затем определит, в каком порядке упорядочить аргументы метода.
К счастью, PHP облегчает получение функций SOAP с помощью метода '$ client -> __ getFunctions ()', поэтому все, что вам нужно сделать, это найти метод сервиса, который вы хотите вызвать, который будет содержать аргументы метода в исправьте порядок, а затем выполните сопоставление некоторых массивов, чтобы получить массив параметров запроса в том же порядке.
Вот код ...
<?php
// Instantiate the soap client
$client = new SoapClient("http://localhost/magento/api/v2_soap?wsdl", array('trace'=>1));
$wsdlFunctions = $client->__getFunctions();
$wsdlFunction = '';
$requestParams = NULL;
$serviceMethod = 'catalogProductInfo';
$params = array('product'=>'ch124-555U', 'sessionId'=>'eeb7e00da7c413ceae069485e319daf5', 'somethingElse'=>'xxx');
// Search for the service method in the wsdl functions
foreach ($wsdlFunctions as $func) {
if (stripos($func, "{$serviceMethod}(") !== FALSE) {
$wsdlFunction = $func;
break;
}
}
// Now we need to get the order in which the params should be called
foreach ($params as $k=>$v) {
$match = strpos($wsdlFunction, "\${$k}");
if ($match !== FALSE) {
$requestParams[$k] = $match;
}
}
// Sort the array so that our requestParams are in the correct order
if (is_array($requestParams)) {
asort($requestParams);
} else {
// Throw an error, the service method or param names was not found.
die('The requested service method or parameter names was not found on the web-service. Please check the method name and parameters.');
}
// The $requestParams array now contains the parameter names in the correct order, we just need to add the values now.
foreach ($requestParams as $k=>$paramName) {
$requestParams[$k] = $params[$k];
}
try {
$test = $client->__soapCall($serviceMethod, $requestParams);
print_r($test);
} catch (SoapFault $e) {
print_r('Error: ' . $e->getMessage());
}