Skip to content
/ nfe Public

Bibliotecas para geração, validação, assinatura e transmissão de XMLs da NFe em Go

License

Notifications You must be signed in to change notification settings

frones/nfe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1a5347e · Jun 28, 2023

History

26 Commits
Oct 2, 2019
Oct 2, 2019
Jun 28, 2023
Oct 25, 2021
Nov 24, 2019
Nov 24, 2019
Nov 24, 2019
Nov 24, 2019
Jun 28, 2023
Jun 28, 2023
Jun 28, 2023
Nov 24, 2019
Nov 24, 2019
Nov 24, 2019
Nov 24, 2019
Nov 24, 2019
Jun 28, 2023
Jun 28, 2023

Repository files navigation

nfe

Bibliotecas para geração, validação, assinatura e transmissão de XMLs da NFe. Pretendo desenvolver essa biblioteca conforme a necessidade surgir. Por enquanto apenas as consultas de Status, NFe e Cadastro estão disponíveis.

Extraindo chaves de um certificado A1 (.pfx) para uso com o biblioteca

openssl pkcs12 -in certificado.pfx -out ~/client.pem -clcerts -nokeys -nodes
openssl pkcs12 -in certificado.pfx -out ~/key.pem -nocerts -nodes

Consulta NFe

Exemplo

package main

import (
	"encoding/json"
	"net/http"
	"fmt"

	"github.com/frones/nfe"
)

func main() {
	client, err := nfe.NewHTTPClient("~/client.pem", "~/key.pem")
	if err != nil {
		fmt.Printf("Erro na criação do HTTP Client e leitura do certificado. Detalhes: %v\n", err)
		return
	}
	ret, xmlfile, err := nfe.ConsultaNFe("12345678901234567890123456789012345678901234", nfe.Homologacao, client, func(req *http.Request) {req.Header.Set("User-Agent", "MyUA/1.0")})
	if err != nil {
		fmt.Printf("Erro na consulta da chave de acesso. Detalhes: %v\n", err)
		return
	}

	fmt.Printf("Objeto RetConsSitNFe: %v\n", ret)
	fmt.Printf("Arquivo XML: %v\n", string(xmlfile))

	jsonfile, err := json.Marshal(ret)
	if err != nil {
		fmt.Printf("Erro na serialização do json. Detalhes: %v\n", err)
		return
	}
	fmt.Printf("Arquivo JSON: %v\n", string(jsonfile))
}

Problemas de comunicação com a Sefaz-RS e ambientes virtuais SV-RS

Usando a crypto/tls padrão do Go, foi observado um problema intermitente de comunicação com os ambientes da Sefaz-RS, com resposta 403 sendo retornada. O problema acontece porque a crypto/tls não envia o certificado durante o handshake quando a CertificateRequest do servidor especifica autoridades certificadoras que não batem com a CA do certificado [source]. Outras Sefazes não enviam uma lista de CAs permitidas, não apresentando esse problema. Mesmo a Sefaz-RS, em algumas requests não envia lista de CAs permitidas, fazendo com que o problema seja intermitente.

Durante depuração, identifiquei que de fato, a CA do meu certificado não estava na lista de CAs permitidas pelo servidor, de maneira que faz sentido que a crypto/tls não envie, mas não fica claro porque outras bibliotecas, como a OpenSSL sempre funcionam.

Um workaround possível é compilar com uma versão alterada da crypto/tls sempre ignorando a instrução de CAs permitidas, mas isso pode ter outras consequencias indesejadas.

About

Bibliotecas para geração, validação, assinatura e transmissão de XMLs da NFe em Go

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages