Skip to main content

开发文档

所有文档

官方对接地址 文件统计

测试环境(带证书) 

发送票务地址:  

https://prewww10.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP

生产环境 (带证书)

发送票务地址:

https://www10.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP


<sum1:DetalleDesglose>
<sum1:ClaveRegimen>01</sum1:ClaveRegimen>
<!-- 税务制度代码(01=普通IVA) -->
<sum1:CalificacionOperacion>S1</sum1:CalificacionOperacion>
<!-- 操作类型 -->
<sum1:TipoImpositivo>4</sum1:TipoImpositivo>
<!-- 税率4% -->
<sum1:BaseImponibleOimporteNoSujeto>10</sum1:BaseImponibleOimporteNoSujeto>
<!-- 不含税金额 -->
<sum1:CuotaRepercutida>0.4</sum1:CuotaRepercutida>
<!-- 税额 -->
</sum1:DetalleDesglose

系统信息部分  SistemaInformatico XML 

               <sum1:SistemaInformatico> 
                  <sum1:NombreRazon>JIECHENG INFORMATICA SL</sum1:NombreRazon>                   
                  <sum1:NIF>B67287789</sum1:NIF> 
                  <sum1:NombreSistemaInformatico>JIECHENG TPV</sum1:NombreSistemaInformatico> 
                  <sum1:IdSistemaInformatico>J2</sum1:IdSistemaInformatico> 
                  <sum1:Version>1.0.03</sum1:Version> 
                  <sum1:NumeroInstalacion>383</sum1:NumeroInstalacion>   // 主机1 副机 2
                  <sum1:TipoUsoPosibleSoloVerifactu>N</sum1:TipoUsoPosibleSoloVerifactu> 
                  <sum1:TipoUsoPosibleMultiOT>S</sum1:TipoUsoPosibleMultiOT> 
                  <sum1:IndicadorMultiplesOT>S</sum1:IndicadorMultiplesOT> 
               </sum1:SistemaInformatico> 

常用节点意思介绍
节点 含义 可用值 / 格式 说明
<sum1:Subsanacion> 修正标志 S 或 省略 S 表示此记录为修正(例如纠正错误或重新提交)
<sum1:TipoFactura> 发票类型 F1 普通发票F2 简易发票R1 作废R2 更正R3 替换 可以参见 TipoFactura 段落

<sum1:ClaveRegimen> 税制代码 01 普通制度02 简易制度03 免税 取决于发票适用税法
<sum1:CalificacionOperacion> 交易类型 S1 受IVA约束N1 不受约束E1 免税 常见餐饮类一般使用 S1
<sum1:TipoImpositivo> 税率 4, 10, 21 , 0  几种税率 西班牙标准IVA税率
<sum1:TipoHuella> 指纹类型 01 表示 SHA-256 Base64
<sum1:TipoUsoPosibleSoloVerifactu> 是否专属VeriFactu SN 如果你的系统只用于VeriFactu,则为 S
<sum1:TipoUsoPosibleMultiOT> 是否支持多义务人 SN SaaS类一般 S
<sum1:IndicadorMultiplesOT> 是否有多个义务人使用中 SN 如果服务器下多家餐厅,则为 S
<sum1:NumeroInstalacion> 安装编号 数字或字符串 每个部署/门店唯一
<sum1:Huella> 指纹 Base64 编码字符串 SHA-256(关键字段串联)
TipoFactura 的几种类型
Código 名称 适用情形 关键点
F1 Factura completa
(Art. 6, 7.2 y 7.3 del RD 1619/2012)
标准完整发票,识别买方、含增值税细节。 是最常见的发票类型。必须包含:
- 客户身份(NIF / NombreRazon)
- 分项税额 (Desglose)
F2 Factura simplificada
(Art. 6.1.d RD 1619/2012)
金额较小、无需识别买方的发票(小票、餐饮等)。 通常对应 Ticket。买方信息可选。
F3 Factura emitida en sustitución de facturas simplificadas 当企业把之前已申报的简易发票(F2)替换为完整发票(F1)。 属于更正性质的“补开发票”,用于“由 ticket 转发票”。这正是你现在在做的情况。
R1 Factura rectificativa (Art. 80.1 y 80.2 y error fundado en derecho) 纠正税基、税率或金额错误(因判决、行政原因等)。 Rectificación 依据法条 80.1 / 80.2。
R2 Factura rectificativa (Art. 80.3) 因退货、折扣、无效合同等导致的修正。 对应业务更改(例如取消销售)。
R3 Factura rectificativa (Art. 80.4) 客户破产或无力偿付引起的修正。 专用于破产情形。
R4 Factura rectificativa (Resto) 其他未涵盖情形的更正发票。 一般性修正用途。
R5 Factura rectificativa simplificada 针对简易发票的修正。 通常用于 ticket 更正。


QR 生成地址 以及规则

 QR 尺寸 40*40 mm

以地址为准生成 QR 码,并在下方 打印: Factura verificable en la sede electrónica de la AEAT 

测试环境地址:

https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?nif=XXXXXXXXY&numserie=YYYY...YYYY&fecha=DD- DD-AAAA&importe=NNNNNNNNN.DD

生产环境地址:

https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?nif=XXXXXXXXY&numserie=YYYY...YYYY&fecha=DD- DD-AAAA&importe=NNNNNNNNN.DD

XML 返回的资料进行拼接  " &"  =  " 链接  xia

nif= XXXXXXXXXXXX   &numseria=  123456  &fecha=     &importe= 

 URL base: https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR? 
 Parámetro nif: 89890001K 
 Parámetro numserie: 12345678&G33 
 Parámetro fecha: 01-01-2024 
 Parámetro importe: 241.4 

开发流程

 1 -   解析证书  ( 获取证书中的 ID,  姓名资料 )   
  • CN   : CERTIFICADO FISICA PRUEBAS -99999910G'       (-  前是公司/个人名字  - 后面是税号)
  • SN  :  公司或者个人名称  
  • O :  有这个字段代表公司   否则是个人 
  • SERIALNUMBER  - 后面是 税号
    C 是国家  
  • NotAfter   证书到期时间

参考一下代码

using System;
using System.Security.Cryptography.X509Certificates;
using System.Text.RegularExpressions;

namespace CertInfoExtractor
{
    public enum CertType
    {
        Unknown,
        Personal,
        Organization
    }

    public class CertInfo
    {
        public CertType Type { get; set; }
        public string Name { get; set; }           // 姓名或公司名
        public string TaxNumber { get; set; }      // 税号 / NIF / CIF
        public DateTime NotAfter { get; set; }     // 到期时间
        public int DaysRemaining { get; set; }     // 剩余天数
    }

    public class CertParser
    {
        public static CertInfo Parse(string pfxPath, string password)
        {
            var cert = new X509Certificate2(pfxPath, password,
                X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

            string subject = cert.Subject;
            string issuer = cert.Issuer;

            string cn = GetField(subject, "CN");
            string org = GetField(subject, "O");
            string serial = GetField(subject, "SERIALNUMBER");

            // 税号兜底正则
            if (string.IsNullOrEmpty(serial))
            {
                var m = Regex.Match(subject, @"(SERIALNUMBER|NIF|CIF|NIE|UID)\s*=\s*([A-Z0-9\-\/]{6,20})",
                    RegexOptions.IgnoreCase);
                if (m.Success)
                    serial = m.Groups[2].Value.Trim();
            }

            // 判断类型
            CertType type = DetectType(org, serial, issuer);

            // 名称:企业用 O,个人用 CN
            string name = (type == CertType.Organization && !string.IsNullOrEmpty(org))
                ? org
                : cn;

            var notAfter = cert.NotAfter;
            int daysRemaining = (int)(notAfter - DateTime.Now).TotalDays;

            return new CertInfo
            {
                Type = type,
                Name = name,
                TaxNumber = serial,
                NotAfter = notAfter,
                DaysRemaining = daysRemaining
            };
        }

        private static CertType DetectType(string org, string serial, string issuer)
        {
            bool hasOrg = !string.IsNullOrEmpty(org);
            bool looksLikeCompanyId = Regex.IsMatch(serial ?? "", @"^[A-Z]\d{7,8}", RegexOptions.IgnoreCase);
            bool looksLikePersonId = Regex.IsMatch(serial ?? "", @"\d{7,8}[A-Z]$", RegexOptions.IgnoreCase);

            if (hasOrg || looksLikeCompanyId)
                return CertType.Organization;
            if (looksLikePersonId)
                return CertType.Personal;

            if (issuer.Contains("Persona Física", StringComparison.OrdinalIgnoreCase))
                return CertType.Personal;
            if (issuer.Contains("Representante", StringComparison.OrdinalIgnoreCase))
                return CertType.Organization;

            return CertType.Unknown;
        }

        private static string GetField(string subject, string key)
        {
            var m = Regex.Match(subject, key + @"\s*=\s*([^,]+)", RegexOptions.IgnoreCase);
            return m.Success ? m.Groups[1].Value.Trim() : null;
        }

        // 测试入口
        public static void Main()
        {
            string pfxPath = @"C:\certs\yourcert.pfx";
            string password = "yourPassword";

            var info = Parse(pfxPath, password);

            Console.WriteLine("🔍 证书类型: " + info.Type);
            Console.WriteLine("📛 名称: " + info.Name);
            Console.WriteLine("🧾 税号: " + info.TaxNumber);
            Console.WriteLine("📅 到期时间: " + info.NotAfter.ToString("yyyy-MM-dd HH:mm:ss"));
            Console.WriteLine("⏳ 剩余天数: " + info.DaysRemaining);
        }
    }
}

系统信息部分  SistemaInformatico XML 

               <sum1:SistemaInformatico> 
                  <sum1:NombreRazon>JIECHENG INFORMATICA SL</sum1:NombreRazon>                   
                  <sum1:NIF>B67287789</sum1:NIF> 
                  <sum1:NombreSistemaInformatico>JIECHENG TPV</sum1:NombreSistemaInformatico> 
                  <sum1:IdSistemaInformatico>J2</sum1:IdSistemaInformatico> 
                  <sum1:Version>1.0.03</sum1:Version> 
                  <sum1:NumeroInstalacion>383</sum1:NumeroInstalacion>   // 主机1 副机 2
                  <sum1:TipoUsoPosibleSoloVerifactu>N</sum1:TipoUsoPosibleSoloVerifactu> 
                  <sum1:TipoUsoPosibleMultiOT>S</sum1:TipoUsoPosibleMultiOT> 
                  <sum1:IndicadorMultiplesOT>S</sum1:IndicadorMultiplesOT> 
               </sum1:SistemaInformatico> 

2- 解析证书后 参考文档生成指纹  生成记录指纹或哈希的技术规范详情