Para utilizar a funcionalidade de estorno do Zoop Android SDK, você chamará 1 método da classe ZoopTerminalVoidPayment:

void voidTransaction (String transactionId, String marketplaceId, String sellerId, String publishableKey)

Mas antes disso, precisamos implementar algumas interfaces.

Interface VoidTransactionListener

Implemente a interface VoidTransactionListener para receber notificações de status, solicitações e resultados finais do estorno.

A seguir, os 4 callbacks presentes neste "Listener". Detalharemos cada um deles em sequência:

  • void voidTransactionSuccessful (JSONObject var1)

  • void voidTransactionFailed (JSONObject var1)

  • void currentVoidTransactionCanBeAbortedByUser (boolean var1)

  • void voidAborted()

voidTransactionSuccessful

Esse método notifica sua aplicação de que uma transação foi estornada com sucesso.

A seguir, um exemplo de código:

@Override
public void voidTransactionSuccessful(final JSONObject joResponse) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      TextView textViewResponse = (TextView) findViewById(R.id.textViewResponse);
      textViewResponse.setText("A transação foi estornada e a cobrança cancelada.");
      VoidTransactionActivity.this.joResponse = joResponse;
    }
  });
}

voidTransactionFailed

Esse método notifica sua aplicação de que a tentativa de estornar uma transação falhou. Dentre outras informações, podemos encontrar uma mensagem de erro amigável dentro do "JSONObject".

A seguir, um exemplo de código:

@Override
public void voidTransactionFailed(final JSONObject joResponse) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      TextView textViewResponse = (TextView) findViewById(R.id.textViewResponse);
      String errorMessage = "Erro ao realizar o estorno.";
      if (joResponse.has("error")) {
        JSONObject joResponseError = joResponse.getJSONObject("error");
        if (joResponseError.has("message")) {
          errorMessage = joResponse.getString("message");
        }			
      }
      textViewResponse.setText(errorMessage);
      Button buttonTryAgain = (Button) findViewById(R.id.buttonTryAgain);
      buttonTryAgain.setVisibility(View.VISIBLE);
    }
  });
}

currentVoidTransactionCanBeAbortedByUser

Esse método notifica sua aplicação se em determinando momento é permitido abortar uma tentativa de estorno em andamento.

A seguir, um exemplo de código:

@Override
public void currentVoidTransactionCanBeAbortedByUser(final boolean canAbortCurrentCharge) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      Button buttonCancel = (Button) findViewById(R.id.buttonCancel);
      buttonCancel.setEnabled(canAbortCurrentCharge);
    }
  });
}

voidAborted

Esse método notifica sua aplicação de que a tentativa de estorno foi abortada com sucesso após a solicitação do usuário. Esse "callback" pode ser acionado ao chamarmos o método "void requestAbortCharge()" da classe ZoopTerminalVoidPayment. A outra forma é clicando no botão "Cancel" da maquininha.

A seguir, um exemplo de código:

@Override
public void voidAborted() {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      TextView textViewResponse = (TextView) findViewById(R.id.textViewResponse);
      textViewResponse.setText("Operação cancelada pelo usuário.");
    }
  });
}

Interface ApplicationDisplayListener

Implemente a interface ApplicationDisplayListener para solicitar que o aplicativo apresente mensagens ao usuário.

A seguir, os 2 callbacks presentes neste "Listener". Detalharemos cada um deles em sequência:

  • void showMessage (String message, TerminalMessageType messageType)

  • void showMessage (String message, TerminalMessageType messageType, String explanation)

showMessage

Esse método notifica sua aplicação com uma mensagem e o tipo da mensagem para que sua aplicação possa fazer o processamento que julgar necessário antes de repassar ao usuário.

A seguir, um exemplo de código:

@Override
public void showMessage(final String message, final TerminalMessageType messageType) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      TextView textViewMessage = (TextView) findViewById(R.id.textViewMessage);
      textViewMessage.setText(message);  
    }
  });
}

showMessage

Esse método notifica sua aplicação com uma mensagem, o tipo da mensagem e uma breve explicação para que sua aplicação possa fazer o processamento que julgar necessário antes de repassar ao usuário.

A seguir, um exemplo de código:

@Override
public void showMessage(final String message, final TerminalMessageType messageType, final String explanation) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      TextView textViewMessage = (TextView) findViewById(R.id.textViewMessage);
      textViewMessage.setText(message);  
      TextView textViewExplanation = (TextView) findViewById(R.id.textViewExplanation);
      textViewExplanation.setText(explanation); 
    }
  });
}

Após implementar os callbacks podem efetivamente fazer a chamada pro estorno.

Classe ZoopTerminalVoidPayment

Para realizar um estorno, na "onCreate()" da sua "Activity", antes de chamar o método "voidTransaction", deve-se criar uma nova instância do ZoopTerminalVoidPayment e setar os seus "listerners".

A seguir, um exemplo de código:

try {
  ZoopTerminalVoidPayment zoopTerminalVoidPayment = new ZoopTerminalVoidPayment();
  zoopTerminalVoidPayment.setApplicationDisplayListener(VoidTransactionActivity.this);
  zoopTerminalVoidPayment.setVoidPaymentListener(VoidTransactionActivity.this);
  zoopTerminalVoidPayment.voidTransaction(joTransactionResponse.getString("id"), marketplaceId, sellerId, publishableKey);
} catch (Exception e) {
  Log.e("Error instantiating ZoopTerminalVoidPayment", e);
}

A seguir, descrevemos os 4 parâmetros do método "voidTransaction":

void voidTransaction (String transactionId, String marketplaceId, String sellerId, String publishableKey)

  • transactionId - String contendo o identificador da transação a ser estornada

  • marketplaceId - String contendo o identificador registrado para o marketplace atual

  • sellerId - String contendo o identificador do vendedor registrado

  • publishableKey - chave de identificação em String

A seguir, um exemplo de código:

zoopTerminalVoidPayment.voidTransaction("360ac14b83dd41c6827a19e6dd8bd427",
                                        "ffffa5eeee47cccc8b22229d7777a3bb", 
                                        "8989894eee3434530909e9234565bffd", 
                                        "zk_test_jhUYGlLGlOPPoF23FFoaRODf");

Após o método "voidTransaction" ser chamado, o SDK irá se comunicar com a maquininha para obter as informações necessárias do cartão para que o estorno seja realizado com sucesso. Nesse processo, um possível fluxo seria passar repetidas vezes pelo método "showMessage" da interface ApplicationDisplayListener até que um "JSONObject" contendo informações do status do estorno seja trazido no método "voidTransactionSuccessful" ou no método "voidTransactionFailed", ambos da interface "VoidTransactionListener".