Como cancelar transações na Mundi

Guid merchantKey = Guid.Parse("00000000-0000-0000-0000-000000000000");
// Chave do pedido
Guid orderKey = Guid.Parse("219d7581-78e2-4aa9-b708-b7c585780bfc");

// Cria o cliente para cancelar as transações.
IGatewayServiceClient client = new GatewayServiceClient(merchantKey, new Uri("https://sandbox.mundipaggone.com"));

// Cancela as transações de cartão de crédito do pedido.
var httpResponse = client.Sale.Manage(ManageOperationEnum.Cancel, orderKey);

if (httpResponse.HttpStatusCode == HttpStatusCode.OK
    && httpResponse.Response.CreditCardTransactionResultCollection.Any()
    && httpResponse.Response.CreditCardTransactionResultCollection.All(p => p.Success == true)) {
    Console.WriteLine("Transações canceladas.");
}
<?php

try
{
    // Carrega dependências
    require_once(dirname(__FILE__) . '/vendor/autoload.php');

    // Define a URL a ser utilizada
    \Gateway\ApiClient::setBaseUrl("https://sandbox.mundipaggone.com");

    // Define a chave de loja a ser utilizada
    \Gateway\ApiClient::setMerchantKey("85328786-8BA6-420F-9948-5352F5A183EB");

    // Cria objeto requisição
    $request = new \Gateway\One\DataContract\Request\CancelRequest();

    // Define dados da requisição
    $request->setOrderKey("219d7581-78e2-4aa9-b708-b7c585780bfc");

    //Cria um objeto ApiClient
    $client = new Gateway\ApiClient();

    // Faz a chamada para criação
    $response = $client->cancel($request);

}
catch (\Gateway\One\DataContract\Report\ApiError $error)
{
    $httpStatusCode = $error->errorCollection->ErrorItemCollection[0]->ErrorCode;
    $response = array("message" => $error->errorCollection->ErrorItemCollection[0]->Description);
}
catch (Exception $ex)
{
    $httpStatusCode = 500;
    $response = array("message" => "Ocorreu um erro inesperado.");
}
finally
{
    header('Content-Type: application/json');
    print json_encode($response->getData());
}
require 'mundipagg_sdk'

# variable with merchant key
merchantKey = '85328786-8BA6-420F-9948-5352F5A183EB'

# instantiate class with request methods
# :sandbox for sandbox ambient 
# :production for production ambient
gateway = Gateway::Gateway.new(:sandbox, merchantKey)

# creates request object for transaction
cancelSaleRequest = Gateway::ManageSaleRequest.new
cancelSaleRequest.OrderKey = '219d7581-78e2-4aa9-b708-b7c585780bfc'

# make the request and returns a response hash
puts response = gateway.Cancel(cancelSaleRequest)
from uuid import UUID
from mundipaggOnePython import GatewayServiceClient
from data_contracts import manage_creditcard_transaction, manage_sale_request
from enum_types import PlatformEnvironment, HttpContentTypeEnum, ManageOperationEnum

merchant_key = UUID('85328786-8BA6-420F-9948-5352F5A183EB')
end_point = "https://sandbox.mundipaggone.com/"

service_client = GatewayServiceClient(merchant_key, PlatformEnvironment.sandbox, HttpContentTypeEnum.json, end_point)

# cria o request de cancelamento.
manage_request = manage_sale_request(order_key = '219d7581-78e2-4aa9-b708-b7c585780bfc')

http_response = service_client.sale.manage_with_request(manage_operation = ManageOperationEnum.Cancel, manage_sale_request = manage_request)

# obtem o json da resposta.
json_response = http_response.json()
// Define loja 
UUID merchantKey = UUID.fromString("85328786-8BA6-420F-9948-5352F5A183EB"); // Chave da Loja - MerchantKey

// Cria o cliente que vai efetuar a operação
GatewayServiceClient serviceClient = new GatewayServiceClient(merchantKey, "https://sandbox.mundipaggone.com");

// Define a chave do pedido que será cancelado
UUID orderKey = UUID.fromString("219d7581-78e2-4aa9-b708-b7c585780bfc"); // Chave do pedido

// Submete a requisição de cancelamento
HttpResponseGenerics<ManageSaleResponse, ManageSaleRequest> httpResponse
= serviceClient.getSale().Manage(ManageOperationEnum.Cancel, orderKey);
{
    "OrderKey":"219d7581-78e2-4aa9-b708-b7c585780bfc"
}

Muitos consumidores desejam cancelar compras realizadas devido a problemas com o produto, insatisfação com o serviço, dentre outras razões.

Para isso a Mundi criou o método Cancel. Com ele é possível você realizar cancelamentos de pedidos e transações.

🚧

Cartão de crédito (Cancelamentos)

Cancelamentos só podem ser efetuados para transações de cartões de crédito. Boletos e débito online não podem ser cancelados pela nossa API. Para esses casos, a sua área financeira deve retornar os fundos do consumidor final via depósito bancário.

O método de cancelamento pode ser utilizado para:

  • Cancelar um pedido, ou seja, ao cancelá-lo você estará cancelando todas as transações dentro do pedido. Basta informar na requisição o OrderKey. Exemplo acima!
  • Cancelar uma transação específica, ou seja, ao cancelá-la você estará cancelando uma única transação dentro do pedido. Basta informar na requisição o OrderKey e o TransactionKey ou somente o TransactionKey. Exemplo a seguir:
  • Cancelar parcialmente um pedido ou transação. Dedicamos a abaixo seção para isso.
Guid merchantKey = Guid.Parse("00000000-0000-0000-0000-000000000000");
// Chave do pedido
Guid orderKey = Guid.Parse("219d7581-78e2-4aa9-b708-b7c585780bfc");

// Cria o cliente para cancelar as transações.
IGatewayServiceClient client = new GatewayServiceClient(merchantKey, new Uri("https://sandbox.mundipaggone.com"));

// Transação específica que será cancelada.
var transactionToCancel = new ManageCreditCardTransaction() {
    AmountInCents = 10000,
    TransactionKey = Guid.Parse("20ba0520-7d09-44f8-8fbc-e4329e2b18d5")
};

// Cancela as transações de cartão de crédito do pedido.
var httpResponse = client.Sale.Manage(ManageOperationEnum.Cancel, orderKey, transactionToCancel);

if (httpResponse.HttpStatusCode == HttpStatusCode.OK
    && httpResponse.Response.CreditCardTransactionResultCollection.Any()
    && httpResponse.Response.CreditCardTransactionResultCollection.All(p => p.Success == true)) {
    Console.WriteLine("Transações canceladas.");
}
<?php

try
{
    // Carrega dependências
    require_once(dirname(__FILE__) . '/vendor/autoload.php');

    // Define a URL a ser utilizada
    \Gateway\ApiClient::setBaseUrl("https://sandbox.mundipaggone.com");

    // Define a chave de loja a ser utilizada
    \Gateway\ApiClient::setMerchantKey("85328786-8BA6-420F-9948-5352F5A183EB");

    // Cria objeto requisição
    $request = new \Gateway\One\DataContract\Request\CancelRequest();

    // Define dados da requisição
    $request->addCreditCardTransaction()
            ->setAmountInCents(10000)
            ->setTransactionkey("20ba0520-7d09-44f8-8fbc-e4329e2b18d5");
    
    $request->setOrderKey("219d7581-78e2-4aa9-b708-b7c585780bfc");

    //Cria um objeto ApiClient
    $client = new Gateway\ApiClient();

    // Faz a chamada para criação
    $response = $client->cancel($request);

}
catch (\Gateway\One\DataContract\Report\ApiError $error)
{
    $httpStatusCode = $error->errorCollection->ErrorItemCollection[0]->ErrorCode;
    $response = array("message" => $error->errorCollection->ErrorItemCollection[0]->Description);
}
catch (Exception $ex)
{
    $httpStatusCode = 500;
    $response = array("message" => "Ocorreu um erro inesperado.");
}
finally
{
    header('Content-Type: application/json');
    print json_encode($response->getData());
}
require 'mundipagg_sdk'

# variable with merchant key
merchantKey = '85328786-8BA6-420F-9948-5352F5A183EB'

# instantiate class with request methods
# :sandbox for sandbox ambient 
# :production for production ambient
gateway = Gateway::Gateway.new(:sandbox, merchantKey)

# create credit card manage transaction object
creditCardTransaction = Gateway::ManageCreditCardTransaction.new
creditCardTransaction.AmountInCents = 10000
creditCardTransaction.TransactionKey = '20ba0520-7d09-44f8-8fbc-e4329e2b18d5'

# creates request object for transaction
cancelSaleRequest = Gateway::ManageSaleRequest.new
cancelSaleRequest.OrderKey = '219d7581-78e2-4aa9-b708-b7c585780bfc'
cancelSaleRequest.CreditCardTransactionCollection << creditCardTransaction

# make the request and returns a response hash
puts response = gateway.Cancel(cancelSaleRequest)
from uuid import UUID
from mundipaggOnePython import GatewayServiceClient
from data_contracts import manage_creditcard_transaction, manage_sale_request
from enum_types import PlatformEnvironment, HttpContentTypeEnum, ManageOperationEnum

merchant_key = UUID('85328786-8BA6-420F-9948-5352F5A183EB')
end_point = "https://sandbox.mundipaggone.com/"

service_client = GatewayServiceClient(merchant_key, PlatformEnvironment.sandbox, HttpContentTypeEnum.json, end_point)

# dados da transacao que sera cancelada
manage_creditcard_collection_data = [manage_creditcard_transaction(transaction_key = '20ba0520-7d09-44f8-8fbc-e4329e2b18d5', amount_in_cents = 10000)]

# cria o request de cancelamento.
manage_request = manage_sale_request(creditcard_transaction_collection = manage_creditcard_collection_data, order_key = '219d7581-78e2-4aa9-b708-b7c585780bfc')

http_response = service_client.sale.manage_with_request(manage_operation = ManageOperationEnum.Cancel, manage_sale_request = manage_request)

# obtem o json da resposta.
json_response = http_response.json()
// Define loja 
UUID merchantKey = UUID.fromString("85328786-8BA6-420F-9948-5352F5A183EB"); // Chave da Loja - MerchantKey

// Cria o cliente que vai efetuar a operação
GatewayServiceClient serviceClient = new GatewayServiceClient(merchantKey, "https://sandbox.mundipaggone.com");

ManageSaleRequest manageSaleRequest = new ManageSaleRequest();

// Define os detalhes da transação de cartão de crédito
ManageCreditCardTransaction manageCreditCardTransaction = new ManageCreditCardTransaction();
manageCreditCardTransaction.setAmountInCents(10000L);
manageCreditCardTransaction.setTransactionKey(UUID.fromString("20ba0520-7d09-44f8-8fbc-e4329e2b18d5"));
            
// Cria a lista de transações de cartão e adiciona a transação criada a lista
List<ManageCreditCardTransaction> manageCreditCardTransactionList = new ArrayList<ManageCreditCardTransaction>();
manageCreditCardTransactionList.add(manageCreditCardTransaction);
            
// Define a chave do pedido que será cancelado
manageSaleRequest.setOrderKey(UUID.fromString("219d7581-78e2-4aa9-b708-b7c585780bfc"));
manageSaleRequest.setCreditCardTransactionCollection(manageCreditCardTransactionList);

// Submete a requisição de cancelamento
HttpResponseGenerics<ManageSaleResponse, ManageSaleRequest> httpResponse
        = serviceClient.getSale().Manage(ManageOperationEnum.Cancel, manageSaleRequest);
{
    "CreditCardTransactionCollection":[{
        "AmountInCents":10000,
        "TransactionKey":"20ba0520-7d09-44f8-8fbc-e4329e2b18d5"
    }],
    "OrderKey":"219d7581-78e2-4aa9-b708-b7c585780bfc"
}

📘

Qual a diferença entre cancelamento e estorno?

Não se preocupe! Esses dois conceitos são bem parecidos!
O cancelamento é realizado até 23 hs e 59 min do dia da transação. Após este período é realizado o estorno da transação. Em termos práticos, o cancelamento não aparece na fatura do consumidor enquanto o estorno aparecerá. Aqui na Mundi ambos são feitos pelo mesmo método, pois queremos deixar tudo mais simples para você!

Algumas das adquirentes não permitem a realização de estornos via API. Da mesma maneira, não podemos realizar essas operações. Colocamos abaixo a lista das adquirentes e as funcionalidades permitidas.

AdquirenteCancelamentoEstorno
CieloSimSim
RedeSimNão
StoneSimSim
ElavonSimSim
GetNetSimSim

Na resposta da requisição de cancelamento, você receberá dois tipos de status de transação: Voided caso a sua transação tenha sido cancelada ou Refunded para casos nos quais a transação foi estornada.

Cancelamento parcial

Algumas adquirentes permitem que o ecommerce realize cancelamentos parciais. Pensando nisso, também colocamos na requisição uma opção para que você possa realizar essas operações. Colocamos abaixo a lista das adquirentes nas quais essas funcionalidades são permitidas.

AdquirenteCancelamento parcialEstorno parcial
CieloSimSim
RedecardSimNão
StoneSimSim
GetNetSimSim
ElavonSimSim

Para realizar um cancelamento parcial basta acrescentar na requisição o valor que deve ser cancelado na transação no campo AmountInCents. Caso você não nos informe esse valor, o default é que o valor total seja cancelado.

Na resposta da requisição de cancelamento, você poderá receber dois tipos de status de transação: PartialVoid caso a sua transação tenha sido parcialmente cancelada ou PartialRefund para casos nos quais a transação foi parcialmente estornada.

Cancelamento pendente

As adquirentes possuem instabilidades que refletem diretamente na realização de algumas operações. Em alguns cenários, fazemos a requisição de cancelamento e a mesma não é processada ou não é válida. Nesses casos, as transações podem assumir os status, PendingVoid cancelamento pendente ou PendingRefund estorno pendente.

Nesses casos, o ecommerce deve entrar em contato com a adquirente para realizar o cancelamento ou estorno da transação desejada. Basta informar os identificadores das transações nas adquirentes, a Mundi os disponibiliza tanto na resposta da requisição quanto no Portal.

Language