Esta página apresenta trechos de códigos de uma aplicação Delphi que foi desenvolvida para consumir as funcionalidades da NS CT-e API.
Aplicação de exemplo
A aplicação de exemplo é um projeto Delphi que você pode fazer o download e utilizar como auxílio para o desenvolvimento dos códigos de suas aplicações. Na aplicação foram utilizados componentes que talvez não sejam nativos de sua IDE, mas você pode instalá-los seguindo estes tutoriais:
A não utilização dos componentes citados acima pode acarretar em erros de compilação.
No projeto existe o arquivo ‘CTeApiFuncoes.pas’, onde foram implementadas todas as funções da Api e este arquivo pode ser adicionado diretamente em seu sistema.
Clique no botão a seguir para fazer o download da aplicação:
Função enviaConteudoParaAPI
Essa é uma função genérica, que é utilizada por todas as outras funções do exemplo. Nela enviamos token, conteudo, url e informamos se o conteúdo é JSON ou TXT, para que seja realizada a comunicação com a API. Seu retorno é uma String contendo o JSON de resposta.
Caso ocorra alguma exceção no envio por POST, será retornado o código do erro e a resposta da API.enviaConteudoParaAPI
function enviaConteudoParaAPI(token: String; conteudo:TStringStream; url:String; isTxt: boolean): String;varretorno: String;HTTP: TIdHTTP; //Disponível na aba 'Indy Servers'beginHTTP := TIdHTTP.Create(nil);tryif isTxt then //Informa que vai mandar um TXTbeginHTTP.Request.ContentType := 'text/plain';endelse //Se for JSONbeginHTTP.Request.ContentType := 'application/json';end; //Avisa o uso de UTF-8HTTP.Request.ContentEncoding := 'UTF-8';//Adiciona o token ao headerHTTP.Request.CustomHeaders.Values['X-AUTH-TOKEN'] := token; //Faz o envio por POST do json para a urltryretorno := HTTP.Post(url, conteudo);excepton E:EIdHTTPProtocolException do Case HTTP.ResponseCode of//Se o json conter algum erro400: beginretorno := '400: ' + e.ErrorMessage;ShowMessage('Json inválido, verifique o retorno para mais informações');end;//Se o token não for enviado ou for inválido401: beginretorno := '401: ' + e.ErrorMessage;ShowMessage('Token não enviado ou inválido');end;//Se o token informado for inválido 403403: beginretorno := '403: ' + e.ErrorMessage;ShowMessage('Token sem permissão');end;//Se não encontrar o que foi requisitado404:beginretorno := '404: ' + e.ErrorMessage;ShowMessage('Não encontrado, verifique o retorno para mais informações');end;//Caso contrárioelseretorno := HTTP.ResponseText + ': ' + e.ErrorMessage;ShowMessage('Erro desconhecido, verifique o retorno para mais informações');end;end; finallyconteudo.Free();HTTP.Free();end;//Devolve o json de retorno da APIResult := retorno;end;
Emissão de CT-e
Essa função tem como parâmetros o token e o conteúdo a ser emitido. Com estas informações é criado o objeto a ser enviado, atribuída a URL de emissão e utilizada a função enviaConteudoParaAPI.emitirCTe
function emitirCTe(token, conteudo: String; isTxt: boolean): String;varconteudoEnviar: TStringStream;urlEnvio, retorno: String;beginconteudoEnviar := TStringStream.Create(UTF8Encode(conteudo));//Informa a url para onde deve ser enviadourlEnvio := 'https://cte.ns.eti.br/cte/issue';retorno := enviaConteudoParaAPI(token, conteudoEnviar, urlEnvio, isTxt);Result := retorno;end;
Status de processamento do CT-e
Essa função tem como parâmetros o token, a chave do CTe a ser consultado, seu número de recebimento e o tipo de ambiente emitido. Com estas informações é montado o JSON a ser enviado, atribuída a URL de emissão e utilizada a função enviaConteudoParaAPI.consultarStatusProcessamento
function consultarStatusProcessamento(token, chCTe, nRec, tpAmb: String): String;varjson: TStringStream;urlEnvio, retorno: String;begin//Monta o Jsonjson := TStringStream.Create('{' +'"X-AUTH-TOKEN": "' + token + '",' +'"chCTe": "' + chCTe + '",' +'"tpAmb": "' + tpAmb + '",' +'"nRec": "' + nRec + '"' +'}'); //Informa a url para onde deve ser enviadourlEnvio := 'https://cte.ns.eti.br/cte/issueStatus'; //Envia o json para a urlretorno := enviaCTe(token, json, urlEnvio); //Devolve o retorno da APIResult := retorno;end;
Download do CT-e
Essa função tem como parâmetros o token, a chave do CTe a ser realizado o download, tipo de ambiente,o tipo de download a ser realizado e um boolean se o PDF deve ser exibido na tela. Com estas informações é montado o JSON a ser enviado, atribuída a URL de emissão e utilizada a função enviaConteudoParaAPI. Em seguida, se o retorno da API for 200, realiza o download solicitado.
Você pode alterar o diretório onde será feito o download passando-o na variável caminho.downloadCTe
function downloadCTe(token, chCTe, tpAmb, tpDown: String; exibeNaTela: boolean): String;varjson: TStringStream;baixarXML, baixarPDF, baixarJSON: boolean;caminho, status, urlEnvio, retorno: String;begin//Monta o Jsonjson := TStringStream.Create('{' +'"X-AUTH-TOKEN": "' + token + '",' +'"chCTe": "' + chCTe + '",' +'"tpDown": "' + tpDown + '",' +'"tpAmb": "' + tpAmb + '"' +'}'); //Informa a url para onde deve ser enviadourlEnvio := 'https://cte.ns.eti.br/cte/get'; //Envia o json para a urlretorno := enviaCTe(token, json, urlEnvio); //Pega o status de retorno da requisiçãostatus := Copy(retorno, Pos('"status": ', retorno) + 11, 3); //Informa o diretorio onde salvar o arquivocaminho := ''; //Checa o que baixar com base no tpDown informadoif Pos('X', tpDown) <> 0 thenbaixarXML := true;if Pos('P', tpDown) <> 0 thenbaixarPDF := true;if Pos('J', tpDown) <> 0 thenbaixarJSON := true; //Se o retorno da API for positivo, salva o que foi solicitadoif status = '200' thenbegin//Checa se deve baixar XMLif baixarXML = true thensalvaXML(retorno, caminho, chCTe); //Checa se deve baixar JSONif baixarJSON = true then//Se não baixou XML, baixa JSONif baixarXML <> true thensalvaJSON(retorno, caminho, chCTe); //Checa se deve baixar PDFif baixarPDF = true thensalvaPDF(retorno, caminho, chCTe);//Caso tenha sido marcada a opção de de exibir em tela, abre o PDF salvoif exibeNaTela thenShellExecute(0, nil, PChar(caminho + chCTe + '-cte.pdf'), nil, nil, SW_SHOWNORMAL);endelsebeginShowmessage('Ocorreu um erro, veja o Retorno da API para mais informações');end; //Devolve o retorno da APIResult := retorno;end;
Cancelamento do CT-e
Essa função tem como parâmetros o token, a chave do CTe a ser cancelado, tipo de ambiente, número de protocolo e a justificativa*. Com estas informações e a data e hora atual**, é montado o JSON a ser enviado, atribuída a URL de emissão e utilizada a função enviaConteudoParaAPI.
*A justificativa deve ter pelo menos 15 caracteres.
**A data e hora são pegos do computador.cancelaCTe
function cancelaCTe(token, chCTe, tpAmb, nProt, xJust: String): String;varjson: TStringStream;dhEvento, urlEnvio, retorno: String;begin//Pega data, hora e concatena no formato predeterminadodhEvento := FormatDateTime('yyyy-mm-dd',Now) + 'T' + FormatDateTime('hh:mm:ss', Now); //Monta o Jsonjson := TStringStream.Create('{' +'"X-AUTH-TOKEN": "' + token + '",' +'"chCTe": "' + chCTe + '",' +'"tpAmb": "' + tpAmb + '",' +'"dhEvento": "' + dhEvento + '",' +'"nProt": "' + nProt + '",' +'"xJust": "' + xJust + '"' +'}'); //Informa a url para onde deve ser enviadourlEnvio := 'https://cte.ns.eti.br/cte/cancel'; //Envia o json para a urlretorno := enviaCTe(token, json, urlEnvio); //Devolve o retorno da APIResult := retorno;end;
CCE – Carta de Correção do CT-e
Essa função tem como parâmetros o token, a chave do CT-e a ser corrigido, o ambiente no qual foi emitido, o número de sequencia do evento e as informações a serem corrigidas(grupo, campo, valor e número do item). Com estas informações e a data e hora atual*, é montado o JSON a ser enviado, atribuída a URL de emissão e utilizada a função enviaConteudoParaAPI.
*A data e hora são pegos do computador.CCeCTe
function CCeCTe(token, chCTe, tpAmb, nSeqEvento, grupoAlterado, campoAlterado, valorAlterado, nroItemAlterado: String): String;varjson: TStringStream;dhEvento, urlEnvio, retorno: String;begin//Pega data, hora e concatena no formato predeterminadodhEvento := FormatDateTime('yyyy-mm-dd',Now) + 'T' + FormatDateTime('hh:mm:ss', Now); //Monta o Jsonjson := TStringStream.Create('{' +'"X-AUTH-TOKEN": "' + token + '",' +'"chCTe": "' + chCTe + '",' +'"tpAmb": "' + tpAmb + '",' +'"dhEvento": "' + dhEvento + '",' +'"nSeqEvento": "' + nSeqEvento + '",' +'"infCorrecao": [{' +'"grupoAlterado": "' + grupoAlterado + '",' +'"campoAlterado": "' + campoAlterado + '",' +'"valorAlterado": "' + valorAlterado + '",' +'"nroItemAlterado": "' + nroItemAlterado + '"}]' +'}'); //Informa a url para onde deve ser enviadourlEnvio := 'https://cte.ns.eti.br/cte/cce'; //Envia o json para a urlretorno := enviaCTe(token, json, urlEnvio); //Devolve o retorno da APIResult := retorno;end;