跳到主要内容

书写 Webhooks

概述​

书写 webhooks 允许您实时接收有关商业票据发行流程中状态变更和重要事件的通知。当事件发生时,QI Tech 会自动向您系统中配置的 URL 发送 HTTP POST 载荷。

Webhooks 配置​

要接收 webhooks,您需要在系统中配置端点 URL。请参阅 webhooks 配置文档 了解如何注册和管理您的 webhook URL 的更多详情。

认证和安全​

QI Tech 发送的所有 webhooks 在 SIGNATURE header 中携带一个 JWT,使用与合作伙伴共享的 Signature Key 以 HS256 签名。请求体不会被直接签名,而是通过 payload_md5 claim 进入该 token。您的系统必须验证此签名,以确保接收数据的真实性和完整性。验证步骤请参阅 webhooks 认证文档。

可用事件​

发行人管理​

发行人登记已批准​

当发行人的登记被合规团队批准时发送。

Event Type: issuer_management.issuer_status_change

Payload:

{
"event_type": "issuer_management.issuer_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "approved"
}
}

发行人登记未批准​

当发行人的登记被合规团队拒绝时发送。

Event Type: issuer_management.issuer_status_change

Payload:

{
"event_type": "issuer_management.issuer_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "reproved"
}
}

发行人自动签署 — 状态变更​

在加入协议的签署信封被开启时以及该信封办结时发送。信封在启用申请调用过程中即被开启,该调用已直接以 pending_signature 响应 — 对于发起调用的一方,此 webhook 只是确认响应中已返回的内容;对于该 tenant 下的其他消费方,它则是加入协议已可供签署的通知。启用由集成方通过 POST .../auto_signature 申请。各状态的含义请参阅自动签署流程。

该事件在三个时点触发:pending_signature、enabled 和 reproved。自动签署的创建(pending_term_generation)与取消(canceled)不会产生 webhook — 创建体现在申请本身的响应中,取消则通过自动签署查询观察。

Event Type: issuer_management.auto_signature_status_change

Payload:

{
"event_type": "issuer_management.auto_signature_status_change",
"event_datetime": "2026-02-10T09:16:03Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"issuer_auto_signature_key": "9c3f0f1e-6a2b-4c58-9c9c-0f6b1d2a7e34",
"status": "pending_signature"
}
}
字段类型描述
issuer_keystring发行人的唯一键。
issuer_auto_signature_keystring自动签署的唯一键。
statusstring当前状态。在 webhook 中始终为 pending_signature、enabled 或 reproved。

收到各状态时的处理方式:

收到的状态处理方式
pending_signature查询签署链接,并引导发行人的每一位签署人访问其专属链接。
enabled发行人已启用自动签署:此后的发行将自动签署。
reproved加入协议的信封被拒签、取消或已过期。在重新创建启用之前,发行将走人工签署流程。

清算账户管理​

清算账户申请状态变更​

当发行人的清算账户开户申请状态发生变化时发送。event_data.status 字段说明发生了哪种变化,在做任何处理之前都必须先判断该字段,因为同一个 event_type 同时承载拒绝和开立两种情况。

status含义
rejectedBaaS 拒绝了开户,例如因为 Bacen Protege+ 的限制。账户不会被开立,在新的申请获得通过之前,该发行人的清算会被阻断。与发行人解决原因之后,请使用开户重试。
approved申请已通过 BaaS 的校验。此时账户尚不存在:它会在该发行人的第一笔操作发行时开立。
opened账户已开立,可以接收清算。

approved 事件在发行人登记后几分钟内到达,是 rejected 的对应事件。通过它即可得知账户能够开立,无需等待第一次发行。

Event Type: liquidation_account.account_request_status_change

拒绝的 Payload:

{
"event_type": "liquidation_account.account_request_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"account_request_key": "7e1c53d6-d372-4020-be6b-ed94248d7ae9",
"status": "rejected",
"rejection_reason": "Rejeitado devido ao Bacen Protege+",
"account_info": {
"account_branch": "0001",
"account_number": "1234567",
"account_digit": "3"
}
}
}

在拒绝的情况下,account_info 字段是可选的,仅当 BaaS 返回被拒账户的数据时才会发送。rejection_reason 按 BaaS 返回的原文透传。

通过的 Payload:

{
"event_type": "liquidation_account.account_request_status_change",
"event_datetime": "2025-07-30T16:07:30Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"account_request_key": "7e1c53d6-d372-4020-be6b-ed94248d7ae9",
"status": "approved",
"account_info": {
"account_branch": "0001",
"account_number": "1234567",
"account_digit": "3"
}
}
}

开立的 Payload:

{
"event_type": "liquidation_account.account_request_status_change",
"event_datetime": "2025-07-30T16:12:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"account_request_key": "7e1c53d6-d372-4020-be6b-ed94248d7ae9",
"status": "opened",
"account_key": "46804f32-101e-4702-8fbc-c2dbc4c2caec",
"account_info": {
"account_branch": "0001",
"account_number": "1234567",
"account_digit": "3"
}
}
}

账户的当前状态也可以随时通过清算账户查询获取。

投资人管理​

投资人登记已批准​

当投资人的登记被合规团队批准时发送。

Event Type: investor_management.investor_status_change

Payload:

{
"event_type": "investor_management.investor_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"investor_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "approved"
}
}

投资人登记未批准​

当投资人的登记被合规团队拒绝时发送。

Event Type: investor_management.investor_status_change

Payload:

{
"event_type": "investor_management.investor_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"investor_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "reproved"
}
}

操作管理​

操作已批准​

当操作被合规团队批准并准备好发送签名时发送。

Event Type: commercial_paper.operation_status_change

Payload:

{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "pending_signature_submission"
}
}

操作未批准​

当操作在审核中被拒绝时发送(自动预审或合规团队的人工审核)。该操作不会进入签署流程。

Event Type: commercial_paper.operation_status_change

Payload:

{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "compliance_reproved",
"reproval_reason": {
"maximum_overdue_by_debtor": "Issuer 12.345.678/0001-90 holds another asset that is more than 0 days overdue."
}
}
}

reproval_reason 字段以「键—说明」对象的形式提供拒绝原因。在自动预审中,每个键为导致该操作被拒绝的合格性规则。当拒绝未记录任何原因时,该字段可能为 null。

操作已发送签名​

当操作被发送给相关方签名时发送。

Event Type: commercial_paper.operation_status_change

Payload:

{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "waiting_signature"
}
}

操作已签名并发行​

当操作被所有各方签署时发送。此事件确认商业票据已成功发行。

Event Type: commercial_paper.operation_status_change

Payload:

{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "issued",
"signed_files_url": "https://storage.googleapis.com/commercial-paper-bucket/89c7f73a-c184-400c-bb2a-dd4424075a4f/signed_files?X-Goog-Algorithm=..."
}
}

signed_files_url 字段提供一个下载链接,其中包含该操作所有已签署合同的压缩包,适用于所有签署方式。该链接自 Webhook 发送起 7 天内有效。

操作已取消​

当操作被取消时发送。

Event Type: commercial_paper.operation_status_change

Payload:

{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "canceled"
}
}

认购管理​

认购已发送签名​

当认购被创建并发送给投资人签名时发送。

Event Type: subscription.subscription_status_change

Payload:

{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "waiting_signature"
}
}

认购已签名​

当认购被所有各方签署并等待付款时发送。

Event Type: subscription.subscription_status_change

Payload:

{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "waiting_payment"
}
}

认购已完成​

当认购在付款确认后完全完成时发送。

Event Type: subscription.subscription_status_change

Payload:

{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "finished"
}
}

认购已取消​

当认购因整合在合格性审核中被拒绝而取消时发送。对应的整合认购单和签署信封会一并取消。

Event Type: subscription.subscription_status_change

Payload:

{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "canceled",
"cancellation_reason": "ineligible",
"ineligible_reasons": {
"maximum_overdue_by_debtor": "Issuer 12.345.678/0001-90 holds another asset that is more than 0 days overdue."
}
}
}

cancellation_reason 字段以稳定的取值标识取消原因。当取值为 ineligible 时,ineligible_reasons 字段以「键—说明」对象的形式列出导致该整合被拒绝的合格性规则及对应说明。

认购付款管理​

付款凭证已添加​

当付款凭证被添加并等待确认时发送。

Event Type: subscription_payment.subscription_payment_status_change

Payload:

{
"event_type": "subscription_payment.subscription_payment_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"subscription_payment_key": "1413020c-6965-40fb-a162-632459d35fd1",
"status": "waiting_confirmation"
}
}

付款凭证已批准​

当付款凭证被批准和确认时发送。

Event Type: subscription_payment.subscription_payment_status_change

Payload:

{
"event_type": "subscription_payment.subscription_payment_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"subscription_payment_key": "1413020c-6965-40fb-a162-632459d35fd1",
"status": "confirmed"
}
}

事件流程​

商业票据发行流程​

  1. 发行人登记 → issuer_status_change(approved/reproved)
  2. 投资人登记 → investor_status_change(approved/reproved)
  3. 创建操作 → operation_status_change(pending_signature_submission)
  4. 发送签名 → operation_status_change(waiting_signature)
  5. 操作发行 → operation_status_change(issued)

认购流程​

  1. 创建认购 → subscription_status_change(waiting_signature)
  2. 签名完成 → subscription_status_change(waiting_payment)
  3. 添加凭证 → subscription_payment_status_change(waiting_confirmation)
  4. 付款确认 → subscription_payment_status_change(confirmed)
  5. 认购完成 → subscription_status_change(finished)

最佳实践​

  1. 快速响应:尽快返回 HTTP 2xx 状态以确认收到 webhook。
  2. 异步处理:对于耗时操作,立即确认接收并异步处理事件。
  3. 幂等性:实现幂等逻辑。被拒绝的事件会在约 22 小时内最多重发 7 次,因此您的端点可能会多次收到同一事件。识别重复事件的方法请参见重发策略。
  4. 签名验证:处理 webhook 前务必验证 SIGNATURE header 中的 JWT。
  5. 日志和监控:保留所有收到的 webhooks 的详细日志,用于审计和调试。

参考​