Pesquisar

Are you looking for test card numbers?

Would you like to contact support?

Point-of-sale icon

Reembolsar um pagamento

Aprenda como emitir um reembolso no termina.

Não reembolsa pagamentos no terminal com frequência?

Se você quiser retornar fundos para um cliente depois de um pagamento ter sido Aprovado, você precisa reembolsar o pagamento.

Oferecemos dois tipos de reembolso:

  • Reembolsos referenciados estão conectados ao pagamento original, usando um identificador exclusivo desse pagamento.
  • Reembolsos não referenciados precisam ser reconciliados manualmente e permitem que você devolva qualquer valor a qualquer cartão apresentado na loja. Você pode usar isso, por exemplo, para emitir um reembolso para alguém que não fez o pagamento original, como um destinatário do presente.

Você pode oferecer suporte a um tipo de reembolso, ou ambos.

Para a maioria dos casos, recomendamos o uso de reembolsos referenciados, pois eles oferecem as seguintes vantagens sobre os reembolsos não referenciados:

  • Reconciliação mais simples: um reembolso pode ser comparado a um pagamento, usando o pspReference.
  • Menor risco de fraude de devolução: um pagamento não pode ser reembolsado várias vezes ou por um valor superior a 100% do valor do pagamento.
  • Suporte para métodos de pagamento que não utilizam catão, como Alipay e WeChat Pay.
  • Reembolsos entre canais: os reembolsos podem ser emitidos na loja ou em sua central de atendimento.

Quando um reembolso é processado, ele é deduzido dos fundos em processamento e aparecerá na conta do cliente em alguns dias.

  • • O reembolso de pagamentos do BankAxept requer um contrato adicional com o esquema BankAxept e só é possível em lojas nas quais o cliente fez uma compra.

  • As seguintes bandeira de cartões oferecem suporte apenas a reembolsos não referenciados.
    • Bancontact
    • Dankort
    • Interac

Reembolsos referenciados

Quando você faz um pagamento no terminal, conectamos os detalhes de pagamento do cliente ao pagamento que esta sendo realizado. Em resposta, retornamos o identificador da transação do pagamento no formato tenderReference.pspReference. Para fazer um reembolso referenciado, você especifica esse identificador de transação na sua solicitação de reembolso. Isso nos permite validar o reembolso com relação ao pagamento original, para garantir que ele ainda não tenha sido reembolsado.
Para um reembolso total usando o mesmo terminal que foi usado no pagamento original, basta especificar tenderReference, porque todas as informações estão disponíveis nesse terminal. Em todos os outros casos .pspReference é necessário.

Ao reembolsar um pagamento offline, o problema é que você não recebe a referência PSP na resposta de pagamento offline. Nesse caso, você pode fazer um reembolso referenciado usando apenas a referência tender, desde que você use o mesmo terminal que foi usado para o pagamento original. Outras opções são encontrar a referência PSP na sua área de cliente ou no webhook de notificação para pagamento offline ou para fazer um reembolso não referenciado.

Dependendo do retorno do cliente, você pode realizar um:

  • Reembolso total: retorna o valor total da compra ao comprador.
  • Reembolso parcial: devolve parte da compra ao cliente. Por exemplo, quando um comprador deseja devolver um dos itens que comprou.

    Você também pode fazer vários reembolsos parciais. Isso pode ser útil quando, por exemplo, um comprador está retornando vários itens em momentos diferentes.

Etapa 1: Realizando um reembolso referenciado

As solicitações de reembolso total e parcial são muito semelhantes: existem alguns parâmetros adicionais para um reembolso parcial. Para fazer uma solicitação de reembolso total ou parcial referenciada:

  • Faça uma solicitação POST para o endpoint da API de terminais, especificando:

    • MessageHeader: Segue a estrutura da MessageHeader padrão, explicada nos fundamentos da API de terminais:

      • ProtocolVersion: 3.0
      • MessageClass: Service
      • MessageCategory: Reversal. Isso indica que você está iniciando uma solicitação de reembolso.
      • MessageType: Request
      • SaleID: Seu ID exclusivo para a caixa registradora.
      • ServiceID: Seu ID exclusivo para a tentativa de transação, consistindo em 1 a 10 caracteres alfanuméricos. Esse valor precisa ser exclusivo nas últimas 48 horas.
      • POIID: ID exclusivo do terminal. Isso indica para qual terminal o pagamento será roteado.

    • ReversalRequest objeto que contém:

      • OriginalPOITransaction.POITransactionID.TransactionID: Identificador de transação do pagamento original que você deseja reembolsar, em um dos seguintes formatos:

        Formato Exemplo
        tenderReference.pspReference 7JLX001566393198001.851556019495143C

        Formato Recomendado

        0000000000000000.pspReference 0000000000000000.851556019495143C

        Este tem 16 zeros em vez de uma referência Tender.

        .pspReference .851556019495143C

        TEste funciona a partir da versão do software do terminal 1.44. Não esqueça o ponto inicial (.).

        tenderReference 7JLX001566393198001

        Somente para um reembolso total usando o mesmo terminal que o pagamento original.

      • OriginalPOITransaction.POITransactionID.TimeStamp: Data e hora da transação original.
      • ReversalReason: MerchantCancel

    • Para um reembolso parcial, incluia adicionalmente no objeto ReversalRequest:

      • ReversedAmount: O valor que está sendo devolvido ao cliente no reembolso parcial.
      • SaleData.SaleToAcquirerData: The A moeda, no formato currency=EUR. . Este deve corresponder à moeda usada para efetuar o pagamento original
      • SaleData.SaleTransactionID.TimeStamp: Data e hora do reembolso parcial.
      • SaleData.SaleTransactionID.TransactionID: Sua referência exclusiva para o reembolso parcial. Nos relatórios da área do cliente da Adyen, isso será exibido como merchant reference para a transação.

    Para obter uma lista completa dos campos que você pode passar ao fazer um reembolso referenciado, consulte a referência ReversalRequest API.

    Este exemplo mostra como você faria um reembolso total.

    {
          "SaleToPOIRequest":{
             "MessageHeader":{
                "ProtocolVersion":"3.0",
                "MessageClass":"Service",
                "MessageCategory":"Reversal",
                "MessageType":"Request",
                "SaleID":"POSSystemID12345",
                "ServiceID":"0207111107",
                "POIID":"V400m-324688179"
              },
             "ReversalRequest":{
                "OriginalPOITransaction":{
                   "POITransactionID":{
                      "TransactionID":"7JLX001566393198001.851556019495143C",
                      "TimeStamp":"2019-03-07T10:11:04+00:00"
                   }
                },
                "ReversalReason":"MerchantCancel"
             }
          }
        }
    String saleID = "YOUR_CASH_REGISTER_ID";
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.REVERSAL );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setSaleID(saleID);
    messageHeader.setServiceID(serviceID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    ReversalRequest reversalRequest = new ReversalRequest();
    OriginalPOITransaction originalPOITransaction = new OriginalPOITransaction();
    TransactionIdentification pOITransactionID = new TransactionIdentification();
    pOITransactionID.setTransactionID(transactionID);
    pOITransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    originalPOITransaction.setPOITransactionID(pOITransactionID);
    reversalRequest.setOriginalPOITransaction(originalPOITransaction);
    reversalRequest.setReversalReason( ReversalReasonType.MERCHANT_CANCEL );
    saleToPOIRequest.setReversalRequest(reversalRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);

    Este exemplo mostra como você faria um reembolso parcial de 6.00 EUR.

    {
          "SaleToPOIRequest":{
             "MessageHeader":{
                "ProtocolVersion":"3.0",
                "MessageClass":"Service",
                "MessageCategory":"Reversal",
                "MessageType":"Request",
                "SaleID":"POSSystemID12345",
                "ServiceID":"207111108",
                "POIID":"V400m-324688179"
             },
             "ReversalRequest":{
                "OriginalPOITransaction":{
                   "POITransactionID":{
                      "TransactionID":"pZtU001251034513719.881566567357804C",
                      "TimeStamp":"2019-08-12T15:40:03+00:00"
                   }
                },
                "ReversalReason":"MerchantCancel",
                "ReversedAmount":6.00,
                "SaleData":{
                   "SaleToAcquirerData":"currency=EUR",
                   "SaleTransactionID":{
                      "TimeStamp":"2019-08-15T12:00:00+00:00",
                      "TransactionID":"27911"
                   }
                }
             }
          }
        }
     }
    String saleID = "YOUR_CASH_REGISTER_ID";
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.REVERSAL );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setSaleID(saleID);
    messageHeader.setServiceID(serviceID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    ReversalRequest reversalRequest = new ReversalRequest();
    OriginalPOITransaction originalPOITransaction = new OriginalPOITransaction();
    TransactionIdentification pOITransactionID = new TransactionIdentification();
    pOITransactionID.setTransactionID(transactionID);
    pOITransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    originalPOITransaction.setPOITransactionID(pOITransactionID);
    reversalRequest.setOriginalPOITransaction(originalPOITransaction);
    reversalRequest.setReversalReason( ReversalReasonType.MERCHANT_CANCEL );
    reversalRequest.setReversedAmount(6.0);
    
    SaleData saleData = new SaleData();
    saleData.setSaleToAcquirerData("currency=EUR");
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleTransactionID.setTransactionID(transactionID);
    saleData.setSaleTransactionID(saleTransactionID);
    reversalRequest.setSaleData(saleData);
    saleToPOIRequest.setReversalRequest(reversalRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);

Etapa 2: Recebendo o resultado do reembolso

Quando sua solicitação de reembolso total ou parcial é processada, você receberá o resultado.

  • Se for bem-sucedida, a resposta da API deverá conter um objeto ReversalResponse com:

    • POIData.POITransactionID.TransactionID: A referência do PSP para esta solicitação de reembolso.
    • Response.Result: Success
    Resposta para reembolso bem-sucedido
    {
       "SaleToPOIResponse":{
          "ReversalResponse":{
             "POIData":{
                "POITransactionID":{
                   "TimeStamp":"2019-05-23T10:32:32.928Z",
                   "TransactionID":"881566557882697F"
                }
             },
             "Response":{
                "Result":"Success",
                ...
             }
          },
          ...
       }
    }
  • Se malsucedida, a resposta verá conte um objeto ReversalResponse com:

    • Response.Result: Failure
    • AdditionalResponse: Contém um message explicando o motivo pelo qual a solicitação falhou.
    Resposta a um reembolso com falha
    {
       "SaleToPOIResponse":{
          "ReversalResponse":{
             "Response":{
                "Result":"Failure",
                "AdditionalResponse":"tid=24687685&...&message=Original%20pspReference%20required%20for%20this%20operation&posAmountCashbackValue=0&posEntryMode=UNKNOWN&posAuthAmountValue=0",
                "ErrorCondition":"NotAllowed"
             }
          },
          ...
          }
       }
    }

Para obter uma lista completa dos campos que você pode receber em uma resposta de reembolso referenciada, consulte a referência ReversalResponse API.

Tentamos emitir o reembolso de forma assíncrona e informamos se este é bem-sucedido com uma notificação de webhook. Se for bem-sucedido, o reembolso será emitido na conta do cliente.

Reembolsos não referenciados

Se você estiver usando reembolsos não referenciados, é altamente recomendável que seu sistema de caixa registradora seja capaz de conciliar um reembolso com uma compra original. Isso reduz o risco de fraude de devolução (um pagamento sendo reembolsado várias vezes) e erro humano (a equipe da loja insere o valor errado do reembolso).

Não é possível fazer um reembolso não referenciado a um método de pagamento com QR code, como Alipay e WeChat Pay. Para reembolsar esses métodos de pagamento, você deve fazer um reembolso referenciado.

Antes de começar

Antes de poder fazer reembolsos não referenciados, é necessário realizar algumas configurações.

  • Entre em contato com a POS Support Team e:

    • o Peça a eles para ativar reembolsos não referenciados para sua merchant account.
    • o Opcionalmente, peça que eles comfigurem um atraso no reembolso, para que você tenha tempo de cancelar um reembolso não referenciado quando necessário.

Efetuando um reembolso não referenciado

Para um reembolso não referenciado a um cartão vale presente, você precisa especificar mais parâmetros do que os descritos aqui. Consulte Reembolsar um cartão vale presente.

  1. Faça uma solicitação POST para o endpoint da API de terminais, especificando:

    • MessageHeader: Segue a estrutura da MessageHeader padrão, explicada nos fundamentos da API de terminais:

      • ProtocolVersion: 3.0
      • MessageClass: Service
      • MessageCategory: Payment. Isso indica que você está iniciando uma solicitação de reembolso.
      • MessageType: Request
      • SaleID: Seu ID exclusivo para a caixa registradora.
      • ServiceID: Seu ID exclusivo para a tentativa de transação, consistindo em 1 a 10 caracteres alfanuméricos. Esse valor precisa ser exclusivo nas últimas 48 horas.
      • POIID: ID exclusivo do terminal. Isso indica para qual terminal o pagamento será roteado.

    • PaymentRequest:

      • SaleData.SaleTransactionID.TimeStamp: : Data e hora do reembolso.
      • SaleData.SaleTransactionID.TransactionID: Sua referência exclusiva para o reembolso. Nos relatórios da área do cliente da Adyen, isso será exibido como merchant reference para a transação.
      • PaymentTransaction.AmountsReq: A Currency e o RequestedAmount sendo reembolsados no cartão
      • PaymentData.PaymentType: Refund

    O exemplo abaixo mostra como você reembolsaria 10,99 EUR para um cartão.

    {
        "SaleToPOIRequest":{
            "MessageHeader":{
                "ProtocolVersion":"3.0",
                "MessageClass":"Service",
                "MessageCategory":"Payment",
                "MessageType":"Request",
                "SaleID":"POSSystemID12345",
                "ServiceID":"12392",
                "POIID":"V400m-324688179"
            },
            "PaymentRequest":{
                "SaleData":{
                    "SaleTransactionID":{
                        "TimeStamp":"2019-04-23T12:15:01+00:00",
                        "TransactionID":"YOUR_REFUND_REFERENCE"
                    }
                },
                "PaymentTransaction":{
                    "AmountsReq":{
                        "Currency":"EUR",
                        "RequestedAmount":10.99
                    }
                },
                "PaymentData":{
                    "PaymentType":"Refund"
                }
            }
        }
    }
    String saleID = "YOUR_CASH_REGISTER_ID";
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.PAYMENT );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setSaleID(saleID);
    messageHeader.setServiceID(serviceID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    PaymentRequest paymentRequest = new PaymentRequest();
    SaleData saleData = new SaleData();
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleTransactionID.setTransactionID(transactionID);
    saleData.setSaleTransactionID(saleTransactionID);
    paymentRequest.setSaleData(saleData);
    
    PaymentTransaction paymentTransaction = new PaymentTransaction();
    AmountsReq amountsReq = new AmountsReq();
    amountsReq.setCurrency("EUR");
    amountsReq.setRequestedAmount( BigDecimal.valueOf(10.99) );
    paymentTransaction.setAmountsReq(amountsReq);
    paymentRequest.setPaymentTransaction(paymentTransaction);
    
    PaymentData paymentData = new PaymentData();
    paymentData.setPaymentType( PaymentType.REFUND );
    paymentRequest.setPaymentData(paymentData);
    saleToPOIRequest.setPaymentRequest(paymentRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);

    Para obter uma lista completa dos campos que você pode passar ao fazer um reembolso não referenciado, consulte a referência PaymentRequest API.

    O pedido de reembolso é encaminhado para o terminal..

  2. Apresente o cartão no terminal e siga as instruções na tela do terminal.

    Se sua solicitação de reembolso for recebida com sucesso:

    • Approved será exibido na tela do terminal.
    • Você recebe uma resposta JSON com:
    {
        "SaleToPOIResponse": {
            "PaymentResponse": {
                "POIData": {
                    "POITransactionID": {
                        "TimeStamp": "2019-06-03T15:49:36.000Z",
                        "TransactionID": "4rVu001559576976000.881559576981487A"
                    },
                    ...
                },
                ...
                "Response": {
                    "Result": "Success",
                    ...
                }
            },
            ...
        }
    }

    Para obter uma lista completa dos campos que você pode receber em uma resposta de reembolso não referenciada, consulte a referência ReversalResponse API.

    [/notice]

    Tentamos emitir o reembolso de forma assíncrona e informamos se isso é bem-sucedido com uma notificação de webhook. Se for bem-sucedido, o reembolso será emitido para o cartão apresentado no terminal.

Notificações de reembolso

Quando recebemos sua solicitação de reembolso, enviamos uma notificação de webhook para informá-lo se essa solicitação foi processada. Esta notificação contém:

  • eventCode: REFUND
  • pspReference: Corresponde a TransactionID da solicitação de reembolso.
  • success: Indica se a solicitação de reembolso foi processada:

    • true: processamos sua solicitação de reembolso. Isso geralmente resulta na emissão do reembolso.
    • false: não processamos sua solicitação de reembolso. Isso significa que você não possui fundos em processo suficientes para emitir o reembolso. Você deve aumentar seus fundos em processo, e solicitar o reembolso novamente.

Em casos raros, após o processamento da sua solicitação de reembolso, você poderá receber uma notificação indicando que esse reembolso:

Uma visão geral dos reembolsos com falha e reversão está disponível no seu relatório de contabilidade de pagamentos.

Falha no reembolso

Se houver um problema técnico ao tentar emitir um reembolso, enviaremos uma notificação que contém:

  • eventCode: REFUND_FAILED
  • originalReference: O pspReference do pagamento que você está reembolsando..
  • pspReference: Nosso identificador exclusivo para o reembolso que falhou.

Quando um reembolso falhar, tentaremos corrigir o problema e tentar o reembolso novamente.

Reembolso revertido

Se tentarmos reembolsar um pagamento e a conta do comprador não for mais válida (por exemplo, eles fecharam a conta), enviaremos uma notificação que contém:

  • eventCode: REFUNDED_REVERSED
  • originalReference: A solicitação pspReference do reembolso com falha.
  • success: true

Isso significa que os fundos foram devolvidos à Adyen e estão de volta à merchant account.

Próximos passos