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
Не понимаю, как отловить баг. В инструментах браузера в ответе - "Для этого запроса нет данных ответа".