Почему скрипт не видит проверочный код внутри сессии?

Основная проблема заключается в том, что при проверке правильности введённого кода не видно изначальный код, который был отправлен по смс. И из-за этого выпадает ошибка, что код не верен.

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'] .= ' Личный кабинет не зарегистрирован по этому номеру телефона.';
                http_response_code(403);
            } elseif (count($resultContactID['result']['CONTACT']) > 1) {
                $contactData['msg'] .= ' Внимание. С этим номером телефона зарегистрировано ' . count($resultContactID['result']['CONTACT']) . ' контактов!';
                http_response_code(500);
            } else {
    
                    $contactData['ID'] = $resultContactID['result']['CONTACT'][0];
                    $message = generateRandomCode();
                    $resultContactID = CRest::call(
                        'crm.duplicate.findbycomm',
                        array(
                            'entity_type' => "CONTACT",
                            'type' => "PHONE",
                            'values' => array($phone)
                        )
                    );
                    $data1 = array(
                        'apiKey' => '***',
                        'sms' => array(
                            array(
                                'channel' => 'char',
                                'phone' => $phone,
                                'text' => 'Ваш код от ЛК: ' . $message,
                                'sender' => '***'
                            )
                        )
                    );
    
                    $ch = curl_init('https://admin.p1sms.ru/apiSms/create');
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data1));
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    
                    $response = curl_exec($ch);
    
                    if ($response === false) {
                        echo 'Curl error: ' . curl_error($ch);
                    } else {
                        echo 'Response: ' . $response;
                    }
    
    
                    $result = json_decode($response);
    
    
                    // Сохраняем код в переменной сессии
                    $_SESSION['verification_code'] = $message;
                    $contactData['sendt_to'] = $contactData['ID'];
                    $contactData['phone'] = $phone;
                    curl_close($ch);
    
    
                    echo json_encode($contactData, JSON_UNESCAPED_UNICODE);
    
    
            }
    
    
    
        }
        if (isset($_POST['enteredCode'])) {
            $userCode = isset($_POST['enteredCode']) ? $_POST['enteredCode'] : '';
            $userCode_gen = $_SESSION['verification_code'];
            if ($userCode === $userCode_gen) {
                echo "Код верен! ";
            } else {
                echo "Неверный код ";
                echo $userCode_gen;
                
            }
    
        }
    
    }

Ответы (1 шт):

Автор решения: Condor

Если участок, где происходит отправка кода находится отдельно от проверки ввода кода, то нужно убедиться, везде ли запущена session_start() функция для доступа к сеансу. Если он не запущен, то в $_SESSION не будет ранее переданных данных.

Также, попробуйте проверить, правильно ли пишется сам код подтверждения в этом самом месте:

$_SESSION['verification_code'] = $message;

Если данные сеанса потеряны, удалены в одном из других скриптов или срок их действия истек (пользователь вышел, зашел через другой браузер), то $_SESSION['verification_code'] может оказаться пустым по этой причине.

Поэтому сессия не всегда лучший вариант для хранения кода подтверждения. Лучшие хранить его в базе данных. Так проще на разных устройствах/браузерах в нужный момент доставать, делать неактивным или подсчитывать количество попыток.

→ Ссылка