Ir para o conteúdo

SupervisorPasswordCheck()

Este método realiza la autenticación de la contraseña del supervisor, tiene como objetivo permitir que aplicaciones de terceros puedan tener acceso a la contraseña del supervisor, registrada durante la acreditación del terminal. Esta funcionalidad debe permitir la autenticación del supervisor, siendo una forma de seguridad extra para las aplicaciones que utilizan la API de pagos. Importante, para una comunicación segura de contraseñas, este método sigue reglas de encriptación para la autenticación de contraseña. De esta manera, la autentificación solo se llevará a cabo si la tercera aplicación está siguiendo estas reglas.

Método

Firma Descripción
void supervisorPasswordCheck(SupervisorPasswordRequest supervisorPassword, PaymentCallback paymentCallback) Realiza el proceso de autenticación del supervisor

Parámetros

Nombre Tipo Obligatorio Descripción
supervisorPassword String Contraseña del supervisor registrado durante la acreditación de la terminal.
ApplicationInfo.credentials Credentials Credenciales de la aplicación que está solicitando la operación, según registro en PayStore. Básicamente se trata de la identificación de la aplicación y el token de acceso.
ApplicationInfo.softwareVersion String Versión de la aplicación que solicita la verificación de la contraseña del supervisor

Detalles de los parámetros.

El parámetro supervisorPassword debe estar en formato String. Detalles importantes, el envío de la contraseña del supervisor, debe ser la misma que se informó durante la acreditación de la terminal. Formato, se debe enviar una cadena que contenga el hash MD5 para ser validado. Si la contraseña es enviada en abierto, la contraseña no será autenticada, por más que sea correspondiente con la que fue registrada durante la acreditación. Si la contraseña no ha sido registrada durante la acreditación o el terminal no ha sido acreditado junto al portal de PayStore, la autenticación no se llevará a cabo con éxito, será devuelto error correspondiente.

Resultado: Devuelve true si la contraseña coincide con el formato y el valor correctos.

El parámetro ApplicationInfo.credentials debe ser enviado con las credenciales de la tercera aplicación, estas credenciales deben ser enviadas siempre. Si no se envían, se devuelve un error relacionado.

Resultado: Si las credenciales son informadas, la autentificación se realizará con éxito, si no es enviada, será devuelto error correspondiente.

El parámetro ApplicationInfo.softwareVersion debe ser enviado con las versiones de software de la tercera aplicación, estas credenciales deben ser enviadas siempre. Si no se envían, se devuelve el error relacionado

Resultado: En el caso de que las credenciales sean informadas, la autenticación se realizará con éxito, si no es enviada, será devuelto error correspondiente.

callback (PaymentCallback)

Nombre Tipo Requerido Descripción
onSuccess Boolean Método devuelve true si la autenticación es exitosa, si la contraseña informada es diferente de la credencial el retorno será false.
onError String Se devolverá error en algunos casos, algunos errores pueden tener relación con los algunos de estos puntos, contraseña no configurada durante la acreditación, terminal no credenciado, contraseña vacía/nula y falta de alguna información de la aplicación tercera obligatoria, como, por ejemplo, los campos referentes a ApplicationInfo.credentials y ApplicationInfo.softwareVersion.
Ejemplo del flujo de autenticación de la contraseña del 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();
        }
    }
Ejemplo del flujo de generación de hash de la contraseña del 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);
        }
    }