You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:24:52