Я пытаюсь получить запрос с этой структурой:
<SOAP-ENV:Body>
<ns1:getCreditReportTypes>
<reportTypeRequest>
<reportParams xsi:type="ns1:personCreditReportParams">
<personId>4</personId>
<consentConfirmed>true</consentConfirmed>
</reportParams>
</reportTypeRequest>
</ns1:getCreditReportTypes>
</SOAP-ENV:Body>
Вот мой php-код:
$obj = new \stdClass();
$obj->personId = 4;
$obj->consentConfirmed = true;
$data = new \SoapVar($obj, SOAP_ENC_OBJECT, "personCreditReportParams", $namespace, "reportParams");
$res = $this->client->getCreditReportTypes(new \SoapParam($data,"reportTypeRequest"));
Тем не менее, PHP генерирует недопустимый XML:
<SOAP-ENV:Body>
<ns1:getCreditReportTypes xsi:type="ns1:personCreditReportParams">
<consentConfirmed>true</consentConfirmed>
<personId>4</personId>
</ns1:getCreditReportTypes>
</SOAP-ENV:Body>
Как я могу сделать правильный XML с объектным способом?
Для тех, кто получит такую же проблему.
Мое решение состоит в том, чтобы использовать nusoap (https://github.com/yaim/nusoap-php7). Эта библиотека позволяет делать сложные запросы, в том числе SWA (SOAP с вложениями).
Вот рабочий код для моего вопроса:
$person = array("personId"=>$id, "consentConfirmed"=>$confirmed);
$data = array(
"reportParams"=>new soapval("reportParams", "personCreditReportParams", $person, false, $namespace)
);
$result = $client->call("getCreditReportTypes", $data, $namespace);
Постскриптум Я пробовал некоторые генераторы, и никто не мог сделать правильный запрос, хотя классы были сгенерированы правильно.
Вы должны окончательно использовать WSDL для генератора php, таких как PackageGenerator.
Это облегчит вам построение запроса, обработку ответа.