|
@@ -57,7 +57,13 @@ final readonly class OrderResponseData extends PagarmeResponseData
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return $this->filledValue($transaction->gatewayResponse['code'] ?? null);
|
|
|
|
|
|
|
+ $code = $this->filledValue($transaction->gatewayResponse['code'] ?? null);
|
|
|
|
|
+
|
|
|
|
|
+ if ($code === null || $this->isMisleadingFailureCode($code)) {
|
|
|
|
|
+ return $this->filledValue($transaction->status);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return $code;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function failureMessage(): ?string
|
|
public function failureMessage(): ?string
|
|
@@ -70,14 +76,14 @@ final readonly class OrderResponseData extends PagarmeResponseData
|
|
|
|
|
|
|
|
$acquirerMessage = $this->filledValue($transaction->acquirerMessage);
|
|
$acquirerMessage = $this->filledValue($transaction->acquirerMessage);
|
|
|
|
|
|
|
|
- if ($acquirerMessage) {
|
|
|
|
|
|
|
+ if ($acquirerMessage && ! $this->isMisleadingAcquirerMessage($acquirerMessage)) {
|
|
|
return $acquirerMessage;
|
|
return $acquirerMessage;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$gatewayErrors = $transaction->gatewayResponse['errors'] ?? [];
|
|
$gatewayErrors = $transaction->gatewayResponse['errors'] ?? [];
|
|
|
|
|
|
|
|
if (! is_array($gatewayErrors) || empty($gatewayErrors)) {
|
|
if (! is_array($gatewayErrors) || empty($gatewayErrors)) {
|
|
|
- return null;
|
|
|
|
|
|
|
+ return $this->failureMessageFromStatus($transaction->status);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$message = collect($gatewayErrors)
|
|
$message = collect($gatewayErrors)
|
|
@@ -241,6 +247,57 @@ final readonly class OrderResponseData extends PagarmeResponseData
|
|
|
|
|
|
|
|
//
|
|
//
|
|
|
|
|
|
|
|
|
|
+ private function isMisleadingFailureCode(string $code): bool
|
|
|
|
|
+ {
|
|
|
|
|
+ // filtra para nao incluir codigos http que nao sao de erro
|
|
|
|
|
+
|
|
|
|
|
+ if (preg_match('/^[1-5]\d{2}$/', $code)) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $lower = mb_strtolower($code);
|
|
|
|
|
+
|
|
|
|
|
+ $successCodes = ['00', '0', 'approved', 'success'];
|
|
|
|
|
+
|
|
|
|
|
+ return in_array($lower, $successCodes, true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private function isMisleadingAcquirerMessage(string $message): bool
|
|
|
|
|
+ {
|
|
|
|
|
+ $lower = mb_strtolower($message);
|
|
|
|
|
+
|
|
|
|
|
+ $successPatterns = [
|
|
|
|
|
+ 'aprovada',
|
|
|
|
|
+ 'aprovado',
|
|
|
|
|
+ 'autorizada',
|
|
|
|
|
+ 'autorizado',
|
|
|
|
|
+ 'authorized',
|
|
|
|
|
+ 'sucesso',
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ foreach ($successPatterns as $pattern) {
|
|
|
|
|
+ if (str_contains($lower, $pattern)) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //
|
|
|
|
|
+
|
|
|
|
|
+ private function failureMessageFromStatus(?string $status): ?string
|
|
|
|
|
+ {
|
|
|
|
|
+ return match (strtolower((string) $status)) {
|
|
|
|
|
+ 'not_authorized' => 'Transação não autorizada pela operadora do cartão.',
|
|
|
|
|
+ 'with_error' => 'Erro ao processar a transação.',
|
|
|
|
|
+ 'failed' => 'Transação falhou.',
|
|
|
|
|
+ 'underpaid' => 'Valor pago inferior ao esperado.',
|
|
|
|
|
+ 'chargedback' => 'Transação sofreu chargeback.',
|
|
|
|
|
+ default => null,
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private function filledValue(mixed $value): ?string
|
|
private function filledValue(mixed $value): ?string
|
|
|
{
|
|
{
|
|
|
if ($value === null || $value === '' || $value === []) {
|
|
if ($value === null || $value === '' || $value === []) {
|