Boa Tarde a Todos sou novo aqui no fórum e utilizo algumas classes do
NFe,
Estou precisando de uma luz, pois já estou alguns dias tentanto
resolver esse problema sem sucesso.
Vou mostrar todos os passos que executo até chegar a mensagem de erro.
Tenho um sistema com geração de Pedidos, onde realizo o pedido. Na
sequencia peço uma exportação desse pedido para uma outra base para a
preparação da NFe.
Na interface do sistema tenho um botão para Gerar o XML todo baseado
em BD(extração dos dados via mysql), onde para simples conferência do
xml acesso esse site
http://www.sefaz.rs.gov.br/nfe/nfe-val.aspx e
colo o xml e obtenho essa resposta:
PARSER XML: OK
TIPO DE MENSAGEM: NF-e sem assinatura digital
SCHEMA: OK
ASSINATURA XML: Mensagem não assinada
Até aqui beleza, na sequencia tenho outro botão que peço para assinar
o xml baseado na classe ToolsNFePHP.class.php, onde sobreescrevo o xml
com a assinatura, e peo novamente o xml com assinatura e acesso esse
site
http://www.sefaz.rs.gov.br/nfe/nfe-val.aspx e colo o xml e
obtenho essa resposta:
PARSER XML: OK
TIPO DE MENSAGEM: NF-e
SCHEMA: OK
ASSINATURA XML: Assinatura VÁLIDA
Lembrando que a função LoadCerts tá criando normalmente os arquivos
pem.
Agora que vem o meu problema:
Tenho um outro botão que preciso transmitir a nota para o SEFAZ com o
seguinte código:
<?
include("../includes/confwebnfe.php");
$valor_chave = $_REQUEST["ide_id"];
$sql_ide = "Select * from ide where xide_id=$valor_chave";
$res_ide = mysql_query($sql_ide,$conexao2);
while($dados_ide = mysql_fetch_array($res_ide)){
$chave = $dados_ide["chave"];
$xnNF = $dados_ide["xnNF"];
}
require_once('ToolsNFePHP.class.php');
$nfe = new ToolsNFePHP;
$arqxml = '../xml/'.$chave.'-nfe.xml';
if (is_file($arqxml) ) {
$nfefile = file_get_contents($arqxml);
$num = $xnNF; //usei o numero da NF como id do lote este numero
pode ser extraido diretamente do nome desse arquivo
//enviar as notas
if ($ret = $nfe->sendLot($nfefile,$num,$chave)){
if ($ret['status']) {
$msg = "<td align=center width=100%>SUCESSO !! " .
$ret['cStat'] . "Motivo : " . $ret['xMotivo'] . "<BR>Aguarde alguns
segundos e consulte a situação da NFe <BR></td>";
$sql_controle = "update controle set tran_xml='1' where
ide_id=".$valor_chave;
mysql_query($sql_controle,$conexao2);
} else {
$msg = "<td align=center width=100%>FALHA no envio !
cStat : " . $ret['cStat'] . "Motivo : " . $ret['xMotivo'] . "<BR></
td>";
}
} else {
$msg = "<td align=center width=100%>FALHA no metodo de envio !
</td>";
}
} else {
$msg = "<td align=center width=100%>Arquivo não encontrado !</
td>";
}
?>
Automaticamente me retorna a seguinte mensagem "FALHA no metodo de
envio !"
Ao verificar o arquivo numerodachave-rec.xml tenho o seguinte
conteudo:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="
http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="
http://www.w3.org/2001/
XMLSchema"><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Sender</
soap:Value></soap:Code><soap:Reason><soap:Text xml:lang="en">Unable to
handle request without a valid action parameter. Please supply a valid
soap action.</soap:Text></soap:Reason><soap:Detail/></soap:Fault></
soap:Body></soap:Envelope>
Vou colocar as funções que estou utilizando para fazer o SOAP
Função SENDLOT
public function sendLot($aNFe,$idLote,$chave) {
//variavel de retorno do metodo
$aRet = array('cStat'=>'','xMotivo'=>'');
// carga das variaveis da funçao do webservice envio de Ne em
lote
//identificação do serviço
$servico = 'NfeRecepcao';//2'.;
//recuperação da versão
$versao = '2.00';
//recuperação da url do serviço
$urlsefaz = '
https://homologacao.nfe.sefaz.rs.gov.br/ws/
NfeRecepcao/NfeRecepcao2.asmx';
//recuperação do método
$metodo = 'nfeRecepcaoLote2';
//montagem do namespace do serviço
//$namespace = $this->URLPortal.'/wsdl/'.$servico.'2';
$namespace = '
http://www.portalfiscal.inf.br/nfe/wsdl/
NfeRecepcao2';
$ambiente = '2';
// limpa a variavel
$sNFe = $aNFe;
//montagem do cabeçalho da comunicação SOAP
$cabecalho = '<nfeCabecMsg xmlns="'. $namespace . '"><cUF>'.
$this->cUF.'</cUF><versaoDados>' . $versao . '</versaoDados></
nfeCabecMsg>';
//montagem dos dados da mensagem SOAP
$dados = '<nfeDadosMsg><enviNFe xmlns="' . $this->URLPortal .
'" xmlns:xsi="' . $this->URLxsi . '" xmlns:xsd="'. $this->URLxsd . '"
versao="' . $versao . '"><idLote>' . $idLote . '</idLote>' . $sNFe .
'</enviNFe></nfeDadosMsg>';
//envia dados via SOAP
$retorno = $this->__sendSOAP2($urlsefaz,$namespace,$cabecalho,
$dados,$metodo,$ambiente);
//verifica o retorno do SOAP
if ( trim($retorno) || is_array($retorno) ) {
//pega os dados do array retornado pelo NuSoap
if(is_array($retorno)){
$xmlresp = utf8_encode($retorno[$this->aURL[$wsdl]
['service'].'Result']);
if ($xmlresp == ''){
//houve uma falha na comunicação SOAP
$this->errStatus = true;
$this->errMsg = 'Houve uma falha na comunicação
SOAP!!';
return FALSE;
}
}else{
$xmlresp = $retorno;
}
//tratar dados de retorno
$doc = new DOMDocument(); //cria objeto DOM
$doc->formatOutput = false;
$doc->preserveWhiteSpace = false;
$doc->loadXML($xmlresp,LIBXML_NOBLANKS |
LIBXML_NOEMPTYTAG);
// status do recebimento ou mensagem de erro
$aRet['cStat'] = $doc->getElementsByTagName('cStat')-
>item(0)->nodeValue;
$aRet['xMotivo'] = $doc->getElementsByTagName('xMotivo')-
>item(0)->nodeValue;
//salvar o xml retornado do SEFAZ na pasta de arquivos
temporários
$nome = $this->temDir.$chave.'-rec.xml';
$nome = $doc->save($nome);
} else {
$this->errStatus = true;
$this->errMsg = 'Nao houve retorno do Soap!!';
return FALSE;
}
// em caso de fracasso cStat != 103
if ( $aRet['cStat'] != '103'){
$this->errStatus = TRUE;
$this->errMsg = 'Lote não aceito pelo SEFAZ!!';
return FALSE;
}
return $aRet;
}
Função SENDSOAP2
protected function __sendSOAP2($urlsefaz,$namespace,$cabecalho,
$dados,$metodo,$ambiente){
$data = '';
$data .= '<?xml version="1.0" encoding="utf-8"?>';
$data .= '<soap:Envelope xmlns:soap="
http://www.w3.org/2003/05/
soap-envelope" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema">';
$data .= '<soap:Header>';
$data .= $cabecalho;
$data .= '</soap:Header>';
$data .= '<soap:Body>';
$data .= $dados;
$data .= '</soap:Body>';
$data .= '</soap:Envelope>';
$metodo = '#' . $metodo;
//[Informational 1xx]
$cCode['100']="Continue";
$cCode['101']="Switching Protocols";
//[Successful 2xx]
$cCode['200']="OK";
$cCode['201']="Created";
$cCode['202']="Accepted";
$cCode['203']="Non-Authoritative Information";
$cCode['204']="No Content";
$cCode['205']="Reset Content";
$cCode['206']="Partial Content";
//[Redirection 3xx]
$cCode['300']="Multiple Choices";
$cCode['301']="Moved Permanently";
$cCode['302']="Found";
$cCode['303']="See Other";
$cCode['304']="Not Modified";
$cCode['305']="Use Proxy";
$cCode['306']="(Unused)";
$cCode['307']="Temporary Redirect";
//[Client Error 4xx]
$cCode['400']="Bad Request";
$cCode['401']="Unauthorized";
$cCode['402']="Payment Required";
$cCode['403']="Forbidden";
$cCode['404']="Not Found";
$cCode['405']="Method Not Allowed";
$cCode['406']="Not Acceptable";
$cCode['407']="Proxy Authentication Required";
$cCode['408']="Request Timeout";
$cCode['409']="Conflict";
$cCode['410']="Gone";
$cCode['411']="Length Required";
$cCode['412']="Precondition Failed";
$cCode['413']="Request Entity Too Large";
$cCode['414']="Request-URI Too Long";
$cCode['415']="Unsupported Media Type";
$cCode['416']="Requested Range Not Satisfiable";
$cCode['417']="Expectation Failed";
//[Server Error 5xx]
$cCode['500']="Internal Server Error";
$cCode['501']="Not Implemented";
$cCode['502']="Bad Gateway";
$cCode['503']="Service Unavailable";
$cCode['504']="Gateway Timeout";
$cCode['505']="HTTP Version Not Supported";
$tamanho = strlen($data);
$parametros = Array('Content-Type: application/soap
+xml;charset=utf-8','SOAPAction: "'.$metodo.'"',"Content-length:
$tamanho");
$_aspa = '"';
$oCurl = curl_init();
if(is_array($this->aProxy)){
curl_setopt($oCurl, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($oCurl, CURLOPT_PROXYTYPE, "CURLPROXY_HTTP");
curl_setopt($oCurl, CURLOPT_PROXY, $this->aProxy['IP'].':'.
$this->aProxy['PORT']);
if( $this->aProxy['PASS'] != '' ){
curl_setopt($oCurl, CURLOPT_PROXYUSERPWD, $this-
>aProxy['USER'].':'.$this->aProxy['PASS']);
curl_setopt($oCurl, CURLOPT_PROXYAUTH,
"CURLAUTH_BASIC");
} //fim if senha proxy
}//fim if aProxy
curl_setopt($oCurl, CURLOPT_URL, $urlsefaz.'');
curl_setopt($oCurl, CURLOPT_PORT , 443);
curl_setopt($oCurl, CURLOPT_VERBOSE, 1);
//curl_setopt($oCurl, CURLOPT_HEADER, 1); //retorna o cabeçalho de
resposta
curl_setopt($oCurl, CURLOPT_SSLVERSION, 3);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($oCurl, CURLOPT_SSLCERT, $this->pubKEY);
curl_setopt($oCurl, CURLOPT_SSLKEY, $this->priKEY);
curl_setopt($oCurl, CURLOPT_POST, 1);
curl_setopt($oCurl, CURLOPT_POSTFIELDS, $data);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($oCurl, CURLOPT_HTTPHEADER,$parametros);
//echo '<PRE>';
//echo htmlspecialchars($data);
//echo '</PRE><BR>';
//print_r($headers);
//echo '<BR>';
$__xml = curl_exec($oCurl);
//echo '<PRE>';
//echo htmlspecialchars($__xml);
//echo '</PRE><BR>';
$info = curl_getinfo($oCurl); //informações da conexão
//echo '</PRE><BR>';
//print_r($info);
//echo '<BR>';
//echo '</PRE><BR>';
if ($__xml === false){
//não houve retorno
$this->errMsg = curl_error($oCurl) . $info['http_code'] .
$cCode[$info['http_code']];
$this->errStatus = true;
} else {
//houve retorno mas ainda pode ser uma mensagem de erro do
webservice
$this->errMsg = $info['http_code'] .
$cCode[$info['http_code']];
$this->errStatus = false;
}
curl_close($oCurl);
return $__xml;
}
Não sei mais nem onde procurar...
Abs