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([
|
||||
'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
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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 & 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 & 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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user