Почему скрипт не видит проверочный код внутри сессии?
Основная проблема заключается в том, что при проверке правильности введённого кода не видно изначальный код, который был отправлен по смс. И из-за этого выпадает ошибка, что код не верен.
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 шт):
Если участок, где происходит отправка кода находится отдельно от проверки ввода кода, то нужно убедиться, везде ли запущена session_start() функция для доступа к сеансу. Если он не запущен, то в $_SESSION не будет ранее переданных данных.
Также, попробуйте проверить, правильно ли пишется сам код подтверждения в этом самом месте:
$_SESSION['verification_code'] = $message;
Если данные сеанса потеряны, удалены в одном из других скриптов или срок их действия истек (пользователь вышел, зашел через другой браузер), то $_SESSION['verification_code'] может оказаться пустым по этой причине.
Поэтому сессия не всегда лучший вариант для хранения кода подтверждения. Лучшие хранить его в базе данных. Так проще на разных устройствах/браузерах в нужный момент доставать, делать неактивным или подсчитывать количество попыток.