Ir para o conteúdo

Refunds

Use prepareRefund() para reembolsar uma transação existente:

$vinti4->prepareRefund(
    amount: 1000,
    transactionID: 'TX119922',
    clearingPeriod: '1125',
);

Antes disso, defina uma referência para o reembolso e, opcionalmente, uma sessão:

$vinti4->setMerchant('REFUND000000001');

Depois, gere o formulário:

echo $vinti4->createPaymentForm(
    'https://minha-loja.cv/reembolsos/callback',
    'pt',
);

Dados da transação original

Guarde estes dois dados quando o pagamento for aprovado:

Dado Campo retornado pela SISP Método da resposta
Clearing Period merchantRespCP getClearingPeriod()
Transaction ID merchantRespTid getTransactionId()
$transactionId = $response->getTransactionId();
$clearingPeriod = $response->getClearingPeriod();

O clearingPeriod é o período contabilístico no qual a transação ocorreu. O transactionID identifica a transação original. Juntos, eles permitem localizar a operação na rede Vinti4.


Parâmetros

Parâmetro Tipo Regra
amount float|string Inteiro positivo, até 13 dígitos
transactionID string Até 8 caracteres alfanuméricos
clearingPeriod string Numérico, até 4 dígitos

O reembolso usa CVE, código 132. A biblioteca envia transactionCode=4 e reversal=R.

O montante deve ser o total da transação original; a SISP não suporta estorno parcial neste fluxo. Guarde esse montante no seu banco e não o extraia da resposta do estorno, que pode trazer merchantRespPurchaseAmount=0.


Fluxo de reembolso

sequenceDiagram
    participant Merchant
    participant SDK
    participant SISP
    participant Callback
    Merchant->>SDK: prepareRefund()
    Merchant->>SDK: createPaymentForm()
    SDK->>SISP: Pedido de reembolso
    SISP->>Callback: Resultado
    Callback->>SDK: processResponse()
    SDK-->>Callback: Vinti4Response

Processar o retorno

$response = $vinti4->processResponse($_POST);

if ($response->hasInvalidFingerprint()) {
    http_response_code(400);
    exit('Resposta inválida.');
}

if ($response->isSuccess()) {
    // Localize pela referência um estorno pendente, confira a sessão
    // e marque-o como concluído uma única vez.

    echo $response->renderRefundReceipt(
        amount: $originalAmount, // valor guardado para a transação original
        originalTransactionId: $originalTransactionId,
        data: ['companyName' => 'Minha Empresa'],
    );
}

O estorno pode retornar diretamente à URL de callback, sem apresentar uma página intermediária ao cliente. Erros messageType=6 não revelam se eram de estorno: associe a referência recebida ao estorno pendente guardado na aplicação. Antes de reembolsar, confirme no seu banco que a transação original foi aprovada e ainda permite a devolução solicitada.