Отправка входных данных XML в WSDL с помощью SoapClient

У меня есть этот WSDL: https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL

Я пытаюсь использовать SoapClient для отправки запроса в метод CustomerSearch.

Код, который я использую, выглядит следующим образом:

$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);

$CustomerSearch = array(
    'AuthorID' => $authorID,
    'UserID' => $userID,
    'UserPassword' => $userPassword,
    'Email' => $customerEmail 
);

$xml = array('CustomerSearch' => $CustomerSearch);

$result = $client->CustomerSearch(array('xml' => $xml));

Когда я запускаю код, я получаю следующее исключение PHP:

Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'any' property

Я также попробовал это для XML:

$xml = "
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<CustomerSearch>
    <AuthorID>$authorID</AuthorID>
    <UserID>$userID</UserID>
    <UserPassword>$userPassword</UserPassword>
    <Email>$customerEmail</Email>
</CustomerSearch>
";

Что дает мне следующие результаты (из print_r):

object(stdClass)#4 (1) { ["CustomerSearchResult"]=> object(stdClass)#5 (1) { ["any"]=> string(108) "-2Invalid Xml Document" } }

В документации сказано, что входной XML должен выглядеть примерно так:

<CustomerSearch>
<AuthorID></AuthorID>
<UserID></UserID>
<UserPassword></UserPassword>
<SearchField></SearchField>
<SearchField></SearchField>
<!-- ...additional SearchField elements -->
</CustomerSearch> 

Я довольно новичок в Soap, и я пробовал возиться (передавать в raw, набирать XML) и не могу заставить его работать. Любое понимание того, что я могу делать неправильно, будет с благодарностью.

2 ответа

Решение

Я думаю, что вам нужно больше смотреть на документацию (в отношении any параметр). Но ваш запрос должен быть примерно таким:

$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);

$xmlr = new SimpleXMLElement("<CustomerSearch></CustomerSearch>");
$xmlr->addChild('AuthorID', $authorID);
$xmlr->addChild('UserID', $userID);
$xmlr->addChild('UserPassword', $userPassword);
$xmlr->addChild('Email', $customerEmail);

$params = new stdClass();
$params->xml = $xmlr->asXML();

$result = $client->CustomerSearchS($params);

РЕДАКТИРОВАТЬ: Вот как я сделал это в аналогичном проекте. Это не может быть лучшей практикой. SoapVar может быть лучшим способом сделать это ( примерSoapVoar сANY_XML).

Попробуйте пройти $client->CustomerSearch($CustomerSearch); или передать строку

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