Estornar uma transação com a API Pagar.me é muito simples, seja ela de Cartão de crédito ou de Boleto bancário. Tudo o que você precisa fazer é enviar uma requisição POST para a rota /transactions/:id/refund, na qual :id é o ID da transação.

1. Cartão de Crédito

Estorno completo de uma transação

curl -X POST 'https://api.pagar.me/1/transactions/:id/refund' -H 'content-type: application/json' -d '{
    "api_key": "ak_test_grXijQ4GicOa2BLGZrDRTR5qNQxJW0"
}'
transaction = PagarMe::Transaction.find_by_id("ID")
transaction.refund

transaction.status
<?php
require("vendor/autoload.php");
$pagarme = new PagarMe\Client('SUA_CHAVE_DE_API');

$refundedTransaction = $pagarme->transactions()->refund([
  'id' => 'ID_OU_TOKEN_DA_TRANSAÇÃO',
]);

?>
var transaction = PagarMeService.GetDefaultService().Transactions.Find("ID");

transaction.Refund();

TransactionStatus status = transaction.Status;
import me.pagar.model.PagarMe;
import me.pagar.model.PagarMeException;
import me.pagar.model.Transaction;
import me.pagar.model.Transaction.PaymentMethod;

PagarMe.init("SUA_API_KEY");

Transaction tx = new Transaction().find(1130974);

tx.refund(1000);
import pagarme from 'pagarme'

pagarme.client.connect({ api_key: 'SUA_API_KEY' })
  .then(client => client.transactions.refund({
    id: 21314124
  }))
import pagarme

pagarme.authentication_key('SUA_API_KEY')

trx = pagarme.transaction.find_by({
  'id': 'ID_TRANSACTION'
})

params_refund = {
    'amount': '10000'
}

refunded_trx = pagarme.transaction.refund(trx['id'], params_refund)

print(refunded_trx)

Pronto! De forma rápida você consegue estornar uma transação. Vale lembrar que também é possível estornar transações via Dashboard.

Estorno parcial de uma transação

Também é possível fazer estornos parciais de uma transação. Ou seja, se você deseja estornar uma quantia específica, é preciso passar apenas mais um parâmetro: amount.

Exemplos estorno parcial de cartão:

curl -X POST 'https://api.pagar.me/1/transactions/:id/refund' -H 'content-type: application/json' -d '{
    "amount": "6153", 
    "api_key": "ak_test_grXijQ4GicOa2BLGZrDRTR5qNQxJW0"
}'
transaction = PagarMe::Transaction.find_by_id("{ID}")
transaction.refund("amount"=>1000)

transaction.status
<?php
require("vendor/autoload.php");
$pagarme = new PagarMe\Client('SUA_CHAVE_DE_API');

$partialRefundedTransaction = $pagarme->transactions()->refund([
  'id' => 'ID_OU_TOKEN_DA_TRANSAÇÃO',
  'amount' => 'VALOR_PARCIAL_EM_CENTAVOS'
]);
?>
var transaction = PagarMeService.GetDefaultService().Transactions.Find("ID");

transaction.Refund(1000);

TransactionStatus status = transaction.Status;
import pagarme from 'pagarme'
  
pagarme.client.connect({ api_key: 'SUA_API_KEY' })
  .then(client => {
    return client.transactions.create({
      amount: 1000,
    })
      .then(transaction => client.transactions.refund({
	    	id: transaction.id,
      	amount: 500
      })
  })
import pagarme

pagarme.authentication_key('SUA_API_KEY')

trx = pagarme.transaction.find_by({
  'id': 'ID_TRANSACTION'
})

params_refund = {
    'amount': '10000'
}

refunded_trx = pagarme.transaction.refund(trx['id'], params_refund)

print(refunded_trx)

🚧

Vale ressaltar:

Uma transação estornada parcialmente tem status paid até que a soma de todos os estornos parciais seja igual ao valor da transação. Somente nesse momento o status muda para refunded.

2. Boleto

Para estornar uma transação por boleto bancário, o caminho é um pouco mais extenso. Isso acontece pois precisamos dos dados bancários da pessoa que irá receber a quantia estornada. Veja o exemplo:

curl -X POST 'https://api.pagar.me/1/transactions/:id/refund' -H 'content-type: application/json' -d '{
    "api_key": "ak_test_grXijQ4GicOa2BLGZrDRTR5qNQxJW0", 
    "bank_account": {
        "agencia": "1111", 
        "agencia_dv": "1", 
        "bank_code": "001", 
        "conta": "11111111", 
        "conta_dv": "1", 
        "document_number": "11111111111", 
        "legal_name": "Jose da Silva"
    }
}'
transaction = PagarMe::Transaction.find_by_id("ID")

bank_account ={ 'bank_code' => '001',
				'agencia' => '1111',
				'agencia_dv' => '1',
				'conta' => '11111111',
				'conta_dv' => '1',
				'document_number' => '11111111111',
				'legal_name' => 'Jose da Silva'
  }

transaction = PagarMe::Transaction.find_by_id("1391567")
transaction.refund('bank_account'=> bank_account)
transaction.status
<?php
require("vendor/autoload.php");
$pagarme = new PagarMe\Client('SUA_CHAVE_DE_API');

$refundedTransaction = $pagarme->transactions()->refund([
  'id' => 'ID_DA_TRANSACAO',
  'bank_account' => [
    'bank_code' => '001',
    'agencia' => '1111',
    'agencia_dv' => '1',
    'conta' => '11111111',
    'conta_dv' => '1',
    'document_number' => '11111111111',
    'legal_name' => 'Jose da Silva'
  ],
]);
?>
var transaction = PagarMeService.GetDefaultService().Transactions.Find("ID");

BankAccount bankAccount = new BankAccount();

bankAccount.Agencia = "0196";
bankAccount.AgenciaDv = "0";
bankAccount.Conta = "05392";
bankAccount.ContaDv = "0";
bankAccount.BankCode = "0341";
bankAccount.DocumentNumber = "05737104141";
bankAccount.LegalName = "JONATHAN LIMA";

transaction.Refund(bankAccount);

TransactionStatus status = transaction.Status;
import pagarme from 'pagarme'

pagarme.client.connect({ api_key: 'SUA_API_KEY' })
  .then(client => client.transactions.refund({
    id: 21314124,
    bank_code: '237',
    agencia: '1935',
    agencia_dv: '9',
    conta: '23398',
    conta_dv: '9',
    legal_name: 'API BANK ACCOUNT',
    document_number: '26268738888'
  }))
import pagarme

pagarme.authentication_key('SUA_API_KEY')

params = {
  'amount': '10000',
  'payment_method': 'boleto',
  'customer': {
    'email': '[email protected]',
    'name': 'Daenerys Targaryen',
    'document_number': '18152564000105',
    'address': {
        'zipcode': '04571020',
        'neighborhood': 'Dragon Village',
        'street': 'Rua Drogon',
        'street_number': '240'
    },
    'phone': {
      	'number': '987654321',
        'ddd': '11'
    }
  },
    'metadata': {
        'command':'Dracarys'
    }
}
trx = pagarme.transaction.create(params)

params_pay_boleto = {
    'status': 'paid'
}

pagarme.transaction.pay_boleto(trx['id'], params_pay_boleto)

params_refund = {
    'amount': '10000',
    'bank_account': {
        'agencia': '0932',
        'agencia_dv': '5',
        'bank_code': '341',
        'conta': '58054',
        'conta_dv': '1',
        'document_number': '26268738888',
        'legal_name': 'HOUSE TARGARYEN'
    }
}

refunded_trx = pagarme.transaction.refund(trx['id'], params_refund)

print(refunded_trx)

🚧

Estorno parcial por boleto

Como mencionado anteriormente, para que o estorno seja parcial você precisa apenas adicionar o parâmetro amount na requisição.


Próximo

Excelente trabalho, você agora já sabe como criar e estornar transações, assim como enviar metadata para tratar os dados posteriormente. Está pronto para aprender mais sobre o Checkout Pagar.me? Vamos lá!