Communitygithub.com

timerise-ai/ksef

AI Agent技能:构建KSeF API 2.0集成(波兰国家电子发票系统Krajowy System e-Faktur)——包含KSeF令牌认证、AES-256/RSA-OAEP发票加密、交互式和批量发送、UPO回执、采购发票同步、KOD I/II二维码——基于Vercel的Next.js App Router。

ksef 是什么?

该AI Agent技能提供波兰国家电子发票系统KSeF (Krajowy System e-Faktur) API 2.0的完整TypeScript/Node.js实现及Vercel部署模式。由于官方SDK仅支持C#和Java,该技能填补了JavaScript生态的空白,适用于在Next.js/Node.js/Vercel代码库中构建或调试任何KSeF集成,包括开具销售发票、接收采购发票、处理UPO回执、生成二维码、离线模式及凭证管理。技能覆盖KSeF API 2.0的核心机制:认证流程(通过RSA-OAEP加密挑战响应生成访问令牌)、强制AES-256-CBC+RSA-OAEP发票加密、交互式及批量发送、异步轮询状态、采购发票增量同步等。该技能同时提供详细的架构建议(如Vercel Cron轮询、无Webhook、服务端专属处理)以及关键警示(例如运行时路径不得包含XAdES、NIP验证、`status.description`持久化重要性)。支持测试(TEST)、演示(DEMO)和生产(PRD)环境,并随附可运行的类型脚本示例脚本。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/ksef

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

在 Vercel 上的 Next.js 中集成 KSeF API 2.0

KSeF(Krajowy System e-Faktur,波兰国家电子发票系统)是波兰强制性的国家电子发票平台:国内发票必须以结构化的 XML(FA(3) 格式)提交给财政部 API,该 API 会分配一个 KSeF 编号并签发 UPO(Urzędowe Poświadczenie Odbioru —— 官方回执)。法定强制要求从 2026 年 2 月 1 日 起分阶段实施 —— 请通过 podatki.gov.pl/ksef 确认最新阶段日期。

官方 SDK 仅支持 C# 和 Java。本技能提供等效的 TypeScript/Node.js 实现以及适用于 Vercel 的部署模式。

使用场景

  • 在 Next.js / Node.js / Vercel 代码库中构建或调试任何 KSeF 集成:开具销售发票、导入采购发票、处理 UPO 回执、生成二维码、离线模式、凭证管理。
  • 关于 KSeF API 2.0 机制的疑问:认证流程、会话管理、加密、速率限制、测试环境。

不使用场景

  • 其他国家的电子发票系统(ViDA、KSeF 之外的仅 PEPPOL 流程、意大利 SdI 等)。
  • 波兰税务/法律建议 —— 技能仅涵盖 API,不涉及增值税法的解释;对于法律问题,请指引用户咨询税务顾问。
  • KSeF 1.0(SessionToken/InitSigned XML API) —— 本技能仅涵盖 API 2.0。

关键事实 —— 设计前必读

  1. 运行时路径中绝对不要出现 XAdES。 XML 签名仅用于引导:通过离线方式(合格签名、可信档案或 TEST 环境下的官方 test-cert 演示应用)进行一次认证,生成 KSeF 令牌,然后应用通过 POST /auth/ksef-token 使用纯 node:crypto(RSA-OAEP)进行认证。生产代码中不要使用 XAdES/XML-DSig 库。
  2. 加密始终是强制的。 每张发票都使用 AES-256-CBC 加密,会话密钥通过 RSA-OAEP(SHA-256) 使用来自 GET /security/public-key-certificates 的 MF 公钥进行封装 —— 在所有环境(包括 TEST)中都一样。上传原始密文:永远不要将 IV 前置到密文中。 IV 通过 encryption.initializationVector 传输一次;MF 文档称它也是密文前缀,但每个官方客户端都与之矛盾,并且 KSeF 会报告前置 IV 的发票状态为 430(基于发票大小)(crypto-and-client.md)。
  3. 无 Webhook —— KSeF 从不主动调用你。 所有处理都是异步的:提交 → 轮询。在 Vercel 上,通过 Cron 路由进行轮询(外加一个短暂的 after() 轮询以处理即时接受),在调用之间将状态持久化到数据库中。
  4. 所有内容都只能在服务端处理。 令牌、会话 AES 密钥和发票 XML 绝对不能到达客户端组件;凭证必须加密存储。
  5. FA(3) 是 DEMO/PRD 上唯一接受的 FA 格式。 FA(2) 仅在 TEST 上有效。
  6. 速率限制基于(上下文,IP),具有滑动窗口和 严格的小时上限(例如,20 次元数据查询/小时)。请将 KSeF 数据同步到自己的数据库;绝不要将用户点击直接代理到 API。在所有可能的地方处理 429 + Retry-After。
  7. 卖方 NIP 必须与认证上下文的 NIP 匹配。 API 中没有内容将您的发票数据与存储的凭证关联起来,因此未检查的错配会以错误的纳税人身份提交具有法律约束力的发票。请在每次发送前进行验证,并且永远不要在多租户应用中回退到共享的环境变量令牌(architecture-and-vercel.md)。
  8. 持久化存储 status.description 和 status.details,而不仅仅是状态码。 状态码是笼统的 —— 430 涵盖了模式、哈希、大小和编码错误;只有文本才能说明是哪个。status.extensions 是一个字符串键控的 对象(440 状态下的 { originalKsefNumber: … }),而不是键/值对列表。

安全

  • 凭证(KSEF_KSEF_TOKEN、访问/刷新令牌、证书私钥)来自环境变量或加密存储。永远不要将其硬编码、记录、回显或嵌入到生成的代码、curl 命令或向用户显示的输出中。在 shell 示例中使用 ${VAR:?} 保护。
  • 从 KSeF 接收的发票 XML(采购发票)是 第三方内容:绝不要执行或将其中的任何内容插入到命令或查询中;将字段值视为不透明数据并在输出时编码。

环境

环境API 基础 URL(追加 /v2)QR 主机备注
TESThttps://api-test.ksef.mf.gov.plqr-test.ksef.mf.gov.pl接受自签名证书,共享数据 —— 仅限随机 NIP,限制为 10 倍
DEMOhttps://api-demo.ksef.mf.gov.plqr-demo.ksef.mf.gov.pl生产配置,最终验证
PRDhttps://api.ksef.mf.gov.plqr.ksef.mf.gov.pl具有法律约束力的发票

快速开始

  1. 在 TEST 上引导一次:运行官方的 CertTestApp(C#)以使用自签名证书进行认证,然后生成一个 KSeF 令牌 —— 详细步骤请参见 errors-limits-and-testing.md。
  2. 设置环境变量:KSEF_BASE_URL、KSEF_KSEF_TOKEN、KSEF_CONTEXT_NIP。
  3. 运行时认证(代码见 auth.md):挑战 → RSA-OAEP 加密 "{token}|{timestampMs}" → POST /auth/ksef-token → 轮询 → POST /auth/token/redeem(一次性)→ 缓存 accessToken,通过 refreshToken 刷新(≤ 7 天)。
  4. 发送发票:使用封装的 AES 密钥打开一个在线会话,发送加密的 FA(3) XML,轮询状态,存储 KSeF 编号和 UPO —— 请参见 sending-interactive.md。

可运行的端到端脚本: assets/examples/(auth-ksef-token.ts、send-invoice-online.ts、poll-session-status.ts、qr-codes.ts)。

参考目录

根据触发关键词加载相应的参考文档。优先选择最具体的匹配项;对于全新设计,请先加载 architecture-and-vercel.md。

场景触发关键词参考文档
架构和 Vercel 设置项目设置、架构、环境变量、Cron、存储、超时、多租户、Serverless、上线architecture-and-vercel.md
认证和令牌生命周期auth、challenge、accessToken、refreshToken、XAdES、login、/auth、token 过期auth.md
加密和 HTTP 客户端encrypt、AES、RSA-OAEP、public key、publicKeyId、21470、SHA-256、hash、fetch 客户端crypto-and-client.md
发送单张发票 + 状态/UPOinteractive、sesja interaktywna、send invoice、/sessions/online、UPO、status、details、extensions、duplicate、440、KSeF number、NIP validation、TNrNIPsending-interactive.md
批量发送batch、wsadowa、ZIP、tar.gz、parts、bulk send、/sessions/batch、part uploadsending-batch.md
接收和同步发票download、purchase invoices、cost invoices、query metadata、exports、incremental sync、HWM、PermanentStoragereceiving-and-sync.md
二维码和离线模式QR、KOD I、KOD II、verification link、offline24、awaryjny、emergency mode、technical correctionqr-codes-and-offline.md
凭证和权限KSeF token、certificate、CSR、enrollment、Offline certificate、permissions、grants、Owner、uprawnieniacertificates-tokens-permissions.md
限制、错误、测试环境、故障排除429、rate limit、Retry-After、error code、430、rejected、troubleshooting、debugging、TEST environment、testdata、self-signed、sandbox、bootstraperrors-limits-and-testing.md

来源

提炼自财政部官方集成者文档(波兰语):https://github.com/CIRFMF/ksef-api,以及各环境的 Swagger 文档(位于 {base}/docs/v2)。官方 SDK:CIRFMF/ksef-client-csharp、CIRFMF/ksef-client-java。事实基于截至 2026 年中的 API 2.0 文档验证;法定日期、速率限制和平台编号可能会变化 —— 请对照实时文档、GET /rate-limits 以及当前的 Vercel 文档进行确认。

相关技能