the soapclient make how example ejemplo php soap
https://www.dropbox.com/s/6pz1w94a52o5xah/11593623.zip

make - Cómo hacer una llamada SOAP de PHP usando la clase SoapClient



soapclient php example (10)

Esto es lo que necesitas hacer.

Solo para saber, traté de recrear tu situación ...

  • Para este ejemplo, hice un servicio web de ejemplo .NET con un WebMethod llamado Function1 y estos son los parámetros:

Función1 (contacto de contacto, descripción de cadena, cantidad int)

  • En el que Contact es solo una class bean que tiene getters y setters para id y name como en tu caso.

  • Puede descargar este servicio web de ejemplo .NET en:

https://www.dropbox.com/s/6pz1w94a52o5xah/11593623.zip

El código.

Esto es lo que debe hacer en PHP :

(Probado y funcionando)

<?php /* Create a class for your webservice structure, in this case: Contact */ class Contact { function Contact($id, $name) { $this->id = $id; $this->name = $name; } } /* Initialize webservice with your WSDL */ $client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl"); /* Fill your Contact Object */ $contact = new Contact(100, "John"); /* Set your parameters for the request */ $params = array( "Contact" => $contact, "description" => "Barrel of Oil", "amount" => 500, ); /* Invoke webservice method with your parameters, in this case: Function1 */ $response = $client->__soapCall("Function1", array($params)); /* Print webservice response */ var_dump($response); ?>

¿Cómo sé que esto está funcionando?

  • Si print_r($params); verá esta salida, ya que su servicio web espera:

Matriz ([Contacto] => Objeto de contacto ([id] => 100 [nombre] => Juan) [descripción] => Barril de petróleo [cantidad] => 500)

  • Cuando depuré el servicio web de muestra .NET obtuve esto:

(Como puede ver, el objeto de Contact no es nulo y también otros parámetros, lo que significa que su solicitud se realizó con éxito desde el lado de PHP).

  • La respuesta del servicio web de ejemplo .NET fue la esperada y se mostró en el lado de PHP:

object (stdClass) [3] public ''Function1Result'' => string ''¡Información detallada de su solicitud! id: 100, nombre: John, descripción: barril de petróleo, cantidad: 500 ''(longitud = 98)

Espero que esto ayude :-)

Estoy acostumbrado a escribir código PHP, pero no uso a menudo la codificación orientada a objetos. Ahora necesito interactuar con SOAP (como cliente) y no puedo obtener la sintaxis correcta. Tengo un archivo WSDL que me permite configurar correctamente una nueva conexión utilizando la clase SoapClient. Sin embargo, no puedo hacer la llamada correcta y obtener datos. Necesito enviar los siguientes datos (simplificados):

  • ID de contacto
  • Nombre de contacto
  • Descripción general
  • Cantidad

Hay dos funciones definidas en el documento WSDL, pero solo necesito una ("FirstFunction" a continuación). Aquí está el script que ejecuto para obtener información sobre las funciones y tipos disponibles:

$client = new SoapClient("http://example.com/webservices?wsdl"); var_dump($client->__getFunctions()); var_dump($client->__getTypes());

Y aquí está la salida que genera:

array( [0] => "FirstFunction Function1(FirstFunction $parameters)", [1] => "SecondFunction Function2(SecondFunction $parameters)", ); array( [0] => struct Contact { id id; name name; } [1] => string "string description" [2] => string "int amount" }

Supongamos que quiero hacer una llamada a FirstFunction con los datos:

  • Identificación de contacto: 100
  • Nombre de contacto: John
  • Descripción general: barril de petróleo
  • Cantidad: 500

¿Cuál sería la sintaxis correcta? He estado probando todo tipo de opciones, pero parece que la estructura del jabón es bastante flexible, así que hay muchas maneras de hacerlo. No pude resolverlo desde el manual tampoco ...

ACTUALIZACIÓN 1: muestra probada de MMK:

$client = new SoapClient("http://example.com/webservices?wsdl"); $params = array( "id" => 100, "name" => "John", "description" => "Barrel of Oil", "amount" => 500, ); $response = $client->__soapCall("Function1", array($params));

Pero obtengo esta respuesta: Object has no ''Contact'' property . Como puede ver en el resultado de getTypes() , hay una struct llamada Contact , así que creo que de alguna manera necesito dejar en claro que mis parámetros incluyen los datos de contacto, pero la pregunta es: ¿cómo?

ACTUALIZACIÓN 2: también he probado estas estructuras, el mismo error.

$params = array( array( "id" => 100, "name" => "John", ), "Barrel of Oil", 500, );

Tanto como:

$params = array( "Contact" => array( "id" => 100, "name" => "John", ), "description" => "Barrel of Oil", "amount" => 500, );

Error en ambos casos: el objeto no tiene la propiedad ''Contacto''


Existe la opción de generar objetos php5 con la clase WsdlInterpreter. Vea más aquí: https://github.com/gkwelding/WSDLInterpreter

por ejemplo:

require_once ''WSDLInterpreter-v1.0.0/WSDLInterpreter.php''; $wsdlLocation = ''<your wsdl url>?wsdl''; $wsdlInterpreter = new WSDLInterpreter($wsdlLocation); $wsdlInterpreter->savePHP(''.'');


Lee esto;-

http://php.net/manual/en/soapclient.call.php

O

Este es un buen ejemplo para la función SOAP "__call". Sin embargo, está en desuso.

<?php $wsdl = "http://webservices.tekever.eu/ctt/?wsdl"; $int_zona = 5; $int_peso = 1001; $cliente = new SoapClient($wsdl); print "<p>Envio Internacional: "; $vem = $cliente->__call(''CustoEMSInternacional'',array($int_zona, $int_peso)); print $vem; print "</p>"; ?>


Necesita una matriz multidimensional, puede intentar lo siguiente:

$params = array( array( "id" => 100, "name" => "John", ), "Barrel of Oil", 500 );

en PHP, una matriz es una estructura y es muy flexible. Normalmente, con las llamadas de jabón utilizo un contenedor XML, por lo que no estoy seguro de si funcionará.

EDITAR:

Lo que puede intentar es crear una consulta JSON para enviar o usar eso para crear un tipo de compra xml que se encuentre en esta página: http://onwebdev.blogspot.com/2011/08/php-converting-rss-to-json.html


Necesitas declarar clase Contrato

class Contract { public $id; public $name; } $contract = new Contract(); $contract->id = 100; $contract->name = "John"; $params = array( "Contact" => $contract, "description" => "Barrel of Oil", "amount" => 500, );

o

$params = array( $contract, "description" => "Barrel of Oil", "amount" => 500, );

Entonces

$response = $client->__soapCall("Function1", array("FirstFunction" => $params));

o

$response = $client->__soapCall("Function1", $params);


No sé por qué mi servicio web tiene la misma estructura que usted, pero no necesita Class para el parámetro, simplemente es array.

Por ejemplo: - Mi WSDL:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.kiala.com/schemas/psws/1.0"> <soapenv:Header/> <soapenv:Body> <ns:createOrder reference="260778"> <identification> <sender>5390a7006cee11e0ae3e0800200c9a66</sender> <hash>831f8c1ad25e1dc89cf2d8f23d2af...fa85155f5c67627</hash> <originator>VITS-STAELENS</originator> </identification> <delivery> <from country="ES" node=””/> <to country="ES" node="0299"/> </delivery> <parcel> <description>Zoethout thee</description> <weight>0.100</weight> <orderNumber>10K24</orderNumber> <orderDate>2012-12-31</orderDate> </parcel> <receiver> <firstName>Gladys</firstName> <surname>Roldan de Moras</surname> <address> <line1>Calle General Oraá 26</line1> <line2>(4º izda)</line2> <postalCode>28006</postalCode> <city>Madrid</city> <country>ES</country> </address> <email>[email protected]</email> <language>es</language> </receiver> </ns:createOrder> </soapenv:Body> </soapenv:Envelope>

Yo var_dump:

var_dump($client->getFunctions()); var_dump($client->getTypes());

Aquí está el resultado:

array 0 => string ''OrderConfirmation createOrder(OrderRequest $createOrder)'' (length=56) array 0 => string ''struct OrderRequest { Identification identification; Delivery delivery; Parcel parcel; Receiver receiver; string reference; }'' (length=130) 1 => string ''struct Identification { string sender; string hash; string originator; }'' (length=75) 2 => string ''struct Delivery { Node from; Node to; }'' (length=41) 3 => string ''struct Node { string country; string node; }'' (length=46) 4 => string ''struct Parcel { string description; decimal weight; string orderNumber; date orderDate; }'' (length=93) 5 => string ''struct Receiver { string firstName; string surname; Address address; string email; string language; }'' (length=106) 6 => string ''struct Address { string line1; string line2; string postalCode; string city; string country; }'' (length=99) 7 => string ''struct OrderConfirmation { string trackingNumber; string reference; }'' (length=71) 8 => string ''struct OrderServiceException { string code; OrderServiceException faultInfo; string message; }'' (length=97)

Entonces en mi código:

$client = new SoapClient(''http://packandship-ws.kiala.com/psws/order?wsdl''); $params = array( ''reference'' => $orderId, ''identification'' => array( ''sender'' => param(''kiala'', ''sender_id''), ''hash'' => hash(''sha512'', $orderId . param(''kiala'', ''sender_id'') . param(''kiala'', ''password'')), ''originator'' => null, ), ''delivery'' => array( ''from'' => array( ''country'' => ''es'', ''node'' => '''', ), ''to'' => array( ''country'' => ''es'', ''node'' => ''0299'' ), ), ''parcel'' => array( ''description'' => ''Description'', ''weight'' => 0.200, ''orderNumber'' => $orderId, ''orderDate'' => date(''Y-m-d'') ), ''receiver'' => array( ''firstName'' => ''Customer First Name'', ''surname'' => ''Customer Sur Name'', ''address'' => array( ''line1'' => ''Line 1 Adress'', ''line2'' => ''Line 2 Adress'', ''postalCode'' => 28006, ''city'' => ''Madrid'', ''country'' => ''es'', ), ''email'' => ''[email protected]'', ''language'' => ''es'' ) ); $result = $client->createOrder($params); var_dump($result);

pero con éxito!


Primero inicialice los servicios web:

$client = new SoapClient("http://example.com/webservices?wsdl");

Luego configura y pasa los parámetros:

$params = array ( "arg0" => $contactid, "arg1" => $desc, "arg2" => $contactname ); $response = $client->__soapCall(''methodname'', array($params));

Tenga en cuenta que el nombre del método está disponible en WSDL como nombre de operación, por ejemplo:

<operation name="methodname">


Primero, use SoapUI para crear su proyecto de jabon desde el wsdl. Intenta enviar una solicitud para jugar con las operaciones de wsdl. Observe cómo la solicitud xml compone sus campos de datos.

Y luego, si tiene problemas para conseguir que SoapClient actúe como lo desea, así es como lo depuro. Establezca el seguimiento de la opción para que la función __getLastRequest () esté disponible para su uso.

$soapClient = new SoapClient(''http://yourwdsdlurl.com?wsdl'', [''trace'' => true]); $params = [''user'' => ''Hey'', ''account'' => ''12345'']; $response = $soapClient->__soapCall(''<operation>'', $params); $xml = $soapClient->__getLastRequest();

Luego, la variable $ xml contiene el xml que SoapClient compone para su solicitud. Compara este xml con el generado en SoapUI.

Para mí, SoapClient parece ignorar las claves de la matriz asociativa $ params e interpretarla como una matriz indexada, lo que causa datos de parámetros incorrectos en el xml. Es decir, si reordené los datos en $ params , la respuesta $ es completamente diferente:

$params = [''account'' => ''12345'', ''user'' => ''Hey'']; $response = $soapClient->__soapCall(''<operation>'', $params);


Puede usar los servicios SOAP de esta manera también:

<?php //Create the client object $soapclient = new SoapClient(''http://www.webservicex.net/globalweather.asmx?WSDL''); //Use the functions of the client, the params of the function are in //the associative array $params = array(''CountryName'' => ''Spain'', ''CityName'' => ''Alicante''); $response = $soapclient->getWeather($params); var_dump($response); // Get the Cities By Country $param = array(''CountryName'' => ''Spain''); $response = $soapclient->getCitiesByCountry($param); var_dump($response);

Este es un ejemplo con un servicio real, y funciona.

Espero que esto ayude.


Si crea el objeto de SoapParam, esto resolverá su problema. Cree una clase y asóciela con el tipo de objeto dado por WebService, Inicialice los valores y envíe la solicitud. Vea la muestra a continuación.

struct Contact { function Contact ($pid, $pname) { id = $pid; name = $pname; } } $struct = new Contact(100,"John"); $soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "Contact","http://soapinterop.org/xsd"); $ContactParam = new SoapParam($soapstruct, "Contact") $response = $client->Function1($ContactParam);