Webhooks
CashInReversal
概述
CashInReversal 事件在您发起之前收到的 PIX 付款的退款(将金额退还给原始付款方)时发送。此事件在您调用 Refund-In API 时触发。
CashInReversal 的 movementType 为 DEBIT,因为您正在退还之前进入您账户的资金。
| 字段 | 值 |
|---|---|
event | CashInReversal |
movementType | DEBIT |
| 含义 | 您退还了之前收到的资金 |
完整负载
{
"event": "CashInReversal",
"status": "CONFIRMED",
"transactionType": "PIX",
"movementType": "DEBIT",
"transactionId": "11111",
"externalId": "refund-678689ca-3e16-4f5e-a08f-09a984a97781",
"endToEndId": "D07136847202512112011O5222ZRBI5A",
"pixKey": null,
"feeAmount": 0.01,
"originalAmount": 0.3,
"finalAmount": 0.31,
"processingDate": "2025-12-11T20:11:13.289Z",
"errorCode": null,
"errorMessage": null,
"metadata": {},
"parentTransaction": {
"transactionId": "12345",
"externalId": "PIX-5482123298-EJUYFSMU1UU",
"endToEndId": "E00416968202512111942rjzxxzSSTD9",
"processingDate": "2025-12-11T19:42:04.080Z",
"wasTotalRefunded": false,
"remainingAmountForRefund": 0.2,
"metadata": {},
"counterpart": {
"name": "Carlos Oliveira",
"document": "*.345.678-**",
"bank": {
"bankISPB": null,
"bankName": null,
"bankCode": null,
"accountBranch": null,
"accountNumber": null
}
}
}
}CashInReversal 特有字段
CashInReversal 包含 parentTransaction 对象,其中包含正在退款的原始交易数据。
parentTransaction
parentTransactionobjectobrigatorio正在退款的原始 PIX In 交易数据。
parentTransaction.transactionIdstring原始 PIX In 交易的数字 ID(以字符串形式返回)。
parentTransaction.externalIdstring原始交易的外部 ID。
parentTransaction.endToEndIdstring原始交易的 End-to-End ID。
parentTransaction.processingDatestring原始交易的处理日期。
parentTransaction.wasTotalRefundedboolean指示原始交易的总金额是否已全部退款。
true:全额退款(无法再进行退款)false:部分退款(剩余金额仍可退款)
parentTransaction.remainingAmountForRefundnumber仍可退款的剩余金额(BRL)。
示例: 0.2(还可退 R$ 0.20)
parentTransaction.counterpartobject将收到退款的原始付款方数据。
全额退款 vs 部分退款
全额退款
当您退还收到的全部金额时:
{
"parentTransaction": {
"wasTotalRefunded": true,
"remainingAmountForRefund": 0
}
}部分退款
当您仅退还部分金额时:
{
"parentTransaction": {
"wasTotalRefunded": false,
"remainingAmountForRefund": 0.2
}
}您可以进行多次部分退款,直到 wasTotalRefunded 为 true。
使用场景
1. 重复付款退款
async function handleCashInReversal(payload) {
const refundId = payload.transactionId;
const originalOrderId = payload.parentTransaction.externalId;
await refundService.markAsCompleted({
refundId,
originalOrderId,
amount: payload.originalAmount,
completedAt: payload.processingDate
});
// Notify customer about the refund
await notificationService.sendRefundConfirmation({
orderId: originalOrderId,
amount: payload.originalAmount
});
}2. 部分退款追踪
async function handleCashInReversal(payload) {
const { parentTransaction } = payload;
await refundService.updateStatus({
originalTransactionId: parentTransaction.transactionId,
totalRefunded: !parentTransaction.wasTotalRefunded
? false
: true,
remainingAmount: parentTransaction.remainingAmountForRefund
});
if (parentTransaction.wasTotalRefunded) {
console.log('Transaction fully refunded');
} else {
console.log(`Still available for refund: R$ ${parentTransaction.remainingAmountForRefund}`);
}
}典型流程
sequenceDiagram
participant YourSystem
participant Avista
participant OriginalPayer
Note over YourSystem,OriginalPayer: Original transaction (CashIn)
OriginalPayer->>Avista: PIX received previously
Avista->>YourSystem: Webhook CashIn
Note over YourSystem,OriginalPayer: Refund (CashInReversal)
YourSystem->>Avista: POST /api/pix/refund-in/\{id\}
Avista->>OriginalPayer: Returns PIX
Avista->>YourSystem: Webhook CashInReversal
YourSystem-->>Avista: HTTP 200 OK