Show actual ABDM bridge messages in ABHA OTP flows

This commit is contained in:
DevSoftTech Server 2026-07-25 22:25:31 +05:30
parent 9a3f29660b
commit 83c9a9f015
3 changed files with 106 additions and 26 deletions

View File

@ -43,8 +43,8 @@ class Abha extends BaseController
return $this->response->setJSON([
'ok' => 0,
'error_text' => $result['error_text'] ?? $result['message']
?? $result['data']['message'] ?? 'Failed to send OTP',
'error_text' => $this->extractBridgeErrorText($result, 'Failed to send OTP'),
'request_id' => (string) ($result['request_id'] ?? ''),
]);
}
@ -76,8 +76,8 @@ class Abha extends BaseController
if (empty($result['ok']) || $result['ok'] != 1) {
return $this->response->setJSON([
'ok' => 0,
'error_text' => $result['error_text'] ?? $result['message']
?? $result['data']['message'] ?? 'OTP verification failed',
'error_text' => $this->extractBridgeErrorText($result, 'OTP verification failed'),
'request_id' => (string) ($result['request_id'] ?? ''),
]);
}
$payload = $result['data'] ?? $result;
@ -175,8 +175,8 @@ class Abha extends BaseController
return $this->response->setJSON([
'ok' => 0,
'error_text' => $result['error_text'] ?? $result['message']
?? $result['data']['message'] ?? 'Failed to send mobile OTP',
'error_text' => $this->extractBridgeErrorText($result, 'Failed to send mobile OTP'),
'request_id' => (string) ($result['request_id'] ?? ''),
]);
}
@ -206,8 +206,8 @@ class Abha extends BaseController
if (empty($result['ok']) || $result['ok'] != 1) {
return $this->response->setJSON([
'ok' => 0,
'error_text' => $result['error_text'] ?? $result['message']
?? $result['data']['message'] ?? 'Mobile OTP verification failed',
'error_text' => $this->extractBridgeErrorText($result, 'Mobile OTP verification failed'),
'request_id' => (string) ($result['request_id'] ?? ''),
]);
}
@ -583,6 +583,36 @@ class Abha extends BaseController
. '</svg>';
}
/**
* Normalize nested bridge error payloads into a single readable message.
*
* @param array<string, mixed> $result
*/
private function extractBridgeErrorText(array $result, string $fallback): string
{
$candidates = [
$result['error_text'] ?? null,
$result['message'] ?? null,
$result['error']['message'] ?? null,
$result['error']['description'] ?? null,
$result['error']['code'] ?? null,
$result['data']['message'] ?? null,
$result['data']['error']['message'] ?? null,
$result['data']['error']['description'] ?? null,
$result['data']['error']['code'] ?? null,
$result['description'] ?? null,
$result['data']['description'] ?? null,
];
foreach ($candidates as $candidate) {
if (is_string($candidate) && trim($candidate) !== '') {
return trim($candidate);
}
}
return $fallback;
}
// -------------------------------------------------------------------------
// Private helper — find or auto-create patient from ABHA profile data
// -------------------------------------------------------------------------

View File

@ -751,6 +751,31 @@
return $('input[name="<?= csrf_token() ?>"]').first().val() || '<?= csrf_hash() ?>';
};
function pickApiMessage(resp, fallbackText) {
var r = resp || {};
var candidates = [
r.error_text,
r.message,
r.description,
r.error && r.error.message,
r.error && r.error.description,
r.error && r.error.code,
r.data && r.data.message,
r.data && r.data.description,
r.data && r.data.error && r.data.error.message,
r.data && r.data.error && r.data.error.description,
r.data && r.data.error && r.data.error.code
];
for (var i = 0; i < candidates.length; i++) {
if (typeof candidates[i] === 'string' && candidates[i].trim() !== '') {
return candidates[i].trim();
}
}
return fallbackText;
}
$('form.form1').on('submit', function(form) {
$("#RegisterPatient").prop("disabled", true);
form.preventDefault();
@ -849,7 +874,7 @@
txnId = resp.txn_id || null;
abhaStep(2);
} else {
showAlert('abha_step1_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP. Please try again.');
showAlert('abha_step1_alert', 'danger', pickApiMessage(resp, 'Failed to send OTP. Please try again.'));
}
}, 'json').fail(function() {
$('#abha_get_otp_spinner').addClass('d-none');
@ -912,7 +937,7 @@
);
abhaStep(4);
} else {
showAlert('abha_step2_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Invalid OTP. Please try again.');
showAlert('abha_step2_alert', 'danger', pickApiMessage(resp, 'Invalid OTP. Please try again.'));
}
}, 'json').fail(function() {
$('#abha_verify_otp_spinner').addClass('d-none');
@ -953,7 +978,7 @@
$('#link_step_2').show();
linkAlert('link_step1_alert', 'success', 'OTP sent to mobile ending ' + mobile.slice(-4) + '.');
} else {
linkAlert('link_step1_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP.');
linkAlert('link_step1_alert', 'danger', pickApiMessage(resp, 'Failed to send OTP.'));
}
}, 'json').fail(function() {
$('#abha_link_send_spinner').addClass('d-none');
@ -1012,7 +1037,7 @@
'</div>'
);
} else {
linkAlert('link_step2_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'OTP verification failed.');
linkAlert('link_step2_alert', 'danger', pickApiMessage(resp, 'OTP verification failed.'));
}
}, 'json').fail(function() {
$('#abha_link_verify_spinner').addClass('d-none');
@ -1046,7 +1071,7 @@
+ '</div>';
$('#abha_bridge_test_result').html(html);
} else {
$('#abha_bridge_test_result').html('<div class="alert alert-danger py-2">' + ((resp && resp.error_text) ? resp.error_text : 'Bridge test failed') + '</div>');
$('#abha_bridge_test_result').html('<div class="alert alert-danger py-2">' + pickApiMessage(resp, 'Bridge test failed') + '</div>');
}
}, 'json').fail(function(xhr) {
$('#abha_bridge_test_spinner').addClass('d-none');
@ -1131,7 +1156,7 @@
$.getJSON('<?= base_url('abha/register/facility_qr') ?>', function(resp) {
if (!resp || resp.ok != 1 || !resp.qr_data) {
var msg = (resp && resp.error_text) ? resp.error_text : 'Unable to load Health Facility QR.';
var msg = pickApiMessage(resp, 'Unable to load Health Facility QR.');
$('#abhareg_facility_loading').html('');
$('#abhareg_facility_alert').html('<div class="alert alert-danger py-2">' + msg + '</div>');
return;
@ -1376,7 +1401,7 @@
$('#abhareg_abha_status').html('<span class="badge bg-success"><i class="bi bi-check-circle me-1"></i>VALID</span>');
$('#abhareg_goto_stepB').removeClass('d-none');
} else {
var msg = (resp && resp.error_text) ? resp.error_text : (resp && resp.status ? 'Status: ' + resp.status : 'ABHA not found or invalid.');
var msg = pickApiMessage(resp, (resp && resp.status ? 'Status: ' + resp.status : 'ABHA not found or invalid.'));
regAlert('abhareg_num_stepA_alert', 'danger', msg);
$('#abhareg_abha_status').html('<span class="badge bg-danger">INVALID</span>');
}
@ -1416,7 +1441,7 @@
regTxnId = resp.txn_id || null;
onSuccess(mobile);
} else {
regAlert(alertId, 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP.');
regAlert(alertId, 'danger', pickApiMessage(resp, 'Failed to send OTP.'));
}
}, 'json').fail(function() {
$('#' + spinId).addClass('d-none');
@ -1438,7 +1463,7 @@
if (resp && resp.ok == 1) {
showRegResult(resp);
} else {
regAlert(alertId, 'danger', (resp && resp.error_text) ? resp.error_text : 'OTP verification failed.');
regAlert(alertId, 'danger', pickApiMessage(resp, 'OTP verification failed.'));
}
}, 'json').fail(function() {
$('#' + spinId).addClass('d-none');

View File

@ -356,6 +356,30 @@ $_aadh = esc($data[0]->udai ?? '');
if (html !== undefined) b.innerHTML = html;
}
function safe(s) { return $('<div>').text(s).html(); }
function pickApiMessage(res, fallbackText) {
var r = res || {};
var candidates = [
r.error_text,
r.message,
r.description,
r.error && r.error.message,
r.error && r.error.description,
r.error && r.error.code,
r.data && r.data.message,
r.data && r.data.description,
r.data && r.data.error && r.data.error.message,
r.data && r.data.error && r.data.error.description,
r.data && r.data.error && r.data.error.code
];
for (var i = 0; i < candidates.length; i++) {
if (typeof candidates[i] === 'string' && candidates[i].trim() !== '') {
return candidates[i].trim();
}
}
return fallbackText;
}
/* ── step indicator ──────────────────────────────────────────── */
function setStep(n) {
@ -464,7 +488,7 @@ $_aadh = esc($data[0]->udai ?? '');
setTimeout(function () { document.getElementById('cvp_otp_input').focus(); }, 80);
} else {
showMsg('cvp_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Failed to send OTP.'));
safe(pickApiMessage(res, 'Failed to send OTP.')));
}
});
});
@ -487,7 +511,8 @@ $_aadh = esc($data[0]->udai ?? '');
showMsg('cvp_step2_msg', 'success', '<i class="bi bi-check-circle me-1"></i>New OTP sent.');
$('#cvp_otp_input').val('').trigger('focus');
} else {
showMsg('cvp_step2_msg', 'danger', 'Resend failed: ' + safe(res.message || res.error || ''));
showMsg('cvp_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(pickApiMessage(res, 'Resend failed.')));
}
});
});
@ -506,7 +531,7 @@ $_aadh = esc($data[0]->udai ?? '');
setBtn('cvp_btn_verify_otp', false, '<i class="bi bi-check-circle me-1"></i>Verify OTP');
if (res.ok != 1) {
showMsg('cvp_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Verification failed.'));
safe(pickApiMessage(res, 'Verification failed.')));
return;
}
var abhaData = extractAbha(res);
@ -544,7 +569,7 @@ $_aadh = esc($data[0]->udai ?? '');
setTimeout(function () { document.getElementById('cvp_mob_otp_input').focus(); }, 80);
} else {
showMsg('cvp_step3_send_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Failed to send OTP.'));
safe(pickApiMessage(res, 'Failed to send OTP.')));
}
});
});
@ -567,7 +592,7 @@ $_aadh = esc($data[0]->udai ?? '');
setBtn('cvp_btn_mob_verify_otp', false, '<i class="bi bi-check-circle me-1"></i>Verify Mobile OTP');
if (res.ok != 1) {
showMsg('cvp_step3_otp_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Verification failed.'));
safe(pickApiMessage(res, 'Verification failed.')));
return;
}
var abhaData = extractAbha(res);
@ -626,7 +651,7 @@ $_aadh = esc($data[0]->udai ?? '');
setTimeout(function () { document.getElementById('cvpv_a_otp').focus(); }, 80);
} else {
showMsg('cvpv_a_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Failed to send OTP.'));
safe(pickApiMessage(res, 'Failed to send OTP.')));
}
});
});
@ -649,7 +674,7 @@ $_aadh = esc($data[0]->udai ?? '');
setBtn('cvpv_btn_a_verify', false, '<i class="bi bi-check-circle me-1"></i>Verify &amp; Link ABHA');
if (res.ok != 1) {
showMsg('cvpv_a_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Verification failed.'));
safe(pickApiMessage(res, 'Verification failed.')));
return;
}
var abhaData = extractAbha(res);
@ -687,7 +712,7 @@ $_aadh = esc($data[0]->udai ?? '');
setTimeout(function () { document.getElementById('cvpv_m_otp').focus(); }, 80);
} else {
showMsg('cvpv_m_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Failed to send OTP.'));
safe(pickApiMessage(res, 'Failed to send OTP.')));
}
});
});
@ -707,7 +732,7 @@ $_aadh = esc($data[0]->udai ?? '');
setBtn('cvpv_btn_m_verify', false, '<i class="bi bi-check-circle me-1"></i>Verify &amp; Link ABHA');
if (res.ok != 1) {
showMsg('cvpv_m_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
safe(res.error_text || res.message || res.error || 'Verification failed.'));
safe(pickApiMessage(res, 'Verification failed.')));
return;
}
var abhaData = extractAbha(res);