Show actual ABDM bridge messages in ABHA OTP flows
This commit is contained in:
parent
9a3f29660b
commit
83c9a9f015
|
|
@ -43,8 +43,8 @@ class Abha extends BaseController
|
||||||
|
|
||||||
return $this->response->setJSON([
|
return $this->response->setJSON([
|
||||||
'ok' => 0,
|
'ok' => 0,
|
||||||
'error_text' => $result['error_text'] ?? $result['message']
|
'error_text' => $this->extractBridgeErrorText($result, 'Failed to send OTP'),
|
||||||
?? $result['data']['message'] ?? '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) {
|
if (empty($result['ok']) || $result['ok'] != 1) {
|
||||||
return $this->response->setJSON([
|
return $this->response->setJSON([
|
||||||
'ok' => 0,
|
'ok' => 0,
|
||||||
'error_text' => $result['error_text'] ?? $result['message']
|
'error_text' => $this->extractBridgeErrorText($result, 'OTP verification failed'),
|
||||||
?? $result['data']['message'] ?? 'OTP verification failed',
|
'request_id' => (string) ($result['request_id'] ?? ''),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$payload = $result['data'] ?? $result;
|
$payload = $result['data'] ?? $result;
|
||||||
|
|
@ -175,8 +175,8 @@ class Abha extends BaseController
|
||||||
|
|
||||||
return $this->response->setJSON([
|
return $this->response->setJSON([
|
||||||
'ok' => 0,
|
'ok' => 0,
|
||||||
'error_text' => $result['error_text'] ?? $result['message']
|
'error_text' => $this->extractBridgeErrorText($result, 'Failed to send mobile OTP'),
|
||||||
?? $result['data']['message'] ?? '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) {
|
if (empty($result['ok']) || $result['ok'] != 1) {
|
||||||
return $this->response->setJSON([
|
return $this->response->setJSON([
|
||||||
'ok' => 0,
|
'ok' => 0,
|
||||||
'error_text' => $result['error_text'] ?? $result['message']
|
'error_text' => $this->extractBridgeErrorText($result, 'Mobile OTP verification failed'),
|
||||||
?? $result['data']['message'] ?? 'Mobile OTP verification failed',
|
'request_id' => (string) ($result['request_id'] ?? ''),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -583,6 +583,36 @@ class Abha extends BaseController
|
||||||
. '</svg>';
|
. '</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
|
// Private helper — find or auto-create patient from ABHA profile data
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -751,6 +751,31 @@
|
||||||
return $('input[name="<?= csrf_token() ?>"]').first().val() || '<?= csrf_hash() ?>';
|
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) {
|
$('form.form1').on('submit', function(form) {
|
||||||
$("#RegisterPatient").prop("disabled", true);
|
$("#RegisterPatient").prop("disabled", true);
|
||||||
form.preventDefault();
|
form.preventDefault();
|
||||||
|
|
@ -849,7 +874,7 @@
|
||||||
txnId = resp.txn_id || null;
|
txnId = resp.txn_id || null;
|
||||||
abhaStep(2);
|
abhaStep(2);
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#abha_get_otp_spinner').addClass('d-none');
|
$('#abha_get_otp_spinner').addClass('d-none');
|
||||||
|
|
@ -912,7 +937,7 @@
|
||||||
);
|
);
|
||||||
abhaStep(4);
|
abhaStep(4);
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#abha_verify_otp_spinner').addClass('d-none');
|
$('#abha_verify_otp_spinner').addClass('d-none');
|
||||||
|
|
@ -953,7 +978,7 @@
|
||||||
$('#link_step_2').show();
|
$('#link_step_2').show();
|
||||||
linkAlert('link_step1_alert', 'success', 'OTP sent to mobile ending ' + mobile.slice(-4) + '.');
|
linkAlert('link_step1_alert', 'success', 'OTP sent to mobile ending ' + mobile.slice(-4) + '.');
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#abha_link_send_spinner').addClass('d-none');
|
$('#abha_link_send_spinner').addClass('d-none');
|
||||||
|
|
@ -1012,7 +1037,7 @@
|
||||||
'</div>'
|
'</div>'
|
||||||
);
|
);
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#abha_link_verify_spinner').addClass('d-none');
|
$('#abha_link_verify_spinner').addClass('d-none');
|
||||||
|
|
@ -1046,7 +1071,7 @@
|
||||||
+ '</div>';
|
+ '</div>';
|
||||||
$('#abha_bridge_test_result').html(html);
|
$('#abha_bridge_test_result').html(html);
|
||||||
} else {
|
} 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) {
|
}, 'json').fail(function(xhr) {
|
||||||
$('#abha_bridge_test_spinner').addClass('d-none');
|
$('#abha_bridge_test_spinner').addClass('d-none');
|
||||||
|
|
@ -1131,7 +1156,7 @@
|
||||||
|
|
||||||
$.getJSON('<?= base_url('abha/register/facility_qr') ?>', function(resp) {
|
$.getJSON('<?= base_url('abha/register/facility_qr') ?>', function(resp) {
|
||||||
if (!resp || resp.ok != 1 || !resp.qr_data) {
|
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_loading').html('');
|
||||||
$('#abhareg_facility_alert').html('<div class="alert alert-danger py-2">' + msg + '</div>');
|
$('#abhareg_facility_alert').html('<div class="alert alert-danger py-2">' + msg + '</div>');
|
||||||
return;
|
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_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');
|
$('#abhareg_goto_stepB').removeClass('d-none');
|
||||||
} else {
|
} 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);
|
regAlert('abhareg_num_stepA_alert', 'danger', msg);
|
||||||
$('#abhareg_abha_status').html('<span class="badge bg-danger">INVALID</span>');
|
$('#abhareg_abha_status').html('<span class="badge bg-danger">INVALID</span>');
|
||||||
}
|
}
|
||||||
|
|
@ -1416,7 +1441,7 @@
|
||||||
regTxnId = resp.txn_id || null;
|
regTxnId = resp.txn_id || null;
|
||||||
onSuccess(mobile);
|
onSuccess(mobile);
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#' + spinId).addClass('d-none');
|
$('#' + spinId).addClass('d-none');
|
||||||
|
|
@ -1438,7 +1463,7 @@
|
||||||
if (resp && resp.ok == 1) {
|
if (resp && resp.ok == 1) {
|
||||||
showRegResult(resp);
|
showRegResult(resp);
|
||||||
} else {
|
} 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() {
|
}, 'json').fail(function() {
|
||||||
$('#' + spinId).addClass('d-none');
|
$('#' + spinId).addClass('d-none');
|
||||||
|
|
|
||||||
|
|
@ -356,6 +356,30 @@ $_aadh = esc($data[0]->udai ?? '');
|
||||||
if (html !== undefined) b.innerHTML = html;
|
if (html !== undefined) b.innerHTML = html;
|
||||||
}
|
}
|
||||||
function safe(s) { return $('<div>').text(s).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 ──────────────────────────────────────────── */
|
/* ── step indicator ──────────────────────────────────────────── */
|
||||||
function setStep(n) {
|
function setStep(n) {
|
||||||
|
|
@ -464,7 +488,7 @@ $_aadh = esc($data[0]->udai ?? '');
|
||||||
setTimeout(function () { document.getElementById('cvp_otp_input').focus(); }, 80);
|
setTimeout(function () { document.getElementById('cvp_otp_input').focus(); }, 80);
|
||||||
} else {
|
} else {
|
||||||
showMsg('cvp_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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.');
|
showMsg('cvp_step2_msg', 'success', '<i class="bi bi-check-circle me-1"></i>New OTP sent.');
|
||||||
$('#cvp_otp_input').val('').trigger('focus');
|
$('#cvp_otp_input').val('').trigger('focus');
|
||||||
} else {
|
} 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');
|
setBtn('cvp_btn_verify_otp', false, '<i class="bi bi-check-circle me-1"></i>Verify OTP');
|
||||||
if (res.ok != 1) {
|
if (res.ok != 1) {
|
||||||
showMsg('cvp_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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;
|
return;
|
||||||
}
|
}
|
||||||
var abhaData = extractAbha(res);
|
var abhaData = extractAbha(res);
|
||||||
|
|
@ -544,7 +569,7 @@ $_aadh = esc($data[0]->udai ?? '');
|
||||||
setTimeout(function () { document.getElementById('cvp_mob_otp_input').focus(); }, 80);
|
setTimeout(function () { document.getElementById('cvp_mob_otp_input').focus(); }, 80);
|
||||||
} else {
|
} else {
|
||||||
showMsg('cvp_step3_send_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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');
|
setBtn('cvp_btn_mob_verify_otp', false, '<i class="bi bi-check-circle me-1"></i>Verify Mobile OTP');
|
||||||
if (res.ok != 1) {
|
if (res.ok != 1) {
|
||||||
showMsg('cvp_step3_otp_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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;
|
return;
|
||||||
}
|
}
|
||||||
var abhaData = extractAbha(res);
|
var abhaData = extractAbha(res);
|
||||||
|
|
@ -626,7 +651,7 @@ $_aadh = esc($data[0]->udai ?? '');
|
||||||
setTimeout(function () { document.getElementById('cvpv_a_otp').focus(); }, 80);
|
setTimeout(function () { document.getElementById('cvpv_a_otp').focus(); }, 80);
|
||||||
} else {
|
} else {
|
||||||
showMsg('cvpv_a_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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 & Link ABHA');
|
setBtn('cvpv_btn_a_verify', false, '<i class="bi bi-check-circle me-1"></i>Verify & Link ABHA');
|
||||||
if (res.ok != 1) {
|
if (res.ok != 1) {
|
||||||
showMsg('cvpv_a_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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;
|
return;
|
||||||
}
|
}
|
||||||
var abhaData = extractAbha(res);
|
var abhaData = extractAbha(res);
|
||||||
|
|
@ -687,7 +712,7 @@ $_aadh = esc($data[0]->udai ?? '');
|
||||||
setTimeout(function () { document.getElementById('cvpv_m_otp').focus(); }, 80);
|
setTimeout(function () { document.getElementById('cvpv_m_otp').focus(); }, 80);
|
||||||
} else {
|
} else {
|
||||||
showMsg('cvpv_m_step1_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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 & Link ABHA');
|
setBtn('cvpv_btn_m_verify', false, '<i class="bi bi-check-circle me-1"></i>Verify & Link ABHA');
|
||||||
if (res.ok != 1) {
|
if (res.ok != 1) {
|
||||||
showMsg('cvpv_m_step2_msg', 'danger', '<i class="bi bi-x-circle me-1"></i>' +
|
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;
|
return;
|
||||||
}
|
}
|
||||||
var abhaData = extractAbha(res);
|
var abhaData = extractAbha(res);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user