Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wesley da Silva Gomes

Consumir WebService usando SOAP php enviando um XML

Recommended Posts

Boa tarde, estou tentando consumir um WebService da TOTVS via php usando SOAP php nativo do php 7, porem sempre que eu tento enviar o XML retorna um erro, e o WS não consegue inserir as informações e retorna um erro como se não estivesse enviado o XML que eu passo por parâmetro para a o método.

 

 

XML que deve ser enviado.

            <INCLUIRNOTAAVALIACAO>
                <SNOTAS>
                    <CODCOLIGADA>1</CODCOLIGADA>
                    <IDTURMADISC>1123456</IDTURMADISC>
                    <NOTA>1</NOTA>
                    <CODPROVA>1</CODPROVA>
                    <CODETAPA>1</CODETAPA>
                    <RA>13003306499</RA>
                </SNOTAS>
            </INCLUIRNOTAAVALIACAO>

Erro que o servidor do WS me retorna.

555 - Erro interno do servidor. Erro ao executar o WebMethod: IncluirNotaAvaliacao. Column 'STRINGENVIO' does not allow nulls.

STRINGENVIO seria a coluna em uma tabela no banco em o WS faz a inserção, porem parece que ele esta indo vazio.

 

Segue abaixo o script.

<?php 

	$client = new SoapClient('wsdl',array("trace"=>1));

		AddWSSUsernameToken($client, 'user', 'password=');

		$function = 'IncluirNotaAvaliacao';

	$CODCOLIGADA = '133';
	$IDTURMADISC = '103621';
	$NOTA = '1';
	$CODPROVA = '1';
	$CODETAPA = '1';
	$RA = '13000006499';
	
		
		$CODCOLIGADA = new SoapVar($CODCOLIGADA, 
								XSD_STRING, 
								null, null, 
								'CODCOLIGADA');
								
		$IDTURMADISC = new SoapVar($IDTURMADISC, 
								XSD_STRING, 
								null, null, 
								'IDTURMADISC');		
								
		$NOTA = new SoapVar($NOTA, 
								XSD_STRING, 
								null, null, 
								'NOTA');		
								
		$CODPROVA = new SoapVar($CODPROVA, 
								XSD_STRING, 
								null, null, 
								'CODPROVA');	
								
		$CODETAPA = new SoapVar($CODETAPA, 
								XSD_STRING, 
								null, null, 
								'CODETAPA');	
								
		$RA = new SoapVar($RA, 
								XSD_STRING, 
								null, null, 
								'RA');
								
								
		$SNOTAS = new SoapVar(array($CODCOLIGADA, $IDTURMADISC,$NOTA, $CODPROVA,$CODETAPA, $RA), 
										SOAP_ENC_OBJECT, 
										null, null, 'SNOTAS');
									
									
		$METODO = new SoapVar(array($SNOTAS), 
								SOAP_ENC_OBJECT, 
								null, null, 'INCLUIRNOTAAVALIACAO');

										
		$xml = new SoapVar(array($METODO), 
								SOAP_ENC_OBJECT, 
								null, null);

		$result = $client->IncluirNotaAvaliacao($xml);


		echo '<br><br>Response: <br>';
		VAR_DUMP($result);


		print_r ('<br><br>REQUEST HEADERS<br>:\n' . $client->__getLastRequestHeaders (). "\n");
		print_r ("<br><br>REQUEST Response<br>:\n" . $client->__getLastResponseHeaders (). "\n");
		print_r ("<br><br>REQUEST<br>:\n" . htmlentities($client->__getLastRequest()). "\n");
		

			
	function AddWSSUsernameToken($client, $username, $password){
			
		$wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
		
		$username = new SoapVar($username, 
								XSD_STRING, 
								null, null, 
								'Username', 
								$wssNamespace);
								
		$password = new SoapVar($password, 
								XSD_STRING, 
								null, null, 
								'Password', 
								$wssNamespace);
		
		$usernameToken = new SoapVar(array($username, $password), 
										SOAP_ENC_OBJECT, 
										null, null, 'UsernameToken', 
										$wssNamespace);
								
		$usernameToken = new SoapVar(array($usernameToken), 
								SOAP_ENC_OBJECT, 
								null, null, null, 
								$wssNamespace);
		
		$wssUsernameTokenHeader = new SoapHeader($wssNamespace, 'Security', $usernameToken);
		
		$client->__setSoapHeaders($wssUsernameTokenHeader); 
	}
				

?>









Usando a função __getLastRequest me retorna o seguinte XML.

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://www.totvs.com.br/br/"
    xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <SOAP-ENV:Header>
        <ns2:Security>
            <ns2:UsernameToken>
                <ns2:Username>user</ns2:Username>
                <ns2:Password>password</ns2:Password>
            </ns2:UsernameToken>
        </ns2:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:IncluirNotaAvaliacao>
            <INCLUIRNOTAAVALIACAO>
                <SNOTAS>
                    <CODCOLIGADA>133</CODCOLIGADA>
                    <IDTURMADISC>103621</IDTURMADISC>
                    <NOTA>1</NOTA>
                    <CODPROVA>1</CODPROVA>
                    <CODETAPA>1</CODETAPA>
                    <RA>13000006499</RA>
                </SNOTAS>
            </INCLUIRNOTAAVALIACAO>
        </ns1:IncluirNotaAvaliacao>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 

Por favor quem puder me passar, eu não tenho nenhum experiencia com WS e não sei se estou consumindo corretamente o método. Preciso conseguir consumir esse WS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

Tentei fazer com SimpleXMLElement porem quando eu tento enviar o XML ele não aparece no Request que eu envio.

Ficando assim.

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://www.totvs.com.br/br/"
    xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <SOAP-ENV:Header>
        <ns2:Security>
            <ns2:UsernameToken>
                <ns2:Username>xxx</ns2:Username>
                <ns2:Password>xxxx</ns2:Password>
            </ns2:UsernameToken>
        </ns2:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:IncluirNotaAvaliacao/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

E essa 'STRINGENVIO' é um campo no banco de dados onde fica armazenado o XML que eu enviei. Por isso não adianta enviar o XML com uma tag 'STRINGENVIO', mas igual pra descargo de consciência eu testei com essa tag, e como esperado também não funcionou.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim e também foi vazio.

$result = $client->IncluirNotaAvaliacao($xml->asXML());

Já tentei de varias formas, já testei tudo que eu consegui imaginar, e sempre me retorna esse erro.

Já faz um mês quase que eu estou tentando consumir esse WS.

Não sei o que estou fazendo de errado. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,  o script esta gerando mesmo XML que o SOAPUI envia, porem mesmo assim, no SOAPUI funciona e no script parece que não envia o XML, ou que vai nulo o XML que eu tento enviar.

Tenho a impressão que pode ser algo no trecho de código onde eu passo os parâmetros para o WebMetodo, mas também já tentei os exemplos que eu achei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.