php - por - Enviar entrada XML a WSDL usando SoapClient
web service php soap ejemplo (2)
Tengo este WSDL: https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL
Estoy intentando usar SoapClient para enviar una solicitud al método CustomerSearch .
El código que estoy usando es el siguiente:
$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));
Cuando ejecuto el código, obtengo la siguiente excepción de PHP:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no ''any'' property
También he intentado esto para el XML:
$xml = "
<?xml version=/"1.0/" encoding=/"utf-8/"?>
<CustomerSearch>
<AuthorID>$authorID</AuthorID>
<UserID>$userID</UserID>
<UserPassword>$userPassword</UserPassword>
<Email>$customerEmail</Email>
</CustomerSearch>
";
Lo que me da los siguientes resultados (de un print_r):
object(stdClass)#4 (1) { ["CustomerSearchResult"]=> object(stdClass)#5 (1) { ["any"]=> string(108) "-2Invalid Xml Document" } }
La documentación dice que el XML de entrada debería verse más o menos así:
<CustomerSearch>
<AuthorID></AuthorID>
<UserID></UserID>
<UserPassword></UserPassword>
<SearchField></SearchField>
<SearchField></SearchField>
<!-- ...additional SearchField elements -->
</CustomerSearch>
Soy bastante nuevo para Soap y he intentado meterme (pasando XML en bruto y mecanografiado) y parece que no funciona. Cualquier idea sobre lo que puedo estar haciendo mal sería muy apreciada.
intente pasar $client->CustomerSearch($CustomerSearch);
o pasa una cuerda
Creo que debes buscar más en la documentación (con respecto a any
parámetro). Pero su solicitud debería ser algo como esto:
$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);
EDITAR : Así es como lo hice en un proyecto similar. Puede que no sea la mejor práctica. SoapVar podría ser la mejor manera de hacerlo ( ejemplo de ANY_XML
con ANY_XML
).