ENVIO DE NOTA FISCAL PAULISTA POR WEB SERVICE EM PHP

1,451 views
Skip to first unread message

Jussan Bandeira

unread,
Jun 24, 2013, 2:12:57 PM6/24/13
to list...@googlegroups.com
Fala galera, sou novato aqui e em trabalhos com web service tb, e estou com dúvidas, é o seguinte, tenho que consultar e enviar arquivos para o site da nota fiscal paulista(não nfe, e sim nfp), o endereço pra envio é

https://www.nfp.fazenda.sp.gov.br/ws/arquivocf.asmx?wsdl

só que algo está errado pois aparece a seguinte mensagem de erro:

Server was unable to process request. ---> Object reference not set to an instance of an object.

e a execução do script acaba na hora que chamo o metodo consultar, será que o erro está na definição do cabeçalho onde passo usuario, senha, cnpj e categoriaUsuario pra fazer o login.

aqui tem um manual de integração, mas como não entendo muito de web service fica dificil entender kk. se alguem puder me ajudar ou me dar umas dicas de como resolver ficarei agradecido.

link do manual: http://www.nfp.fazenda.sp.gov.br/pdf/wscf.pdf

abaixo tá o código que fiz.
<?php
$wsdl = "https://www.nfp.fazenda.sp.gov.br/ws/arquivocf.asmx?wsdl";

try{
$cliente = new SoapClient($wsdl,
array(
"trace" => 1,
"exceptions" => 1,
"soap_version" => SOAP_1_2,
"classmap" => array('timezone' => 'TimeZone')
));

// no lugar de strusuario, strsenha e strcnpj vão minha senha,meu usuario e //meu cnpj cadastrado no site.
$usuario = new SOAPHeader($wsdl, 'Usuario', 'strusuario');
$senha = new SOAPHeader($wsdl, 'Senha', 'strsenha');
$cnpj = new SOAPHeader($wsdl, 'CNPJ', 'strcnpj');
$tpusuario = new SOAPHeader($wsdl, 'CategoriaUsuario', '1');

$headers = array($usuario, $senha, $cnpj, $tpusuario);
$cliente->__setSOAPHeaders($headers);
//686104436
$rs = $cliente->consultar(array("Protocolo" => "686104436"));
print_r($rs);

}catch(Exception $e){
echo $e->getCode()." - ".$e->getMessage();
}

Rodrigo Wanderley de Melo Cardoso

unread,
Jun 25, 2013, 8:42:15 AM6/25/13
to list...@googlegroups.com
O erro ao qual o sistema se refere é que você está tentando retornar um atributo em um objeto que não é referenciado. Uma pergunta: existe o método consultar no objeto $cliente ?
Segundo ponto, pelo manual o cabeçalho é definido da seguinte maneira: <soap12:Header> 
 <Autenticacao Usuario="string" Senha="string" CNPJ="string" CategoriaUsuario="unsignedByte" 
</soap12:Header> 
Em nenhum momento nos new SOAPHeader você referencia o atributo Autenticacao como o atributo de seu cabeçalho.
Ao meu ver ficaria algo do tipo o cabeçalho:
//cria a tag de cabeçalho
$cabecalho = '<Autenticacao Usuario="usuario" Senha="senha" CNPJ="cnpj" CategoriaUsuario="categoriaUsuario" xmlns="https://www.nfp.sp.gov.br/ws" />';
//transforma a tag de cabeçalho em variavel SOAP
$varCabec = new SoapVar($cabecalho,XSD_ANYXML);
//cria um novo cabeçalho e seta seus atributos
$header = new SoapHeader('https://www.nfp.sp.gov.br/ws','Autenticacao',$varCabec);
//anexa os cabeçalhos na chamada de SOAP
$cliente->__setSoapHeaders($header);

Outro ponto é a chamada como disse acima. Para chamar um método do webservice vc utiliza o método __soapCall() (procure na documentação do PHP). E não o método consultar, que não é um método presente no objeto.

Espero ter ajudado.
   


--
--
============================================================
JQUERY MAGAZINE > http://www.jquerymagazine.com.br
--
PHP MAGAZINE > http://www.phpmagazine.com.br
--
LISTA NODE.JS > https://groups.google.com/group/lista-nodejs?hl=pt-br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================

---
Você está recebendo esta mensagem porque se inscreveu no grupo "LISTA PHP" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para listaphp+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



Jussan Bandeira

unread,
Jun 25, 2013, 12:03:40 PM6/25/13
to list...@googlegroups.com
Valeu Rodrigo, então cara, fiz o que vc disse, mudei o cabecalhp e troque o ->consultar() pelo __call(), assim

    $rs = $cliente->__soapCall('Consultar', array("Protocolo" => "686104436"));
    echo"<pre>";
    print_r($rs);

agora ele está retornando alguma coisa, mas olha o que ele mostra
stdClass Object
(
    [ConsultarResult] => 999|O protocolo informado não é um número válido
)

só que com esse número no site da nfp eu encontro o arquivo que enviei, que tb foi enviado pelo site, ai não entendi nada.

outra coisa que observei é que no cabecalho que vc disse aonde tem CNPJ="cnpj", no lugar do cnpj eu posso colocar qualquer coisa(ex: passaro,gato,brasil) que ele sempre dá a mensagem 999|O protocolo informado não é um número válido    independente o usuario, cnpj, senha estarem errados, ai pensei nesse caso não teria que dar errado o   login e aparescer outra mensagem ?

Obrigado pela ajuda. até mais.

Jussan Bandeira

unread,
Jun 25, 2013, 12:29:23 PM6/25/13
to list...@googlegroups.com

Rodrigo Wanderley de Melo Cardoso

unread,
Jun 25, 2013, 1:21:04 PM6/25/13
to list...@googlegroups.com
Sim, parece que sim. Pelo que mostra você conseguiu conectar ao webservice, agora temos que entender o porque dele não estar retornando o que precisamos. Pela documentação, a gente percebe que o consultar também é um nó de XML. e você está passando um array. Ou seja??? Ele espera que o protocolo seja um XML. Por isso está dando esse retorno inválido.


--

Jussan Bandeira

unread,
Jun 25, 2013, 1:47:01 PM6/25/13
to list...@googlegroups.com
Consegui cara, depois do que vc disse que ele espera um xml tb, ai tentei assim, fiz que nem vc fez com o cabeçalho e era é isso mesmo,

$strConsulta = '<Consultar xmlns="https://www.nfp.sp.gov.br/ws">
                        <Protocolo>686103844</Protocolo>
                    </Consultar>';

    $consulta = new SoapVar($strConsulta,XSD_ANYXML);


    // o __soapCall() espera uma string e depois da virgula um array, se nao da erro
    $rs = $cliente->__soapCall('Consultar', array('Consultar'=> $consulta));
    echo"<pre>";
    print_r($rs);

Pô cara, MUITO OBRIGADO pela grande ajuda que vc me deu, ja tinha comprado um livro de web service em php, só nao chegou ainda.   

vou tentar enviar o arquivo, se eu não conseguir posto aqui de novo.

Obrigado Rodrigo.




Em segunda-feira, 24 de junho de 2013 15h12min57s UTC-3, Jussan Bandeira escreveu:

Rodrigo Wanderley de Melo Cardoso

unread,
Jun 25, 2013, 3:23:19 PM6/25/13
to list...@googlegroups.com
Fico muito feliz em ter ajudado. Qualquer coisa é só chamar.


--

Jussan Bandeira

unread,
Jun 25, 2013, 3:54:01 PM6/25/13
to list...@googlegroups.com
Consegui enviar tambêm, foi do mesmo jeito.
Muito obrigado cara.
 
vc e de sp mano ?


Em segunda-feira, 24 de junho de 2013 15h12min57s UTC-3, Jussan Bandeira escreveu:

Rodrigo Wanderley de Melo Cardoso

unread,
Jun 27, 2013, 8:24:40 AM6/27/13
to list...@googlegroups.com
De nada cara.
Sou do Rio. Mas moro em Campinas :)


--

Cesar Fernandes

unread,
Dec 2, 2014, 1:13:13 PM12/2/14
to list...@googlegroups.com
On Thursday, June 27, 2013 9:24:40 AM UTC-3, pokemaobr wrote:
> De nada cara.Sou do Rio. Mas moro em Campinas :)
Opa, tudo bem galera?


Estou criando um monitor e transmissor de arquivos ECF's... É tudo em PHP, eu até fiz uma interface em PHP, caso alguém precise, já ta pronto... https://github.com/cesar1983/NFP-ECF-PHP

Minha dúvida é com relação aos dados de autenticação. Estou testando isso com meus dados de CONSUMIDOR...ou seja, meu CPF e senha la da pagina da nota fiscal paulista.

Agora para a empresa que estou desenvolvendo isso, uma empresa grande com mais de 100 filiais. Quais dados eu uso nessa autenticação?

São dados deles (usuairo e senha), ou são dados que a empresa pra quem eu trabalho ( de desenvolvimento ) precisa ter? Eu leio e re-leio tudo e não consigo achar nem entender nada.


Valeu galera.


Reply all
Reply to author
Forward
0 new messages