fix(abdm): prevent modal redirect to profile step on wrong OTP verification
This commit is contained in:
parent
7c573403b2
commit
35e1018c6b
|
|
@ -94,9 +94,15 @@ class Abha extends BaseController
|
|||
return $this->response->setStatusCode(500)->setJSON(['ok' => 0, 'error_text' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$result['ok'] = 0;
|
||||
}
|
||||
|
||||
if (empty($result['ok']) || $result['ok'] != 1) {
|
||||
$requestId = trim((string) ($result['request_id'] ?? ''));
|
||||
$errorText = $this->extractBridgeErrorText($result, 'OTP verification failed');
|
||||
$errorText = $this->extractBridgeErrorText($result, 'Please enter a valid OTP. Entered OTP is either expired or incorrect.');
|
||||
if ($requestId !== '') {
|
||||
$errorText .= ' (Bridge Request ID: ' . $requestId . ')';
|
||||
}
|
||||
|
|
@ -1637,24 +1643,6 @@ class Abha extends BaseController
|
|||
*/
|
||||
private function extractBridgeErrorText(array $result, string $fallback): string
|
||||
{
|
||||
$fieldErrors = [];
|
||||
if (is_array($result['data'] ?? null)) {
|
||||
foreach ($result['data'] as $field => $message) {
|
||||
if ($field === 'timestamp' || ! is_string($message) || trim($message) === '') {
|
||||
continue;
|
||||
}
|
||||
$fieldMsg = trim($message);
|
||||
if (strcasecmp($field, 'loginId') === 0 && stripos($fieldMsg, 'invalid') !== false) {
|
||||
$fieldErrors[] = 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.';
|
||||
} else {
|
||||
$fieldErrors[] = $field . ': ' . $fieldMsg;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($fieldErrors !== []) {
|
||||
return implode('; ', $fieldErrors);
|
||||
}
|
||||
|
||||
$candidates = [
|
||||
$result['error_text'] ?? null,
|
||||
$result['message'] ?? null,
|
||||
|
|
@ -1685,6 +1673,33 @@ class Abha extends BaseController
|
|||
}
|
||||
}
|
||||
|
||||
$ignoreFields = [
|
||||
'timestamp', 'txnid', 'txn_id', 'authresult', 'auth_result',
|
||||
'authmethod', 'auth_method', 'status', 'token', 'tokens',
|
||||
'refreshtoken', 'refresh_token', 'expiresin', 'expires_in',
|
||||
'refreshexpiresin', 'refresh_expires_in', 'request_id', 'requestid',
|
||||
'scope', 'accounts', 'message', 'error', 'error_text', 'code',
|
||||
];
|
||||
|
||||
$fieldErrors = [];
|
||||
if (is_array($result['data'] ?? null)) {
|
||||
foreach ($result['data'] as $field => $message) {
|
||||
$lowerField = strtolower(trim((string) $field));
|
||||
if (in_array($lowerField, $ignoreFields, true) || ! is_string($message) || trim($message) === '') {
|
||||
continue;
|
||||
}
|
||||
$fieldMsg = trim($message);
|
||||
if (strcasecmp($field, 'loginId') === 0 && stripos($fieldMsg, 'invalid') !== false) {
|
||||
$fieldErrors[] = 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.';
|
||||
} else {
|
||||
$fieldErrors[] = $field . ': ' . $fieldMsg;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($fieldErrors !== []) {
|
||||
return implode('; ', $fieldErrors);
|
||||
}
|
||||
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
|
|
@ -2897,14 +2912,20 @@ class Abha extends BaseController
|
|||
return $this->response->setStatusCode(502)->setJSON(['ok' => 0, 'error_text' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$result['ok'] = 0;
|
||||
}
|
||||
|
||||
if (empty($result['ok']) || (int) $result['ok'] !== 1) {
|
||||
$httpCode = (int) ($result['http_code'] ?? 0);
|
||||
if ($httpCode < 400 || $httpCode > 599) {
|
||||
$httpCode = 502;
|
||||
$httpCode = 422;
|
||||
}
|
||||
return $this->response->setStatusCode($httpCode)->setJSON([
|
||||
'ok' => 0,
|
||||
'error_text' => $this->extractBridgeErrorText($result, 'OTP verification failed.'),
|
||||
'error_text' => $this->extractBridgeErrorText($result, 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'),
|
||||
'request_id' => (string) ($result['request_id'] ?? ''),
|
||||
]);
|
||||
}
|
||||
|
|
@ -2928,6 +2949,15 @@ class Abha extends BaseController
|
|||
};
|
||||
$abhaNumber = preg_replace('/\D/', '', $firstNonEmpty([$profile['ABHANumber'] ?? null, $profile['abhaNumber'] ?? null, $profile['abha_number'] ?? null, $profile['abha_id'] ?? null, $payload['ABHANumber'] ?? null, $payload['abhaNumber'] ?? null, $payload['abha_id'] ?? null]));
|
||||
$abhaAddress = $firstNonEmpty([$profile['preferredAddress'] ?? null, $profile['preferredAbhaAddress'] ?? null, $profile['abhaAddress'] ?? null, $profile['abha_address'] ?? null, $payload['preferredAddress'] ?? null, $payload['abhaAddress'] ?? null, $payload['abha_address'] ?? null]);
|
||||
$userToken = trim((string) ($payload['token'] ?? $payload['tokens']['token'] ?? $payload['auth_token'] ?? $payload['user_token'] ?? ''));
|
||||
|
||||
if ($abhaNumber === '' && $abhaAddress === '' && $userToken === '') {
|
||||
return $this->response->setStatusCode(422)->setJSON([
|
||||
'ok' => 0,
|
||||
'error_text' => $this->extractBridgeErrorText($result, 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'),
|
||||
'request_id' => (string) ($result['request_id'] ?? ''),
|
||||
]);
|
||||
}
|
||||
$name = $this->extractAbhaProfileName($profile, $payload);
|
||||
$mobile = $firstNonEmpty([$profile['mobile'] ?? null, $profile['mobileNumber'] ?? null, $profile['mobile_number'] ?? null, $payload['mobile'] ?? null, $payload['mobileNumber'] ?? null, $payload['mobile_number'] ?? null]);
|
||||
$gender = $firstNonEmpty([$profile['gender'] ?? null, $payload['gender'] ?? null]);
|
||||
|
|
|
|||
|
|
@ -449,8 +449,31 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
|||
return ['ok' => 0, 'error_text' => 'Non-JSON response', 'http_code' => $httpCode, 'raw' => (string) $raw, 'auth_debug' => $authDebug];
|
||||
}
|
||||
|
||||
$ok = ($httpCode >= 200 && $httpCode < 300) ? (int) ($decoded['ok'] ?? 1) : 0;
|
||||
$logErr = $ok === 0 ? (string) ($decoded['message'] ?? $decoded['error_text'] ?? '') : '';
|
||||
$authResult = strtolower(trim((string) ($decoded['authResult'] ?? $decoded['auth_result'] ?? $decoded['data']['authResult'] ?? $decoded['data']['auth_result'] ?? '')));
|
||||
$statusVal = strtolower(trim((string) ($decoded['status'] ?? $decoded['data']['status'] ?? '')));
|
||||
$hasFailedAuth = ($authResult === 'failed' || in_array($statusVal, ['failed', 'failure', 'error', 'rejected'], true));
|
||||
if (isset($decoded['success']) && ($decoded['success'] === false || $decoded['success'] === 0 || $decoded['success'] === 'false')) {
|
||||
$hasFailedAuth = true;
|
||||
}
|
||||
if (isset($decoded['data']['success']) && ($decoded['data']['success'] === false || $decoded['data']['success'] === 0 || $decoded['data']['success'] === 'false')) {
|
||||
$hasFailedAuth = true;
|
||||
}
|
||||
|
||||
if ($hasFailedAuth) {
|
||||
$ok = 0;
|
||||
} elseif ($httpCode >= 200 && $httpCode < 300) {
|
||||
$ok = (int) ($decoded['ok'] ?? 1);
|
||||
} else {
|
||||
$ok = 0;
|
||||
}
|
||||
|
||||
if ($ok === 0 && empty($decoded['error_text'])) {
|
||||
$errMsg = trim((string) ($decoded['message'] ?? $decoded['data']['message'] ?? $decoded['error']['message'] ?? (is_string($decoded['error'] ?? null) ? $decoded['error'] : '')));
|
||||
if ($errMsg !== '') {
|
||||
$decoded['error_text'] = $errMsg;
|
||||
}
|
||||
}
|
||||
$logErr = $ok === 0 ? (string) ($decoded['error_text'] ?? $decoded['message'] ?? '') : '';
|
||||
if ($ok === 0) {
|
||||
$logErr .= ($logErr !== '' ? ' | ' : '') . 'auth=' . json_encode($authDebug);
|
||||
}
|
||||
|
|
@ -712,6 +735,16 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
|||
}
|
||||
|
||||
$result = $this->post('/v3/abha/login/verify-otp', $body);
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$err = trim((string) ($result['message'] ?? $result['data']['message'] ?? $result['error_text'] ?? 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
return array_merge($result, [
|
||||
'ok' => 0,
|
||||
'error_text' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
'message' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
]);
|
||||
}
|
||||
if (empty($result['ok']) || (int) $result['ok'] !== 1) {
|
||||
return $result;
|
||||
}
|
||||
|
|
@ -941,6 +974,16 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
|||
}
|
||||
|
||||
$result = $this->post('/v3/abha/aadhaar/verify-otp', $body);
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$err = trim((string) ($result['message'] ?? $result['data']['message'] ?? $result['error_text'] ?? 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
return array_merge($result, [
|
||||
'ok' => 0,
|
||||
'error_text' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
'message' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
]);
|
||||
}
|
||||
if (empty($result['ok']) || (int) $result['ok'] !== 1) {
|
||||
return $result;
|
||||
}
|
||||
|
|
@ -978,6 +1021,16 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
|||
}
|
||||
|
||||
$result = $this->post('/v3/abha/mobile/verify-otp', $body);
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$err = trim((string) ($result['message'] ?? $result['data']['message'] ?? $result['error_text'] ?? 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
return array_merge($result, [
|
||||
'ok' => 0,
|
||||
'error_text' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
'message' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
]);
|
||||
}
|
||||
if (empty($result['ok']) || (int) $result['ok'] !== 1) {
|
||||
return $result;
|
||||
}
|
||||
|
|
@ -1009,6 +1062,16 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
|||
}
|
||||
|
||||
$result = $this->post('/v3/abha/enrol/mobile/verify-otp', $body);
|
||||
$authResult = strtolower(trim((string) ($result['authResult'] ?? $result['data']['authResult'] ?? $result['auth_result'] ?? $result['data']['auth_result'] ?? '')));
|
||||
$status = strtolower(trim((string) ($result['status'] ?? $result['data']['status'] ?? '')));
|
||||
if ($authResult === 'failed' || in_array($status, ['failed', 'failure', 'error'], true)) {
|
||||
$err = trim((string) ($result['message'] ?? $result['data']['message'] ?? $result['error_text'] ?? 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
return array_merge($result, [
|
||||
'ok' => 0,
|
||||
'error_text' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
'message' => $err !== '' ? $err : 'Please enter a valid OTP. Entered OTP is either expired or incorrect.',
|
||||
]);
|
||||
}
|
||||
if (empty($result['ok']) || (int) $result['ok'] !== 1) {
|
||||
return $result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -262,12 +262,17 @@ window.AbhaVerifyModal = (function () {
|
|||
var button = $('#abhaVerifyOtpBtn').prop('disabled', true).html('<span class="spinner-border spinner-border-sm me-1"></span>Verifying');
|
||||
$.post('<?= base_url('abha/register/login/verify-otp') ?>', { txn_id:lookupResponse.txn_id, auth_method:lookupResponse.auth_method, otp:otp, '<?= csrf_token() ?>':csrf() }, function (response) {
|
||||
button.prop('disabled', false).html('<i class="bi bi-patch-check me-1"></i>Verify OTP');
|
||||
if (!response || response.ok != 1) { alertBox('danger', apiMessage(response, 'OTP verification failed.')); return; }
|
||||
if (!response || response.ok != 1) {
|
||||
alertBox('danger', apiMessage(response, 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
$('#abhaVerifyOtp').val('').trigger('focus');
|
||||
return;
|
||||
}
|
||||
stopTimer();
|
||||
renderProfile(response);
|
||||
}, 'json').fail(function (xhr) {
|
||||
button.prop('disabled', false).html('<i class="bi bi-patch-check me-1"></i>Verify OTP');
|
||||
alertBox('danger', apiMessage(xhr.responseJSON, 'OTP verification failed.'));
|
||||
alertBox('danger', apiMessage(xhr.responseJSON, 'Please enter a valid OTP. Entered OTP is either expired or incorrect.'));
|
||||
$('#abhaVerifyOtp').val('').trigger('focus');
|
||||
});
|
||||
}
|
||||
$(function () {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user