Node.js xmlbuilder2生成XML提交SEFAZ遇Error394:缺失QR码信息
解决SEFAZ NFC-e提交Error 394(缺失QR-Code信息)问题
可能的原因及对应调整方案
1. <infNFeSupl>标签层级错误
SEFAZ的NFC-e规范要求<infNFeSupl>必须是<NFe>标签的直接子节点,与<infNFe>同级,不能嵌套在<infNFe>或其他标签内部。正确的XML结构示例:
<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe"> <NFe> <infNFe>...</infNFe> <infNFeSupl> <qrCode>...</qrCode> <urlChave>...</urlChave> </infNFeSupl> </NFe> <protNFe>...</protNFe> </nfeProc>
调整:检查xmlbuilder2的代码逻辑,确保将<infNFeSupl>添加到<NFe>节点下,而非<infNFe>节点内。
2. XML不符合官方XSD Schema约束
SEFAZ对NFC-e的XML结构有严格的Schema校验,可能存在以下问题:
- 缺少根节点的命名空间声明(必须包含
xmlns="http://www.portalfiscal.inf.br/nfe") - 标签大小写错误(必须严格使用小写的
<qrCode>、<urlChave>) - 编码非UTF-8无BOM格式
调整:
- 生成XML时强制添加命名空间
- 用xmlbuilder2生成时指定UTF-8编码且禁用BOM:
const xmlString = builder.end({ encoding: 'utf-8', standalone: true }); - 下载对应版本的NFC-e XSD文件(如
NFe_v4.00.xsd),用工具(如xmllint)校验XML结构合法性。
3. QR-Code内容不符合规范
从你的代码和XML片段看,需重点检查以下几点:
- URL协议:当前多数SEFAZ州已强制使用HTTPS,将QR-Code中的
http://替换为https:// - 参数正确性:
- 确认
chaveNFe是44位的有效NFC-e编号(格式:年份2位+月份2位+CNPJ14位+序号等) - 检查
tpAmb(环境参数):测试环境应为2,生产环境为1,避免混淆 - 验证CSC ID和CSC Token是SEFAZ官方分配的有效未过期值
- 确认
- 哈希值生成:确保HMAC-SHA1的计算逻辑正确,最终哈希值已转为大写(你的代码已做
toUpperCase(),这部分是对的)
调整:
将QR-Code URL切换为HTTPS:
const baseUrl = sefazInfo.qrCode.replace('http://', 'https://');
4. QR-Code内容存在多余空格/换行
xmlbuilder2的缩进配置可能导致<qrCode>标签内的URL被插入多余空格或换行,导致SEFAZ无法识别。
调整:
生成QR-Code字符串时添加trim()处理:
const qrCodeFinal = `${baseUrl}?p=${qrCodeString}|${cHashQRCode}`.trim();
测试建议
使用SEFAZ官方的 homologação(测试)环境校验工具,提交生成的XML验证是否符合规范,提前排查问题。
内容的提问来源于stack exchange,提问作者Davi Quaresma
相关产品推荐
相关产品推荐

