subjectReader = $subjectReader; } /** * @inheritdoc */ public function validate(array $validationSubject): ResultInterface { $response = $this->subjectReader->readResponse($validationSubject); $transactionResponse = $response['transactionResponse']; if ($this->isResponseCodeAnError($transactionResponse)) { $errorCodes = []; $errorMessages = []; if (isset($transactionResponse['messages']['message']['code'])) { $errorCodes[] = $transactionResponse['messages']['message']['code']; $errorMessages[] = $transactionResponse['messages']['message']['text']; } elseif ($transactionResponse['messages']['message']) { foreach ($transactionResponse['messages']['message'] as $message) { $errorCodes[] = $message['code']; $errorMessages[] = $message['description']; } } elseif (isset($transactionResponse['errors'])) { foreach ($transactionResponse['errors'] as $message) { $errorCodes[] = $message['errorCode']; $errorMessages[] = $message['errorCode']; } } return $this->createResult(false, $errorMessages, $errorCodes); } return $this->createResult(true); } /** * Determines if the response code is actually an error * * @param array $transactionResponse * @return bool */ private function isResponseCodeAnError(array $transactionResponse): bool { $code = $transactionResponse['messages']['message']['code'] ?? $transactionResponse['messages']['message'][0]['code'] ?? $transactionResponse['errors'][0]['errorCode'] ?? null; return in_array($transactionResponse['responseCode'], [self::RESPONSE_CODE_APPROVED, self::RESPONSE_CODE_HELD]) && $code && !in_array( $code, [ self::RESPONSE_REASON_CODE_APPROVED, self::RESPONSE_REASON_CODE_PENDING_REVIEW, self::RESPONSE_REASON_CODE_PENDING_REVIEW_AUTHORIZED ] ); } }