SMARAPD ituiutaba MG

Boa tarde, a prefeitura de Ituiutaba-MG acabou de mudar pra SMARAPD e não temos informações de nada, gostaria de saber se algum ja fez e pode ajudar com alguns modelos de utilização,
envelope, crul, cabeçalho, no aguardo.

A SMARAPD é uma empresa de São José do Rio Preto.

Ela atende com mais frequência no Espirito Santo:
Cariacica, Guarapari e Serra.

Um manual que tem é esse:
http://servicos-pmg.guarapari.es.gov.br:9999/tbw/docs/MANUAL_INTEGRACAO_WS.pdf

Outro lugar onde você pode achar todos esses dados é no ACBR:

Dentro da pasta ArqINI tem as configurações
Smarapd.ini
SmarAPDABRASF.ini

E dentro de :
https://github.com/GabrielF7/ACBrTrunk2/blob/master/Fontes/ACBrDFe/ACBrNFSe/Provedores/ACBrProvedorSMARAPD.pas

Está a lógica do envio.

muito obrigado, vou dar uma lida no material, existe algo em php que vc tinha conhecimento.??

Grato,

Não vi nada em PHP.

Mas se o ACBR conseguiu, qualquer um pode.

Eu desenvolvi um webservice inspirado no enotasgw.com.br.
Onde você envia os dados via JSON e o webservice conversa com a solução da prefeitura e gera a nota.

Vou implementar para um cliente em Guarapari.
Assim que estiver pronto, dou notícias.

Com a ajuda postada anteriormente, consegui progredir um pouco.
Após alguns dias afastado do projeto, voltei e estou testando, mas sempre me retorna “Resource id #106” e o status sempre esta 0.

segue o código pra possível analise.

$XmlAssinado = htmlentities(file_get_contents($arquivoRPSAssinado));
        $cabecalho = htmlentities('<![CDATA[<?xml version="1.0" encoding="UTF-8"?><cabecalho xmlns="http://www.abrasf.org.br/nfse.xsd" versao="2.04"><versaoDados>2.04</versaoDados></cabecalho>]]>');
        
        
        $envelope = '<?xml version="1.0" encoding="UTF-8"?>
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://nfse.abrasf.org.br">
               <soapenv:Header/>
               <soapenv:Body>
                  <nfse:RecepcionarLoteRpsRequest>
                     <nfseCabecMsg>'.$cabecalho.'</nfseCabecMsg>
                     <nfseDadosMsg>'.$XmlAssinado.'</nfseDadosMsg>
                  </nfse:RecepcionarLoteRpsRequest>
               </soapenv:Body>
            </soapenv:Envelope>
        ';

        $url = 'https://201.72.16.150/tbwhomolog/services/nfseSOAP?wsdl'; // prefeitura ituiutaba smarapd
        
        $headers = array(
                "Content-type: text/xml; charset=utf-8",
                "SOAPAction: RecepcionarLoteRps", 
                "Content-length: ".strlen($envelope),
        );

        $certFile = 'nfse_homolog.cer';

        $ch = curl_init();          
        
        $ur1 = curl_setopt($ch, CURLOPT_URL, $url);
        if (FALSE == $ur1) {
            echo "Erro 1<br>";
        }
        
        $ur2 = curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if (FALSE == $ur2) {
            echo "Erro 2<br>";
        }
        
        $ur3 = curl_setopt($ch, CURLOPT_TIMEOUT, 300);
        if (FALSE == $ur3) {
            echo "Erro 3<br>";
        }
        
        $ur4 = curl_setopt($ch, CURLOPT_SSLCERT, $certFile); 
        if (FALSE == $ur4) {
            echo "Erro 4<br>";
        }
        
        $ur5 = curl_setopt($ch, CURLOPT_POST, true);
        if (FALSE == $ur5) {
            echo "Erro 5<br>";
        }
        
        $ur6 = curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope); 
        if (FALSE == $ur6) {
            echo "Erro 6<br>";
        }
        
        $ur7 = curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        if (FALSE == $ur7) {
            echo "Erro 7<br>";
        }
        
        $status_code=curl_getinfo($ch, CURLINFO_HTTP_CODE);
        echo "status code --> $status_code" . "<br>";
        
        echo $ch.'<br>';
        //echo var_dump($ch);
        
        $html = utf8_decode(curl_exec($ch));
        //echo $ch.'<br>t<br>';
        //echo $html.'<br>t<br>';
        
        $retorno = substr($arquivoRPSAssinado,0,-4);
        file_put_contents($retorno."_ret.xml", $html);
        curl_close($ch);
        
        preg_match_all('/<outputXML>(.*?)<\/outputXML>/s', $html, $matches);
        $response = html_entity_decode(count($matches)&&count($matches[1])?$matches[1][0]:$html);

        echo "<pre>$response</pre>"; 
        
        exit;

Grato,

Esse bloco deve vir depois do curl_exec($ch) e antes do curl_close($ch).
Você ainda não executou a chamada.

Verificando aqui, o certificado do site não é válido.
Pois não tem um domínio, apenas o IP.
Você precisa nesse caso informar ao cURL que é para ignorar.

Segue exemplo abaixo:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 300);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    curl_setopt($ch, CURLOPT_SSLCERT, $certFile);  
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    // Converte
    //$html = utf8_decode(curl_exec($ch)); --converte de UTF-8 para ISO-8859
    $html = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    $return->status = $httpcode;

    file_put_contents("$fname.ret", $html);

    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;
    }