Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Pessoal. Novamente estou desenvolvendo mais uma integração com um fornecedor de minha empresa, porém encontrei um problema. No desenvolvimento da integração anterior, a criação do xml utilizando o protocolo SOAP era no formato normal, conhecido pelo menos por mim, por exemplo: Para gerar o xml <pessoaFisica><cpf><numero>1234567899900</numero></cpf></pessoaFisica> eu só precisava criar um array no seguinte formato: array('pessoaFisica'=> array('cpf'=> array( 'numero'=>'1234567899900' ) )). Porém o padrão do xml desse novo fornecedor é diferente, nesse caso ficaria assim: <pessoaFisica><cpf numero="1234567899900" /></pessoaFisica> Nesse caso, se eu mandar o array como mostrei em cima, o webservice me retorna um erro, dizendo que não estou informando os parâmetros corretamente, e não encontrei nada na internet que utilizasse um xml nesse formato. Alguém já desenvolveu algo assim em PHP? Falows Alguém se habilita? heheheeh
posso estar errado, mas se você vai enviar o xml para o webservice por que não gerar este xml usando a class DOMDocument ?
$doc = '05625636958';
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->preserveWhiteSpace = false;
$xml->formatOutput = false;
$pessoaFisica = $xml->createElement('pessoaFisica');
$cpf = $xml->createElement('cpf');
$cpf->setAttribute('numero', $doc);
$pessoaFisica->appendChild($cpf);
$xml->appendChild($pessoaFisica);
$xml->save('pessoaFisica.xml');E como eu realizaria o envio para o webservice através do soap? Pois hoje faço da seguinte forma:
$argumentos = array('pessoaFisica'=> array('cpf'=> array( 'numero'=>'1234567899900' ) ) );
$local = new SoapClient('endereco_do_webservice.asmx?wsdl',array('soap_version' => SOAP_1_2));
$resultado = $local->__soapCall('GetCli', $argumentos);
print_r($resultado);
Já tentei colocar ali em argumentos o próprio xml, só que a função pede um array e acaba com erro, vc tem algum exemplo utilizando esse formato que vc me passou para eu tentar aprender?
Obrigado!
Não sei como funciona a arquitetura do webservice em questão, por isso posso estar errado. Mas geralmente passamos os argumentos em forma de array e o nusop transforma isso em xml. Porém pode-se passar o xml diretamente:
$client->send($xml_string, $action)
Nunca consumi um webservice usando a extensão nativa do php, então não sei se consigo dar-lhe uma informação precisa. Mas encontrei este post talvez de uma luz:
http://stackoverflow.com/questions/19009554/php-soapclient-send-custom-xml
há ainda a possibilidade de enviar a solicitação usando cURL também é uma saída.
Na verdade meu problema maior mesmo é o envio via webservice, não consigo utilizar o cURL aqui pq meu servidor é antigo, tentei instalar e deu um monte de problema, até tenho um servidor novo pra migrar mas demora um pouco.
Referente a geração da string do xml, até faço no braço, sem problemas, mas como enviar via SOAP ou algum outro protocolo, desde que não seja o tal do cURL, haheheheua...to passando trabalho aqui, em Java eu sei que tem solução, agora em php nunca vi.
Valeu
Se puder passar o modelo SOAP request do webservice (Se ele existir é claro)rsrs eu posso ajudar. Já tentou usar StdClass ao invés de array ?
$url = '';
$local = new SoapClient($url);
$xml = new SimpleXMLElement("<pessoaFisica></pessoaFisica>");
$cpf = $xml->addChild('cpf');
$cpf->addAttribute('numero', '12345678900');
$params = new stdClass();
$params->xml = $xml->asXML();
var_dump($params);
$resultado = $local->__soapCall('GetCli', $params);
print_r($resultado);Olá Ademilson Nunes
Estou instalando um novo servidor para trabalhar simultâneo, pois meu servidor atual tem a versão do php 5.1.2, muitas dessas dicas que você passou não estão contempladas nessa versão do php, e ainda nem posso instalar uma nova versão porque o sistema foi todo desenvolvido nessa versão e precisa ter o register globals, o que me quebrou...rsrsrsrs....
Quando terminar a instalação vou fazer algumas requisições nesse novo servidor processar e retornar com um json da vida pra conseguir trabalhar melhor.
Quando tiver tudo pronto retorno aqui e digo se funcionou ou não.
Té mais.
Descobri como fazer isso, na verdade é muito simples, basta criar a string do xml e converter ele em array, fica assim:
$xml = '<pessoaFisica><cpf numero="123456799900" /></pessoaFisica>';
$conversao = simplexml_load_string($xml);
$xmlfinal = json_decode(json_encode($conversao), true);
$soap = new SoapClient('http://endereco_do_wsdl?wsdl',array('soap_version' => SOAP_1_2));
$retorno = $soap->__soapCall('ConsultarCliente', $xmlfinal);
Falows
Você precisa diferenciar atributos de filhos.