Я уже два дня бегаю по поиску, не надеясь, что я просто спрошу, что вопрос прольет свет!
Я работаю над системой обновления уровня акций с компанией-исполнителем. Мне дали адрес wsdl и следующие инструкции:
При вызове команды веб-сайт должен передать имя команды веб-службе, а также список параметров. Параметры должны быть отформатированы следующим образом:
<params>
<ParamName>Value</ParamName>
<AnotherParam>Value</AnotherParam>
</params>
GetStock - Получить доступные уровни запасов для данного поставщика
Параметр Тип данных Комментарии
Строка ClientCode
Строка SupplierCode Оставьте пустой или исключающий параметр для всех уровней запасов для клиента
а также:
<?xml version="1.0" encoding="utf-16"?>
<GetStock>
<StockLevels>
<Stock>
<Sku>12848</Sku>
<AltSku></AltSku>
<SupplierCode>0044</SupplierCode>
<Description>Australia Toggle £20 credit SIM</Description>
<InStock>1</InStock>
<Allocated>2</Allocated>
<Available>17</Available>
<Prices></Prices>
</Stock>
</StockLevels>
</GetStock>
Мне удалось заставить мой SoapClient работать, аутентифицироваться и получать токен обратно (после получения ошибок аутентификации). Я не мог назвать GetStock, поэтому использовал __getFunctions() и понял, что мне нужно использовать метод GetData().
Подняв файл WSDL, я обнаружил следующее:
<wsdl:operation name="GetData">
<soap:operation soapAction="http://www.mnp-main.com/OMSConnect/IDataFeed/GetData" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
Теперь я полностью в тупике, что делать! Я знаю, что GetStock не является доступным методом, поэтому это нужно делать через GetData, но я просто не могу понять, какие параметры будут проходить через него.
Единственное, что я выяснил, это то, что вторым параметром для GetData является токен аутентификации, но первая часть - все, что я могу сказать, приводит к следующему сообщению:
Конечный элемент "Тело" из пространства имен " http://schemas.xmlsoap.org/soap/envelope/ " ожидается. Найден элемент 'param1' из пространства имен ''. Строка 2, позиция 174.
Просматривая файл схемы, я вообще не пролил свет для меня :(
Прошу прощения, если я пропущу что-то очень очевидное, но у меня не было прежнего обучения по этому поводу, и все обучающие материалы, с которыми я сталкивался, по-видимому, имеют ясное имя и параметры метода в файле wsdl, в отличие от того, что у меня здесь.
Большое спасибо за вашу помощь!
Обновление 2:
Здесь результаты __getFunctions и __getTypes:
array(7) {
[0]=>
string(59) "AuthenticateResponse Authenticate(Authenticate $parameters)"
[1]=>
string(44) "GetDataResponse GetData(GetData $parameters)"
[2]=>
string(74) "GetDataWithParamsResponse GetDataWithParams(GetDataWithParams $parameters)"
[3]=>
string(68) "ValidateSessionResponse ValidateSession(ValidateSession $parameters)"
[4]=>
string(53) "ClearCacheResponse ClearCache(ClearCache $parameters)"
[5]=>
string(53) "GetVersionResponse GetVersion(GetVersion $parameters)"
[6]=>
string(77) "GetImageWithResizeResponse GetImageWithResize(GetImageWithResize $parameters)"
}
Для GetData и GetDataWithParams:
[10]=>
string(55) "struct GetData {
string command;
string tokenValue;
}"
[11]=>
string(56) "struct GetDataResponse {
ResultGetData GetDataResult;
}"
[12]=>
string(85) "struct GetDataWithParams {
string command;
string parameters;
string tokenValue;
}"
[13]=>
string(76) "struct GetDataWithParamsResponse {
ResultGetData GetDataWithParamsResult;
}"
После долгих проб и ошибок я наконец-то начал работать. Основываясь на документации, я решил, что мне нужно использовать метод GetDataWithParams. Итак, посмотрим на результат __getTypes:
[12]=>
string(85) "struct GetDataWithParams {
string command;
string parameters;
string tokenValue;
}"
Я понял, что команда будет GetStock; tokenValue - $ токен. Часть, которую я не мог решить, был параметром, поэтому я сделал несколько проб и ошибок и понял, что он ожидает строковое значение: исходный XML-код в основном.
Так что в итоге получилось:
$params = new StdClass();
$params->command = 'GetStock';
$params->tokenValue = $token;
$params->parameters = "<params><ClientCode>{$this->clientCode}</ClientCode></params>";
Или в формате массива:
$params = array(
'command' => 'GetStock',
'tokenValue' => $token,
'parameters' => "<params><ClientCode>{$this->clientCode}</ClientCode></params>",
);
Спасибо @Wrikken за то, что указали мне в правильном направлении :)