Ir para o conteúdo

testCard

Método utilizado para a checagem das interfaces de captura para a API de Pagamentos. Com esse método, é possível especificar o tipo da tecnologia de captura de cartões que se deseja testar e obter o resultado da captura com os códigos da BC.

Método

Assinatura Descrição
void testCard(CardTestInterface cardTestInterface, PaymentCallback callback) Realiza a leitura da interface de captura especificada.

Parâmetros

Nome Tipo Obrigatório Descrição
cardTestInterface CardTestInterface Sim Especifica o tipo da tecnologia de captura de cartões que se deseja testar.
callback PaymentCallback Sim Callback pardrão utilizado para as demais funções do PaymentClient que carrega a String com o resultado das operações.

Detalhe dos parâmetros

cardTestInterface

Interface de captura Descrição
KEYBOARD Captura manual por meio da digitação dos dados do cartão.
MAGSTRIPE Captura por tarja.
EMV_IN Inserção de chip.
EMV_OUT Remoção de chip.
NFC_MAGSTRIPE Captura por contactless simulando tarja.
NFC_CHIP Captura por contactless EMV.

Detalhes do parâmetro paymentCallback

O parâmetro paymentCallback é definido por a instância de um objeto PaymentClient.PaymentCallback que usa o tipo definido pelo seu retorno, ou seja, no caso do métodos testCard que tem uma String retornada, a instância do paymentCallback deve ser PaymentClient.PaymentCallback<String>.

É importante pontuar que para realizar a instância do paymentCallback, é necessário implementar os métodos onSuccess e onError devido ao PaymentClient.PaymentCallback ser uma interface.

O método onSuccess que deverá ser implementado carrega do resultado da operação em seu parâmetro, que deve ser do mesmo tipo do retono do método que se deseja chamar, ou seja, no caso do testCard que tem o seu retorno como String o método onSuccess deve ser implementado com a assinatura do seu parâmetro sendo do tipo String.

No método onError a execução sempre ocorrerá quando houver falha ao executar a operação, a assinatura do seu método diferente do onSuccess não depende do tipo do retorno, sendo sempre ErrorData que contém os dados de erro da operação como os atributos. erro.

Nome Tipo Descrição
ErrorData.paymentsResponseCode String Código de resposta para o erro ocorrido. Vide Códigos de Resposta
ErrorData.responseMessage String Mensagem descritiva da causa do erro.

Sintetizando os detalhes abordados em código temos:

PaymentClient paymentClient = new PaymentClient(); //Criando um objeto PaymentClient
paymentClient.bind(this.getApplicationContext());  //Realizando o bind

try{
    mPaymentClient.testCard(CardTestInterface.MAGSTRIPE, new PaymentClient.PaymentCallback<String>() {
    //                                                                                       ^
    // instanciando o parâmetro para trabalhar com o tipo do seu retorno (String). <---------'      
        @Override
        public void onSuccess(String result) {
        //                      ^
        // Assinatura do método onSuccess com o parâmetro do tipo String.
        // O parâmetro armazena o resultado da operação.
        }
        @Override
        public void onError(ErrorData errorData) {

        }
    });
} catch (ClientException e) {}

Exemplo

package br.com.phoebus.payments.demo;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import br.com.phoebus.android.payments.api.CardTestInterface;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.exception.ClientException;

public class TestCardActivity extends AppCompatActivity {

    public static final String TAG = "TAG_DEMO";
    private PaymentClient mPaymentClient = new PaymentClient();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_card);
        mPaymentClient = new PaymentClient();

        Button btn_manual = findViewById(R.id.btn_manual);
        btn_manual.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.KEYBOARD);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

        Button btn_tarja = findViewById(R.id.btn_tarja);
        btn_tarja.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.MAGSTRIPE);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

        Button btn_ctls_tarja = findViewById(R.id.btn_ctls_tarja);
        btn_ctls_tarja.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.NFC_MAGSTRIPE);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

        Button btn_ctls_chip = findViewById(R.id.btn_ctls_chip);
        btn_ctls_chip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.NFC_CHIP);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

        Button btn_emv_in = findViewById(R.id.btn_emv_in);
        btn_ctls_chip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.EMV_IN);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

        Button btn_emv_out = findViewById(R.id.btn_emv_out);
        btn_ctls_chip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    testCard(CardTestInterface.EMV_OUT);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        mPaymentClient.bind(this);
    }
    @Override
    protected void onPause() {
        try {
            mPaymentClient.unbind(this);
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        try {
            mPaymentClient.unbind(this);
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
        super.onDestroy();
    }

    public void testCard(CardTestInterface cardTestInterface) throws ClientException {
        try{
            mPaymentClient.testCard(cardTestInterface, new PaymentClient.PaymentCallback<String>() {
                @Override
                public void onSuccess(String s) {
                    Toast.makeText(getApplicationContext(), "ok testCard", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onError(ErrorData errorData) {
                    Toast.makeText(getApplicationContext(), "erro testCard", Toast.LENGTH_SHORT).show();
                }
            });
        } catch (ClientException e) {
            Log.e(TAG, "Error testCard", e);
        }
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TestCardActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/btn_manual"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Manual"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="161dp"
            tools:layout_editor_absoluteY="145dp" />

        <Button
            android:id="@+id/btn_ctls_chip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Ctls chip"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="159dp"
            tools:layout_editor_absoluteY="372dp" />

        <Button
            android:id="@+id/btn_tarja"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Tarja"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="161dp"
            tools:layout_editor_absoluteY="221dp" />

        <Button
            android:id="@+id/btn_ctls_tarja"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Ctls tarja"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="153dp"
            tools:layout_editor_absoluteY="294dp" />

        <Button
            android:id="@+id/btn_emv_in"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Inserir cartão"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="139dp"
            tools:layout_editor_absoluteY="451dp" />

        <Button
            android:id="@+id/btn_emv_out"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Remover cartão"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="132dp"
            tools:layout_editor_absoluteY="524dp" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Resultado

Implementando o exemplo é possível obter o seguinte resultado:

Ao selecionar uma das opções, é iniciado o fluxo de captura de cartões para a validação da leitura.