Борюсь сейчас с оформлением заказа без входа на сайт с привязкой к учетке покупателя
Сценарий таков:
Быстрая регистрация включена
Пользователь уже оформлял заказы раньше
Сессия закончилась и покупатель пришел как гость.
Что сейчас делаю: в контроллере app/controllers/frontend/checkout.php в ПОСТ секции моде update_steps проверяю есть ли пользователь с введенным мейлом.
Если есть - устанавливаю $auth[‘user_id’]. Проблема после этого пользователя авторизирует, он получает доступ к кабинету итд, а то вообще не секьюрно))))
Может у кого есть какие либо варианты как то решить другими путями?
Не делайте вот это - автологин по email. Это очень очень плохая методика, вы верно пишите про не секьюрно.
Пока надо увеличить время жизни куки логина - сейчас стоит неделя.
Вот тут поставьте
// Live time for permanent cookies (currency, language, etc…)
define(‘COOKIE_ALIVE_TIME’, SECONDS_IN_DAY * 7); // one week
Самый хороший для вас вариант судя по всему- вечный логин (по аналогии например с вконтакте или facebook)
Если человек вернулся на сайт - обновлять куку логина (делать ее рефреш автоматически, продлевать срок жизни). Мы так делали, в целом если ставить COOKIE_ALIVE_TIME = 28 days и человек достаточно часто возвращается, его будет редко разлогинивать.
Автологин получился случайно, я просто описал свои наработки в этом направлении.
Проблема в том, что пользователь мог и не заходить к нам еще(магазин новый, пользователи старые).
Просто убрать проверку email на учетку? Получится гость оформит заказ с email уже регистрированного покупателя. А заказ сам назначится учетке по email.
И можно добавить данный заказ клиенту, если у клиента уже есть учетка. Но все заказы клиент увидит после авторизации. А до авторизации только заказы в рамках своей сессии.
Так что уже работает такое решение? А при оформлении заказа зарегистрированным пользователем не выдает ошибку о том что эта почта уже используется- получается зарегистрированному пользователю оформить заказ как гость?
<?php
use Tygh\Registry;
use Tygh\Navigation\LastView;
use Tygh\Http;
function fn_my_changes_place_order($order_id, $action, $order_status, $cart, $auth)
{
if($order_id != false){
$email = $cart['user_data']['email'] ? $cart['user_data']['email'] : $cart['user_data']['s_email'];
$user_id = db_get_field("SELECT user_id FROM ?:users WHERE email= ?s", $email);
if($user_id != false){
db_query('UPDATE ?:orders SET user_id = ?i WHERE order_id = ?i', $user_id, $order_id);
}
}
}
function fn_my_changes_is_user_exists_post($user_id, $user_data, &$is_exist){
if(Registry::get(‘runtime.controller’) == ‘checkout’ && Registry::get(‘runtime.mode’) != ‘create_profile’){
$is_exist = false;
}
}
Файл app/addons/my_changes/init.php
<?php
use Tygh\Registry;
use Tygh\Navigation\LastView;
use Tygh\Http;
if (!defined('BOOTSTRAP')) { die('Access denied'); }
fn_register_hooks(
'place_order',
'is_user_exists_post'
);
К сожалению, все еще показывается надпись, что пользователь уже зарегистрирован, и оформление заказа не продолжается.
Подскажите, пожалуйста, что может быть не так.
Чтоб по телефону тоже шла проверка, надо добавить к коду:
if($order_id != false){
$phone = $cart['user_data']['s_phone'] ? $cart['user_data']['s_phone'] : $cart['user_data']['s_phone'];
$user_id = db_get_field("SELECT user_id FROM ?:users WHERE phone= ?s", $phone);
if($user_id != false){
db_query("UPDATE ?:orders SET user_id = ?i WHERE order_id = ?i", $user_id, $order_id);
}
}
Не обязательно должна быть регистрация по телефону, кстати.
Тестил способ, привязывает заказ к учетке, даже если покупатель указал другой email, но телефон соответствует.
И самое главное, желательно маска телефона на сайте. Потому что если телефон в базе у учетки +79991234567, а покупатель в заказе укажет +7(999)123-45-67, то заказ не привяжется.