Estou implementando uma integração com a solução webservice de João Pessoa com nusoap, mas com erro, alguém tem algum exemplo de como fazer a chamada no webservice de João Pessoa?
desde já agradeço.
Estou implementando uma integração com a solução webservice de João Pessoa com nusoap, mas com erro, alguém tem algum exemplo de como fazer a chamada no webservice de João Pessoa?
desde já agradeço.
Primeiramente, você precisa de um certificado digital de uma empresa que esteja habilitada a emitir notas na prefeitura.
Caso contrário não consegue nem acessar o endereço do webservice.
Qual modelo segue a prefeitura de João Pessoa?
Tenho um modelo funcional para a prefeitura de Betim-MG que utiliza o ginfes!
Obrigado pela resposta, a empresa que estou implementando tem um certificado.
já tentei ligar lá varias vezes mas não atenderam.
estou tentando fazer a chamada via nusoap em php e já
trecho do codigo…
$endpoint =“https://sispmjp.joaopessoa.pb.gov.br:8443/sispmjp/NfseWSService”;
/**/
//$xml_assinado = file_get_contents($dir_arquivo_ass.$xml_ass);
$client = new SoapClient(null, array('location' => $endpoint, 'uri' => $endpoint, 'trace' => true, 'connection_timeout' => 5));
$error = $client->getError();
if ($error) {
echo "<h2>Error na conexao </h2><pre>" . $error . "</pre>";
}
$xml = trim($xml_assinado);
$request = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="https://sispmjp.joaopessoa.pb.gov.br:8443/sispmjp/NfseWSService/">
<soapenv:Header/>
<soapenv:Body>
<ser:GerarNfse>
<XML><![CDATA['.$xml.']]></XML>
</ser:GerarNfse>
</soapenv:Body>
</soapenv:Envelope>';
$result = $client->__doRequest($request, $endpoint, "", SOAP_1_1);
if ($client->fault) {
echo "<h2>Fault ....</h2><pre>";
var_dump($result);
echo "</pre>";
}else{
echo 'else';
var_dump($result);
//cria o status de envio
setStautsXml($var_cod_xml, 3);
//atualiza o campo com o xml de retorno
setXmlRetorno($var_cod_xml,utf8_encode($result['RecepcionarLoteRpsResponse']));
//mostra o protocolo
$res = new SimpleXMLElement($result['RecepcionarLoteRpsResponse']);
echo "PROTOCOLO DO ENVIO: ".$res->Protocolo."<br>";
$cont++;
}
Obrigado pela sua ajuda, Pelos contatos que fiz com a prefeitura de João Pessoa eles desenvolveram a solução deles e não roda em nenhuma outra cidade.
Acredito que usando nusoap você não vai conseguir.
Com o cURL é simples.
A diferença é que precisa usar o certificado para se comunicar com o servidor.
Não é apenas para assinar o XML.
Precisa converter o certificado de PFX para PEM.
Se você não sabe fazer isso em PHP, pode usar esse site:
https://www.sslshopper.com/ssl-converter.html
Para enviar o XML usando CURL:
$headers = array(
"Content-type: text/xml; charset=utf-8",
"SOAPAction: RecepcionarLoteRpsV3",
"Content-length: ".strlen($envelope),
"Expect:"
);
$url = "https://sispmjp.joaopessoa.pb.gov.br:8443/sispmjp/NfseWSService";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope); //SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
//SSL
$cert_dir = dirname(dirname($this->rps_dir))."/cert";
$keyFile = "$cert_dir/pkey.pem";
$caFile = "$cert_dir/ca.pem";
$certFile = "$cert_dir/cert.pem";
$certPass = file_get_contents("$cert_dir/pass.txt");
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
//curl_setopt($ch, CURLOPT_CAINFO, $caFile);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $certPass);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// Converte
//$html = utf8_decode(curl_exec($ch)); --converte de UTF-8 para ISO-8859
$html = curl_exec($ch);
if($html === false){
$return->data['errors'][] = [
"codigo" => 500,
"mensagem" => curl_error($ch),
"correcao" => ""
];
return $return;
}
//Envio
$sentHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT);
file_put_contents("$fname.env", "$sentHeaders \n $envelope");
//curl info
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
//Retorno
file_put_contents("$fname.ret", $html);
//Fechar curl
curl_close($ch);
$return->status = $httpcode;
if ($httpcode!=200){
preg_match_all('/<faultstring>(.*?)<\/faultstring>/s', html_entity_decode($html), $matches);
$response = (count($matches)&&count($matches[1])?$matches[1][0]:$html);
$return->data['errors'][] = [
"codigo" => $httpcode,
"mensagem" => $response,
"correcao" => ""
];
return $return;
}
//Extrai o XML
$html = html_entity_decode(file_get_contents("$fname.ret"));
preg_match_all('/<return>(.*?)<\/return>/s', html_entity_decode($html), $matches);
$response = (count($matches)&&count($matches[1])?$matches[1][0]:$html);
A variável $envelope
é o XML já transformado para chamada SOAP.
Esse aqui é um exemplo de cabeçalho da GINFES.
$envelope =
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:pro=\"http://producao.ginfes.com.br\">\n".
"<soapenv:Body>\n".
"<pro:RecepcionarLoteRpsV3>\n".
"<arg0>%CabMsg%</arg0>\n".
"<arg1>%DadMsg%</arg1>\n".
"</pro:RecepcionarLoteRpsV3>".
"</soapenv:Body>".
"</soapenv:Envelope>";
$xml = $this->rpsAsXML();
$envelope = str_replace('%CabMsg%', $this->cabecalho, $envelope);
$envelope = str_replace('%DadMsg%', $this->toLiteral($xml), $envelope);
file_put_contents("$fname", $xml);
Rotinas auxiliares:
private function fromLiteral($docxml)
{
$docxml = str_replace('<', '<', $docxml);
$docxml = str_replace('>', '>', $docxml);
return $docxml;
}
private function toLiteral($docxml)
{
//$docxml = str_replace('&', '&', $docxml);
$docxml = str_replace('<', '<', $docxml);
$docxml = str_replace('>', '>', $docxml);
return $docxml;
}
Essa variável cabecalho você tem o xml dela?
Desculpe a demora:
<cabecalho versao="1.00">
<versaoDados>1.00</versaoDados>
</cabecalho>
Outro detalhe é o namespace no XML.
Isso quebra as pernas, pois não é explícito.
Segue o XML da consulta de notas por período:
<nfse:ConsultarNfseServicoPrestadoEnvio xmlns:nfse="http://www.abrasf.org.br/nfse.xsd">
<nfse:Prestador>
<nfse:CpfCnpj>
<nfse:Cnpj>{$cnpj}</nfse:Cnpj>
</nfse:CpfCnpj>
<nfse:InscricaoMunicipal>{$im}</nfse:InscricaoMunicipal>
</nfse:Prestador>
<nfse:PeriodoCompetencia>
<nfse:DataInicial>{$data_inicio}</nfse:DataInicial>
<nfse:DataFinal>{$data_fim}</nfse:DataFinal>
</nfse:PeriodoCompetencia>
<nfse:Pagina>1</nfse:Pagina>
</nfse:ConsultarNfseServicoPrestadoEnvio>
Onde a data é no formato: "yyyy-mm-dd"