@ScaRS_S

Как избавиться от множественной отправки сообщений от сервиса SMS.ru?

У меня есть сайт на котором вход в личный кабинет идёт через вписывание номера телефона. Т.е вписывается телефон, на него приходит 6-ти значный сгенерированный на сервере код. Потом он вписывается в поле и идёт сверка верный код или нет. Однако при обновлении страницы авторизация слетает и просит заново написать код. Я эту ошибку пофиксил подобной структурой (почему-то без ajax не работает впринципе).
if (getCookie('auth') === 'true') {
    $.ajax({
        type: 'POST',
        url: actionUrl,
        data: {'contactID': getCookie('contactID'), 'auth': getCookie('auth'), 'phone': getCookie('phone')},
        dataType: 'json',
        success: function (data) {
            lk_auth(data);
        }  
    })
};

Теперь при каждом обновлении страницы происходит полный процесс авторизации и, соответственно, приходит новая смс с кодом.
Вот фронт
$(document).on('submit', "#reg", function(e) {
    e.preventDefault();
    var form = $(this);

    var enteredPhone = $('#phone').val();
    sendFormToServer(form, function(data) {
        $('#error-message').text("");
        $('#reg').hide();
        $('#regButton').hide();
        $('#verificationForm').show();
        
        verificationCode = data.verification_code;
        
    });
});
function sendFormToServer(form, callback) {
    $.ajax({
        type: "POST",
        url: actionUrl,
        data: form.serialize(),
        dataType: 'json',
        success: function(data) {
            callback(data);
        },
        error: function(xhr, status, error) {
            handleServerError(xhr);
        }
    });
}
function lk_auth(data) {

    const obj = data;
    if (obj.sendt_to) {
        setCookie('auth', true);
        setCookie('contactID', obj.sendt_to, options = {});
        setCookie('phone', obj.phone, options = {});
        console.log('auth = ' + getCookie('auth') + ' contactID = ' + getCookie('contactID') + 'phone = ' + getCookie('phone'));

        const $menu = $('<div class="header__menu"></div>');


    $menu.append('<span style="display:none" id="documents"></span >');
        $menu.append('<span style="display:none" id="chat"></span >');
        $menu.append('<span style="display:none" id="payments"></span >');
  
        $('#reg').hide();
    $('#verificationForm').hide();
        $('#body').append($menu);
    $('#error-message').hide();
    }
    

    const $content = $('<div class="div0"></div>');
    $content.append('<div class="header__menu">Phone: ' + getCookie('phone') + '</div');
    $content.find('.header__menu').css('display', 'none');

    $('#content').empty();
    $('#content').append($content);
}


Вот кусок от бэка
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['phone'])) {
        $phone = trim(str_replace(array('-', ' '), '', $_POST['phone']));
        $contactData['msg'] = 'Телефон: ' . $phone;
        $resultContactID = CRest::call(
            'crm.duplicate.findbycomm',
            array(
                'entity_type' => "CONTACT",
                'type' => "PHONE",
                'values' => array($phone)
            )
        );

        if (empty($resultContactID['result']['CONTACT'])) {
            $contactData['msg'] .= ' No personal account is registered';
            http_response_code(403);
        } elseif (count($resultContactID['result']['CONTACT']) > 1) {
            $contactData['msg'] .= ' attention there is more than 1 contacts ' . count($resultContactID['result']['CONTACT']) . ' contacts!';
            http_response_code(500);
        } else {
            $contactData['ID'] = $resultContactID['result']['CONTACT'][0];
            $message = generateRandomCode();
            $api_token = '*****';
            $url = "https://sms.ru/sms/send?api_id=$api_token&to=$phone&msg=$message&json=1";
            $resultContactID = CRest::call(
                'crm.duplicate.findbycomm',
                array(
                    'entity_type' => "CONTACT",
                    'type' => "PHONE",
                    'values' => array($phone)
                )
            );

            $contactData['ID'] = $resultContactID['result']['CONTACT'][0];
            $response = file_get_contents($url);
            $result = json_decode($response);

            if ($result->status == "OK") {
                $_SESSION['verification_code'] = $message;
                $contactData['status'] = 'sent';
                $contactData['message'] = 'SMS sent successfully ';
                $contactData['sendt_to'] = $contactData['ID'];
                $contactData['verification_code'] = $message;
                $contactData['phone'] = $phone;
            } else {
                $contactData['status'] = 'error';
                $contactData['message'] = 'Error in sending SMS';
            }
        }

        echo json_encode($contactData, JSON_UNESCAPED_UNICODE);
        exit;
    }
}
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
sslion
@sslion
Процесс авторизации нужно хранить не в куках, а в сессии на бэке
654b93d6899fd778655153.png
Так же не понятно зачем заново искать контакт, и почему дублируется строка
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы