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);
}
}