Reembolsos
Criar um reembolso
Cria um refund total ou parcial para uma charge capturada.
Cria um novo
Um Payment Intent em
refund para devolver parte ou todo o valor capturado de uma
charge.
Envie exatamente um destes campos:
payment_intent: a Chargefy localiza a charge capturada correspondente;charge: você escolhe diretamente qual tentativa deve ser reembolsada.
amount, o endpoint devolve todo o valor ainda disponível. Com amount,
cria um refund parcial nesse valor, em centavos.
O refund não muda o Payment Intent de
succeeded para outro status. Ele cria
um objeto com ciclo próprio. Quando a devolução termina em succeeded, o
extrato recebe uma nova transaction negativa.Pré-requisitos
A charge resolvida precisa:- ter
status: "succeeded"; - estar paga e capturada;
- ter
amount_captured > 0; - ainda ter valor disponível para devolver;
- não ter outra devolução em andamento.
Uma devolução em andamento por vez
Cada charge aceita apenas um refund não concluído por vez. Enquanto existir um refund empending ou requires_action para aquela charge, uma nova criação
responde 409 com code: "refund_in_progress".
Isso garante que a confirmação da devolução seja atribuída à tentativa certa:
com duas devoluções parciais abertas ao mesmo tempo, a confirmação que chega
depois seria indistinguível entre elas. Assim que a tentativa atual termina em
succeeded, failed ou canceled, a charge volta a aceitar um novo refund
parcial sobre o saldo restante.
Para localizar a devolução em andamento, liste os refunds da charge:
requires_capture só foi autorizado. Cancele-o com
POST /v1/payment-intents/{id}/cancel
em vez de criar um refund.
integer
Valor a devolver, em centavos. Precisa ser um inteiro positivo e não pode
superar o valor disponível da charge.Quando omitido, devolve todo o saldo disponível:
string
ID da charge que será reembolsada (
ch_*). Envie charge ou
payment_intent, nunca os dois.object
Pares chave-valor livres para correlacionar o refund com o seu sistema.
Padrão:
{}.string
ID do Payment Intent (
pi_*). A Chargefy localiza a charge capturada mais
recente que ainda pode ser reembolsada.Envie payment_intent ou charge, nunca os dois.string
Motivo da devolução. Padrão:
null.Disputa de cartão é um fluxo separado e não é um motivo de refund.
O que acontece depois da chamada
A taxa da Chargefy é devolvida na mesma proporção do valor estornado. Por isso
a transaction do refund tem
fee_amount: 0 e amount igual ao líquido que a
venda tinha creditado, não ao valor bruto devolvido ao comprador: uma venda
totalmente estornada fecha o extrato em zero.
Formas de criar
Use umaIdempotency-Key única por devolução lógica. Se a resposta não chegar,
consulte o refund associado antes de qualquer nova operação.
A chave e o limite de uma devolução em andamento resolvem problemas diferentes,
e os dois continuam valendo:
Nunca use outra chave para contornar um estado
pending: isso não acelera a
confirmação e a criação será recusada.
(a) Refund total pelo Payment Intent
Use quando o seu sistema acompanha o pagamento pelopi_*. A Chargefy encontra
a charge capturada, e a ausência de amount devolve todo o saldo disponível.
(b) Refund parcial pelo Payment Intent
Envieamount quando apenas parte do valor deve voltar ao comprador.
cURL
(c) Refund total por uma charge específica
Usecharge quando você precisa escolher a tentativa exata, por exemplo ao
conciliar uma cobrança duplicada.
cURL
(d) Refund parcial por uma charge específica
Esta forma combina a escolha da tentativa com um valor parcial.metadata
pode guardar a referência livre do seu pedido ou atendimento.
cURL
Resposta
Retorna200 OK com o objeto refund completo. Quando o processamento recebeu a
tentativa mas ainda precisa confirmar ou repetir internamente o resultado,
retorna 202 Accepted com o mesmo objeto em status: "pending". O status pode ser provisório:
refund.created confirma que o objeto foi criado, mas somente
status: "succeeded" confirma que a devolução terminou.
Em status: "succeeded", o campo balance_transaction já vem preenchido com o
movimento negativo do extrato. Um refund concluído nunca é retornado sem esse
vínculo.
Neste exemplo, a devolução ainda está sendo processada:
Erros comuns
Acompanhar a conclusão
Persista orefund.id e trate os eventos:
refund.createdpara registrar o estado inicial;refund.updatedpara acompanhar mudanças, inclusivepending→succeeded;refund.failedpara tratar uma falha;charge.refundedpara reconciliar a charge;transaction.createdpara registrar o movimento negativo do extrato.
GET /v1/refunds/{id}. Para a integração normal,
prefira webhooks a polling.
Veja Objeto refund para o significado de cada
campo e Reembolsos para o modelo conceitual completo.

