Avistadocs
Webhooks

CashInReversal

概述

CashInReversal 事件在您发起之前收到的 PIX 付款的退款(将金额退还给原始付款方)时发送。此事件在您调用 Refund-In API 时触发。

CashInReversal 的 movementTypeDEBIT,因为您正在退还之前进入您账户的资金。

字段
eventCashInReversal
movementTypeDEBIT
含义您退还了之前收到的资金

完整负载

{
  "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
  }
}

您可以进行多次部分退款,直到 wasTotalRefundedtrue


使用场景

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

后续步骤

本页目录