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
As taxas da venda original não são devolvidas. Por isso a transaction do refund
tem
fee_amount: 0, enquanto o custo já registrado na transaction original
permanece no extrato.
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.
(c) Refund total por uma charge específica
Usecharge quando você precisa escolher a tentativa exata, por exemplo ao
conciliar uma cobrança duplicada.
(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.
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.

