docs

功能激活

概述

PIX Bacen 模式包含两个相互独立的部分:

  1. BACEN 端点:兼容中央银行规范的端点。任何已认证的账户都可以使用,无需激活:只需使用与标准 API 相同的 Bearer 令牌。
  2. V2 Webhooks:使用 {type, data} 信封的通知格式。由客户自行 按 webhook(按已注册的 URL)选择。

将 webhook 切换为 V2 对该 URL 的使用方而言是一项 破坏性变更:payload 格式将完全不同。请在切换版本前更新处理器。

如何启用 V2 Webhooks

1. 通过控制面板

在 FyPay 控制面板 中进入 设置 → Webhooks,注册(或重新注册)目标事件的 URL,并在 负载版本 中选择 PIX BACEN(V2)。版本只能在控制面板中配置。

2. 测试集成

切换版本后:

  1. 通过 PUT /api/cob/:txid 创建一笔测试收款
  2. 确认 V2 webhook 已正确送达
  3. 确认您的应用已处理新格式

有哪些变化?

Endpoints

BACEN 端点与标准 API 的以下操作相对应:

标准 APIPIX Bacen API
POST /api/pix/cash-inPUT /api/cob/:txid
POST /api/pix/cash-outPOST /api/dict/pix
POST /api/pix/refund-in/:idPUT /api/pix/:e2eid/devolucao/:id
GET /api/balanceGET /api/accounts/balances

标准 API 的端点仍可正常使用。您可以同时使用两套 API。

Webhooks

Webhook 格式完全改变:

{
  "event": "CashIn",
  "status": "CONFIRMED",
  "transactionId": "12345",
  "movementType": "CREDIT",
  "originalAmount": 100.00,
  "finalAmount": 100.00,
  "counterpart": {
    "name": "João Silva",
    "document": "123.xxx.xxx-xx"
  }
}
{
  "type": "RECEIVE",
  "data": {
    "id": 123,
    "txId": "abc123",
    "status": "LIQUIDATED",
    "payment": {
      "amount": "100.00",
      "currency": "BRL"
    },
    "creditDebitType": "CREDIT",
    "debtorAccount": {
      "name": "João Silva",
      "document": "123.xxx.xxx-xx"
    },
    "creditorAccount": {...}
  }
}

Webhook 的主要区别

方面V1V2
结构字段位于根级{type, data} 信封
事件类型event: "CashIn"type: "RECEIVE"
成功状态CONFIRMEDLIQUIDATED
退款状态CONFIRMEDREFUNDED
金额number (100.00)string ("100.00")
交易对手counterpartdebtorAccount / creditorAccount

准备您的集成

1. 更新 webhook 处理器

// 之前 (V1)
function handleWebhookV1(payload: any) {
  if (payload.event === 'CashIn' && payload.status === 'CONFIRMED') {
    processPayment(payload.transactionId, payload.finalAmount);
  }
}

// 之后 (V2)
function handleWebhookV2(payload: any) {
  if (payload.type === 'RECEIVE' && payload.data.status === 'LIQUIDATED') {
    const amount = parseFloat(payload.data.payment.amount);
    processPayment(payload.data.id, amount);
  }
}

2. 更新类型/接口

// V2 Types
interface WebhookV2Payload {
  type: 'RECEIVE' | 'TRANSFER' | 'REFUND';
  data: WebhookV2Data;
}

interface WebhookV2Data {
  id: number | null;
  txId: string | null;
  status: 'PENDING' | 'LIQUIDATED' | 'REFUNDED' | 'ERROR';
  payment: {
    amount: string;  // 注意:是 string,不是 number!
    currency: string;
  };
  creditDebitType: 'CREDIT' | 'DEBIT';
  debtorAccount: AccountInfo;
  creditorAccount: AccountInfo;
  endToEndId: string | null;
  refunds: RefundInfo[];
  // ... 其他字段
}

3. 使用额外的 URL 测试

在切换正在使用的 URL 的版本之前:

  1. 在同一事件中额外注册一个使用 PIX BACEN 版本的测试 URL(每个事件最多接受 3 个 URL,且每个 URL 有各自的版本)
  2. 完整测试 Cash-In、Cash-Out 和 Refund
  3. 确认所有 webhook 均被正确处理

Rollback

版本可以随时切换回 V1:在控制面板(设置 → Webhooks)中为该 URL 选择 标准 版本(V1)。

建议在过渡期间同时支持两个版本:

function handleWebhook(payload: any) {
  // 根据格式检测版本
  if (payload.type && payload.data) {
    return handleWebhookV2(payload);
  } else if (payload.event) {
    return handleWebhookV1(payload);
  }
  throw new Error('未知的 webhook 格式');
}

激活检查清单

更新代码以处理 {type, data} 信封格式

注册一个使用 PIX BACEN 版本的测试 URL 并执行完整测试

测试:RECEIVE、TRANSFER、REFUND,状态包括 LIQUIDATED、REFUNDED 和 ERROR

在 设置 → Webhooks 中,为目标 URL 选择 PIX BACEN 负载版本

切换后跟踪首批交易,确保一切正常

常见问题

后续步骤

本页目录