AJAX запрос выглядит так.
PHP выглядит так
Если ошибка, status и message прекрасно возвращаются.
А вот если все ок, тоже должен отправится статус в json_encode, но ajax не получает его, а в обработчике .fail указано, что ошибка parsererror
Не понимаю, как отловить баг. В инструментах браузера в ответе - "Для этого запроса нет данных ответа".
| Код |
|---|
$(document).on('click', '#auth-send-sms, a.js-auth-resend', function (e) {
e.preventDefault();
$.ajax({
method: "POST",
dataType: 'json',
url: '/ajax/sms_auth.php',
data: {action: 'send_sms', phone: $('form[name="form_sms_auth"] input[name="phone"]').val()}
}).done(function (result) {
if (result.status == 'error') {
console.log('error');
$('.qv-auth-error').text(result.message);
} else if(result.status == 'success') {
console.log('succ');
$('#auth-row-with-phone').addClass('hide');
$('#auth-row-with-sms').removeClass('hide');
$('#auth-send-sms').addClass('hide');
$('#auth-enter').removeClass('hide');
startTimerAuth(59);
}
})
.fail(function(jqXHR, textStatus) {
console.log( jqXHR );
});
});
|
| Код |
|---|
<?php
define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define('PUBLIC_AJAX_MODE', true);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
$_SESSION["SESS_SHOW_INCLUDE_TIME_EXEC"] = "N";
$APPLICATION->ShowIncludeStat = false;
$request = \Bitrix\Main\Context::getCurrent()->getRequest();
$salt = '0000000';
try {
if (!$request->isAjaxRequest()) {
throw new ErrorException("is not ajax");
}
try {
$action = $request->get('action');
if (empty($action)) {
throw new \ErrorException('action is not define');
}
$phone = htmlspecialchars($request->get("phone"));
$phone = preparePhone($phone);
if($error = validatePhone($phone)){
throw new \ErrorException($error);
}
$res_user = \Bitrix\Main\UserTable::query()
->addFilter('PERSONAL_PHONE', $phone)
->addFilter('PHONE_AUTH.PHONE_NUMBER', '+'.$phone)
->addSelect('ID')
->addFilter('ACTIVE', 'Y')
->setLimit(1)
->exec();
$user_id = null;
if ($user_fields = $res_user->fetch()) {
$user_id = $user_fields['ID'];
}
if (empty($user_id)) {
throw new \ErrorException('Пользователь с таким телефоном не найден');
}
switch ($action) {
case 'send_sms':
if (\Bitrix\Main\Loader::includeModule('messageservice')) {
$code = generateText(4);
$sender = \Bitrix\MessageService\Sender\SmsManager::getDefaultSender();
$message = \Bitrix\MessageService\Sender\SmsManager::createMessage(
array(
'MESSAGE_TO' => $phone,
'MESSAGE_BODY' => 'Ваш код: '.$code,
'MESSAGE_FROM' => $sender->getDefaultFrom()
), $sender);
if($sendResult = $message->sendDirectly()){
Bitrix\Main\Diag\Debug::writeToFile(json_encode(['status' => 'success']),"","debug.txt");
Bitrix\Main\Diag\Debug::writeToFile(json_last_error(),"","debug.txt");
setSmsCookie($salt . $user_id . $code);
$APPLICATION->RestartBuffer();
echo json_encode(['status' => 'success']);
die();
}
}
break;
case 'check_sms':
$code = $request->get("sms_code");
$user_remember = $request->get('user_remember');
if(!checkSmsCode($salt . $user_id . $code)) {
throw new \ErrorException('Код SMS не правильный');
}
$USER->Authorize($user_id, ($user_remember == 'Y' ? true : false));
echo json_encode(['status' => 'success']);
die();
break;
default:
throw new \ErrorException('action is not define');
}
} catch (ErrorException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
} catch (ErrorException $e) {
CHTTP::SetStatus("403 Forbidden");
echo $e->getMessage();
}
//require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");
?>
|
Если ошибка, status и message прекрасно возвращаются.
А вот если все ок, тоже должен отправится статус в json_encode, но ajax не получает его, а в обработчике .fail указано, что ошибка parsererror
Не понимаю, как отловить баг. В инструментах браузера в ответе - "Для этого запроса нет данных ответа".
