Boa tarde senhores, trabalho na Sefaz GO e sou da equipe técnica da NFCe. Tomei a liberdade de fazer um cadastro neste fórum para evidenciar alguns pontos importantes sobre o envio da NFCe.
WSDL de Autorização de NFCe:
Homologação: https://homolog.sefaz.go.gov.br/nfe/services/v2/NfeAutorizacao?wsdl
Produção: shttps://sefaz.sefaz.go.gov.br/nfe/services/v2/NfeAutorizacao?wsdl
URL de consulta DANFE/NFCe*:
Homolgação: https://homolog.sefaz.go.gov.br/nfeweb/jsp/ConsultaDANFENFCe.jsf
Produção: https://nfe.sefaz.go.gov.br/nfeweb/jsp/ConsultaDANFENFCe.jsf
Schema de validação do QRCODE:
<xs:element name="qrCode">
<xs:annotation>
<xs:documentation>Texto com o QR-Code impresso no DANFE NFC-e</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:minLength value="100"/>
<xs:maxLength value="600"/>
<xs:pattern value="((HTTPS?|https?):\/\/.*\?chNFe=[0-9]{44}&nVersao=[0-9]{3}&tpAmb=[1-2](&cDest=([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?)?&dhEmi=[A-Fa-f0-9]{50}&vNF=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&vICMS=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&digVal=[A-Fa-f0-9]{56}&cIdToken=[0-9]{6}&cHashQRCode=[A-Fa-f0-9]{40})"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Certo, mas o que este esquema/regex quer dizer mesmo**?
((HTTPS?|https?):\/\/.*\?chNFe=[0-9]{44}&nVersao=[0-9]{3}&tpAmb=[1-2](&cDest=([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?)?&dhEmi=[A-Fa-f0-9]{50}&vNF=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&vICMS=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&digVal=[A-Fa-f0-9]{56}&cIdToken=[0-9]{6}&cHashQRCode=[A-Fa-f0-9]{40})/
1st Capturing group ((HTTPS?|https?):\/\/.*\?chNFe=[0-9]{44}&nVersao=[0-9]{3}&tpAmb=[1-2](&cDest=([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?)?&dhEmi=[A-Fa-f0-9]{50}&vNF=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&vICMS=(0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)&digVal=[A-Fa-f0-9]{56}&cIdToken=[0-9]{6}&cHashQRCode=[A-Fa-f0-9]{40})
2nd Capturing group (HTTPS?|https?)
1st Alternative: HTTPS?
HTTP matches the characters HTTP literally (case sensitive)
S? matches the character S literally (case sensitive)
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
2nd Alternative: https?
http matches the characters http literally (case sensitive)
s? matches the character s literally (case sensitive)
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
: matches the character : literally
\/ matches the character / literally
\/ matches the character / literally
.* matches any character (except newline)
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
\? matches the character ? literally
chNFe= matches the characters chNFe= literally (case sensitive)
[0-9]{44} match a single character present in the list below
Quantifier: {44} Exactly 44 times
0-9 a single character in the range between 0 and 9
&nVersao= matches the characters &nVersao= literally (case sensitive)
[0-9]{3} match a single character present in the list below
Quantifier: {3} Exactly 3 times
0-9 a single character in the range between 0 and 9
&tpAmb= matches the characters &tpAmb= literally (case sensitive)
[1-2] match a single character present in the list below
1-2 a single character in the range between 1 and 2
3rd Capturing group (&cDest=([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?)?
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
&cDest= matches the characters &cDest= literally (case sensitive)
4th Capturing group ([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
1st Alternative: [A-Za-z0-9.:+-\/)(]{0}
[A-Za-z0-9.:+-\/)(]{0} match a single character present in the list below
Quantifier: {0} Exactly 0 times (causing the token to be ignored)
A-Z a single character in the range between A and Z (case sensitive)
a-z a single character in the range between a and z (case sensitive)
0-9 a single character in the range between 0 and 9
.: a single character in the list .: literally
+-\/ a single character in the range between the following two characters
+ the literal character +
\/ the literal character /
)( a single character in the list )( literally
2nd Alternative: [A-Za-z0-9.:+-\/)(]{5,20}
[A-Za-z0-9.:+-\/)(]{5,20} match a single character present in the list below
Quantifier: {5,20} Between 5 and 20 times, as many times as possible, giving back as needed [greedy]
A-Z a single character in the range between A and Z (case sensitive)
a-z a single character in the range between a and z (case sensitive)
0-9 a single character in the range between 0 and 9
.: a single character in the list .: literally
+-\/ a single character in the range between the following two characters
+ the literal character +
\/ the literal character /
)( a single character in the list )( literally
&dhEmi= matches the characters &dhEmi= literally (case sensitive)
[A-Fa-f0-9]{50} match a single character present in the list below
Quantifier: {50} Exactly 50 times
A-F a single character in the range between A and F (case sensitive)
a-f a single character in the range between a and f (case sensitive)
0-9 a single character in the range between 0 and 9
&vNF= matches the characters &vNF= literally (case sensitive)
5th Capturing group (0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)
1st Alternative: 0
0 matches the character 0 literally
2nd Alternative: 0\.[0-9]{2}
0 matches the character 0 literally
\. matches the character . literally
[0-9]{2} match a single character present in the list below
Quantifier: {2} Exactly 2 times
0-9 a single character in the range between 0 and 9
3rd Alternative: [1-9]{1}[0-9]{0,12}(\.[0-9]{2})?
[1-9]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
1-9 a single character in the range between 1 and 9
[0-9]{0,12} match a single character present in the list below
Quantifier: {0,12} Between 0 and 12 times, as many times as possible, giving back as needed [greedy]
0-9 a single character in the range between 0 and 9
6th Capturing group (\.[0-9]{2})?
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
\. matches the character . literally
[0-9]{2} match a single character present in the list below
Quantifier: {2} Exactly 2 times
0-9 a single character in the range between 0 and 9
&vICMS= matches the characters &vICMS= literally (case sensitive)
7th Capturing group (0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?)
1st Alternative: 0
0 matches the character 0 literally
2nd Alternative: 0\.[0-9]{2}
0 matches the character 0 literally
\. matches the character . literally
[0-9]{2} match a single character present in the list below
Quantifier: {2} Exactly 2 times
0-9 a single character in the range between 0 and 9
3rd Alternative: [1-9]{1}[0-9]{0,12}(\.[0-9]{2})?
[1-9]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
1-9 a single character in the range between 1 and 9
[0-9]{0,12} match a single character present in the list below
Quantifier: {0,12} Between 0 and 12 times, as many times as possible, giving back as needed [greedy]
0-9 a single character in the range between 0 and 9
8th Capturing group (\.[0-9]{2})?
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
\. matches the character . literally
[0-9]{2} match a single character present in the list below
Quantifier: {2} Exactly 2 times
0-9 a single character in the range between 0 and 9
&digVal= matches the characters &digVal= literally (case sensitive)
[A-Fa-f0-9]{56} match a single character present in the list below
Quantifier: {56} Exactly 56 times
A-F a single character in the range between A and F (case sensitive)
a-f a single character in the range between a and f (case sensitive)
0-9 a single character in the range between 0 and 9
&cIdToken= matches the characters &cIdToken= literally (case sensitive)
[0-9]{6} match a single character present in the list below
Quantifier: {6} Exactly 6 times
0-9 a single character in the range between 0 and 9
&cHashQRCode= matches the characters &cHashQRCode= literally (case sensitive)
[A-Fa-f0-9]{40} match a single character present in the list below
Quantifier: {40} Exactly 40 times
A-F a single character in the range between A and F (case sensitive)
a-f a single character in the range between a and f (case sensitive)
0-9 a single character in the range between 0 and 9
Tem alguma coisa relevante aqui nesta regex? Sim, claro, TUDO. A expressão (regex) é o que determina ou não a validade na informação para o campo "qrCode", logo, qualquer coisa diferente do que é definido pela regex, é um valor inválido.
Meu emissor é Thin Client ou Fat Client?
Mesmo que seu emissor verifique uma série de regras do lado do cliente, ele jamais será fat client na perspectiva da NFe. Mas afinal, o que isto tem a ver? Quer dizer que as regras de validação são executadas do lado servidor. Logo, qualquer mensagem de erro diferente da listagem abaixo***, quer dizer que não é um erro do servidor da NFE:
REJEICAO_225_FALHA_SCHEMA_XML_NFE(225, "Rejeição: Falha no Schema XML do lote de NFe"),
REJEICAO_394_NFCE_SEM_INFORMACAO_QRCODE(394,"Rejeição: Nota Fiscal sem a informação do QR-Code"),
REJEICAO_395_ENDERECO_SITE_CONSULTA_QRCODE_DIFERENTE_PREVISTO(395,"Rejeição: Endereço do site da UF da Consulta via QRCode diverge do previsto"),
REJEICAO_396_PARAMETRO_QRCODE_INEXISTENTE(396,"Rejeição: Parâmetro do QR-Code inexistente"),
REJEICAO_397_PARAMETRO_QRCODE_DIVERGENTE_NFE(397,"Rejeição: Parâmetro do QR-Code divergente da Nota Fiscal"),
REJEICAO_398_PARAMETRO_QRCODE_NVERSAO_DIRERENTE_PREVISTO(398,"Rejeição Parâmetro nVersao do QR-Code difere do previsto"),
REJEICAO_399_PARAMETRO_IDENT_DEST_QRCODE_PARA_NFCE_SEM_IDENT_DEST(399,"Rejeição: Parâmetro de Identificação do destinatário no QR-Code para Nota Fiscal sem identificação do destinatário"),
REJEICAO_462_CODG_IDENTIF_CSC_NO_QRCODE_NAO_CADASTRADO_SEFAZ(462,"Rejeição: Código Identificador do CSC no QR-Code não cadastrado na SEFAZ"),
REJEICAO_463_CODG_IDENTIF_CSC_NO_QRCODE_REVOGADO(463,"Rejeição: Código Identificador do CSC no QR-Code foi revogado pela empresa"),
REJEICAO_464_CODG_HASH_QRCODE_DIFERENTE_DO_CALCULADO(464,"Rejeição: Código de Hash no QR-Code difere do calculado"),
REJEICAO_999_ERRO_NAO_CATALOGADO(999, "Rejeição: Erro não catalogado");
Mas um minuto, estou tendo erro aqui no meu cliente, o que fazer?
Verifique seu programa, pode ser que esteja passando algum pequeno detalhe que está ferrando com sua lógica. Um exemplo? Sim, tomei a liberdade de pegar um erro mencionado logo acima:
É uma falha do servidor da NFe? Não.
Mas por que não? Porque este xml nem mesmo foi enviado para o servidor NFe.
Mas por que não? Porque se tivesse sido enviado, você receberia uma mensagem de erro de acordo com as mencionadas acima
Certeza? Sim, porque está claro aqui: failed to parse
Mas o que isso quer dizer? Quer dizer que, ao fazer o parse do seu XML para o envio ao servidor NFe, alguma coisa deu errado.
Mas como eu sei se é um erro no meu cliente ou um erro do meu servidor? As mensagens acima responde esta pergunta.
Meu cliente está certo, até que prove o contrário!
Vamos lá, analisando a imagem, é perceptível que este XML não é válido de acordo com o schema definido, infelizmente não tenho o XML deste exemplo, mas quem postou este erro, pode enviar que pontualmente vou explicar o porque não é válido.
Não é falha do servidor, é uma falha do cliente.
O que está de errado então: schema
Então prove! Vejam o resumo do schema:
chNFe= matches the characters chNFe= literally (case sensitive)
[0-9]{44}
&nVersao= matches the characters &nVersao= literally (case sensitive)
[0-9]{3}
&tpAmb= matches the characters &tpAmb= literally (case sensitive)
&cDest= matches the characters &cDest= literally (case sensitive)
4th Capturing group ([A-Za-z0-9.:+-\/)(]{0}|[A-Za-z0-9.:+-\/)(]{5,20})?
&dhEmi= matches the characters &dhEmi= literally (case sensitive)
[A-Fa-f0-9]{50}
&vNF= matches the characters &vNF= literally (case sensitive)
5th Capturing group (0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?
&vICMS= matches the characters &vICMS= literally (case sensitive)
7th Capturing group (0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?
&digVal= matches the characters &digVal= literally (case sensitive)
[A-Fa-f0-9]{56}
&cIdToken= matches the characters &cIdToken= literally (case sensitive)
[0-9]{6}
&cHashQRCode= matches the characters &cHashQRCode= literally (case sensitive)
[A-Fa-f0-9]{40}
Observaram o que diz aí na regex?
&nVersao= literally (case sensitive)
&tpAmb= literally (case sensitive)
&cDest= literally (case sensitive)
&dhEmi= literally (case sensitive)
(...)
&cHashQRCode= literally (case sensitive)
Este literally (case sensitive) quer dizer nada mais nada menos do que: é obrigatório você enviar estas chaves EXATAMENTE como descrito, é string literal.
Qualquer coisa diferente do exposto na regex/schema, vai resultar em algum erro, seja ele no servidor (REJEICAO_225_FALHA_SCHEMA_XML_NFE por exemplo) ou no lado do cliente (failed to parse por exemplo.. vai saber).
E o que dizer do erro do tipo:
Schema XML: The 'http://www.portalfiscal.inf.br/nfe:qrCode' element is invalid - The value 'http://homolog.sefaz.go.gov.br/nfeweb/jsp/ConsultaDANFENFCe.jsf?&chNFe=52160613254469000107650010000000241000000245&nVersao=100&tpAmb=2&dhEmi=323031362D30362D31325431343A33373A30392D30333A3030&vNF=17.95&vICMS=0.00&digVal=5243506254416D38336351744476423232506E57774C48594139673D&cIdToken=000001&cHashQRCode=700963086728091A35A9A162C9693768A162070A' is invalid according to its datatype 'String' - The Pattern constraint failed.
Caminho: NFe[1]/infNFeSupl/qrCode/
Tomei a liberdade de colocar este erro aqui também, logo, digo exatamente a mesma coisa, é um XML inválido, só de olhar percebe-se um '&zinho' na string na tag qrCode;
Ora, mas então o que fazer pra esse XML ser válido? Siga exatamente o que está descrito no schema!
Tem um exemplo? Sim, baseado no ultimo xml****:
<qrCode>
https://homolog.sefaz.go.gov.br/nfeweb/jsp/ConsultaDANFENFCe.jsf?
&chNFe=52160613254469000107650010000000241000000245
&nVersao=100
&tpAmb=2
&dhEmi=323031362D30362D31325431343A33373A30392D30333A3030
&vNF=17.95
&vICMS=0.00
&digVal=5243506254416D38336351744476423232506E57774C48594139673D
&cIdToken=000001
&cHashQRCode=700963086728091A35A9A162C9693768A162070A
</qrCode>
Resumo da ópera: as falhas abordadas aqui, são erros relacionados a validação de schema, no cliente. Façam a correção de acordo com o exposto e tudo deve funcionar de acordo com o esperado.
Cara, sua explicação foi uma mer**, pode me explicar isso direito? Claro, me envie um e-mail no
[email protected] que terei o maior prazer em atende-lô.
Bônus: Como Resolver o Erro: 'Server returned HTTP responde code 415' ou 'HTTP protocol error: 415 Unsupported Media Type'
Os serviços são disponibilizados para consumo através do protocolo SOAP over HTTPS. Após a disponibilização em produção no novo ambiente, qualquer coisa diferente de SOAP 1.2 não será aceito (não foi eu que inventei isso hein.. está no Manual técnico da NFe!)
Coisas pra compartilhar:
Validador NFe: https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx
Validador Regex: https://regex101.com/
Manuais/NTs NFe: https://www.nfe.fazenda.gov.br/portal/
* ainda não foi disponibilizado para consulta, embora já esteja definido;
** as barras (/) foram escapadas (\/) na explicação da regex;
*** algumas mensagens relevantes para este contexto;
**** quebras de linhas realizadas para melhor visualização.
Apenas pra ser justo, uma pequena correção: o segundo erro pode ser um erro da validação no servidor.
Schema XML: The 'http://www.portalfiscal.inf.br/nfe:qrCode' element is invalid - The value 'http://homolog.sefaz.go.gov.br/nfeweb/jsp/ConsultaDANFENFCe.jsf?&chNFe=52160613254469000107650010000000241000000245&nVersao=100&tpAmb=2&dhEmi=323031362D30362D31325431343A33373A30392D30333A3030&vNF=17.95&vICMS=0.00&digVal=5243506254416D38336351744476423232506E57774C48594139673D&cIdToken=000001&cHashQRCode=700963086728091A35A9A162C9693768A162070A' is invalid according to its datatype 'String' - The Pattern constraint failed.
Caminho: NFe[1]/infNFeSupl/qrCode/
Ultima: Meu schema está válido, porque não autoriza? Certamente é uma regra de negócio que rejeita sua nota, mas fique tranquilo, se tudo der certo, nós te avisamos sobre o erro através das mensagens!
Ps.: Se der 999 ai ferr**.