Ir para o conteúdo

SupervisorPasswordCheck()

Esse método realiza autenticação da senha do supervisor, visa permitir que aplicações terceiras possam ter acesso a senha do supervisor, cadastrada durante o credenciamento do terminal. Essa funcionalidade deve permitir autenticação de supervisor, sendo uma forma de segurança extra para aplicações que utilizam a API de pagamentos. Importante, para uma comunicação segura de senhas, esse método segue regras de criptografia para autenticação da senha. Dessa forma, a autenticação só irá ocorrer se a aplicação terceira estiver seguindo essas regras.

Método

Assinatura Descrição
void supervisorPasswordCheck(SupervisorPasswordRequest supervisorPassword, PaymentCallback paymentCallback) Realiza o processo de autenticação do supervisor

Parâmetros

Nome Tipo Obrigatório Descrição
supervisorPassword String Sim Senha do supervisor cadastrado durante o credenciamento do terminal. É esperado que seja enviado o hash em MD5 da senha para autenticação.
ApplicationInfo.credentials Credentials Sim Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso.
ApplicationInfo.softwareVersion String Sim Versão da aplicação que está solicitando a checagem da senha do supervisor

Detalhes dos parâmetros.

O parâmetro supervisorPassword deve ser no formato String. Detalhes importantes, o envio da senha do supervisor, deve ser a mesma que foi informada durante o credenciamento do terminal. Formatação, deve ser enviada uma String contendo o hash MD5, para ser validado. Se a senha for enviada em aberto, a senha não será autenticada, por mais que esteja correspondente com a que foi cadastrada durante o credenciamento. Se a senha não tiver sido cadastrada durante o credenciamento ou o terminal não tiver sido credenciado junto ao portal da PayStore, a autenticação não ocorrerá com sucesso, será retornado erro correspondente.

Resultado: Retorna true se a senha for igual com a formatação e o valor correto.

O parâmetro ApplicationInfo.credentials deve ser enviado contendo as credenciais da aplicação terceira, essas credenciais devem ser enviadas sempre. Caso não sejam enviadas, será retornado erro relacionado.

Resultado: Caso as credencias sejam informadas, a autenticação ocorrerá com sucesso, caso não seja enviado, será retornando erro correspondente.

O parâmetro ApplicationInfo.softwareVersion deve ser enviado contendo as softwareVersion da aplicação terceira, essas credenciais devem ser enviadas sempre. Caso não sejam enviadas, será retornado erro relacionado

Resultado: Caso as credencias sejam informadas, a autenticação ocorrerá com sucesso, caso não seja enviado, será retornando erro correspondente.

callback (PaymentCallback)

Nome Tipo Obrigatório Descrição
onSuccess Boolean Não Método retorna true caso a autenticação for bem sucedida, caso a senha informada for diferente da credenciada o retorno será false.
onError String Não Será retornado erro em alguns casos, alguns erros podem ter relação com os alguns desses pontos, senha não configurada durante credenciamento, terminal não credenciado, senha vazia/nula e falta de algum informação da aplicação terceira obrigatória, como por exemplo, os campos referente ApplicationInfo.credentials e ApplicationInfo.softwareVersion.
Exemplo do fluxo de autenticação da senha do supervisor
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import androidx.appcompat.app.AppCompatActivity;
import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.SupervisorPasswordRequest;
import br.com.phoebus.android.payments.api.exception.ClientException;

public void validatePassword() {
        SupervisorPasswordRequest supervisorPasswordRequest = new SupervisorPasswordRequest();
        ApplicationInfo applicationInfo = new ApplicationInfo();
        Credentials credentials = new Credentials();
        applicationInfo.setCredentials(credentials);
        supervisorPasswordRequest.setApplicationInfo(applicationInfo);

        if (this.setSupervisorPasswordEdt.getText() != null && !"".equals(this.setSupervisorPasswordEdt.getText().toString()) && MD5Check.isChecked() && !sendPasswordNullCheck.isChecked()) {
            supervisorPasswordRequest.setSupervisorPasswordCheck(generateMD5Hash(setSupervisorPasswordEdt.getText().toString()));
        }else if (sendPasswordNullCheck.isChecked()){
            supervisorPasswordRequest.setSupervisorPasswordCheck(null);
        } else {
            supervisorPasswordRequest.setSupervisorPasswordCheck(setSupervisorPasswordEdt.getText().toString());
        }

        if (this.setSoftwareVersionEdt.getText() != null && !"".equals(this.setSoftwareVersionEdt.getText().toString())) {
            applicationInfo.setSoftwareVersion(setSoftwareVersionEdt.getText().toString());
        }
        if (this.setApplicationIdEdt.getText() != null && !"".equals(this.setApplicationIdEdt.getText().toString())) {
            credentials.setApplicationId(setApplicationIdEdt.getText().toString());
        }
        if (this.setSecretTokenEdt.getText().length() <= 23 ) {
            Toast.makeText(this, getString(R.string.diag_token_label), Toast.LENGTH_SHORT).show();
        }
        else if (this.setSecretTokenEdt.getText() != null && !"".equals(this.setSecretTokenEdt.getText().toString())) {
            credentials.setSecretToken(setSecretTokenEdt.getText().toString());
        }


        try {
            this.paymentClient.supervisorPasswordCheck(supervisorPasswordRequest, new PaymentClient.PaymentCallback<>() {
                @Override
                public void onSuccess(Boolean aBoolean) {
                    Toast.makeText(getApplicationContext(), getString(R.string.diag_validation_SDK) + aBoolean.toString().toUpperCase(), Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(ErrorData errorData) {
                    Toast.makeText(getApplicationContext(), getString(R.string.diag_error_validation_SDK) + errorData.getPaymentsResponseCode() +
                            " = " + errorData.getResponseMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        } catch (ClientException e){
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), getString(R.string.serviceCallFailed) +": " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
Exemplo do fluxo de geração de hash da senha do supervisor
public static String generateMD5Hash(String input) {
        byte[] hashBytes = generateMD5HashBinary(input);

        StringBuilder hexString = new StringBuilder();
        for (byte b : hashBytes) {
            hexString.append(String.format("%02x", b));
        }

        return hexString.toString();
    }

    public static byte[] generateMD5HashBinary(String input) {
        try {
            MessageDigest md5Digest = MessageDigest.getInstance("MD5");
            return md5Digest.digest(input.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Erro ao gerar hash MD5", e);
        }
    }