Очищать корзину после оплаты или нет?

Ссылка скопирована
2 ответов

Когда пользователь оплачивает, нужно ли сохранять items корзины с пометкой "опачено" и исключать из запроса или просто очищать корзину? Какая бест практика по данному вопросу?

Дополнительно:

Делайте как в жизни. В корзине, пока несете до "кассы". Затем же перекладывайте в "пакет". Корзина пуста, может снова наполняться.

Смысл в том, что это временное хранилище выбранных товаров. Их может быть даже в БД не будет, пока клиент не "оплатит".

  • По логике, в корзине только неоплаченные товары. Поэтому, оплаченное из корзины должно перемещаться в список заказов/покупок или чего-то подобного.
  • VolgaVolga, тогда надо будет полностью дублировать таблицу cart_items, а это дублирование данных
  • maksam07, на практике дублируют таблицы? Не сталкивался с данными процессами. Или я не понял, как перекладывать. Пересоздать cart_items - это не перекладывать. Перекладывать -это если добавить cart_items полиморфизма и cart_id заменять на order_id.
  • evomed, на практике для заказов у тебя есть всего 1 таблица (грубо говоря). А для корзины просто сессия, которая живет до очистки
  • maksam07, я думал про сессии, но у меня гости не могут покупать (не магазин) и хочу сделать не удаляемые системой корзины до покупки и обновлять инфу по эвентам (изменился продукт - изменился cart_items) с информированием юзера.
  • evomed, не дублирование, а изменение состояния или перенос. И уже написали, что содержимое корзины, как правило, не хранится в БД.
  • VolgaVolga, я имею ввиду дублирование таблиц. Сессия ненадежный вариант, если содержимое корзины до оплаты должно быть сохранено.
  • evomed, как правило, web storage бывает достаточно.
  • VolgaVolga, какая разница где дублировать структуру сущности? Если дублировать и есть юзер, тогда бд лучше всего.
  • evomed, очень спорно. Но раз вы так уверены, зачем было вопрос задавать?
  • evomed, что вы там собрались дублировать? Название товара с характеристиками и картинкой хотите что ли хранить вместо всего трех полей: item_id, cart_id, count? Ну прям нереальное количество данных!

    Правильно говорят - просто храните в LocalStorage айдишники товара с количеством. Если хранить в LocalStorage - тогда вообще всего 2 поля нужно хранить: item_id и count.

  • Талян, название товара, цена скидки, процент, тип скидки, купон - и все это может меняться. Пользователю и для истории нужно сохранить данные на момент заказа. И цену в корзине высчитывать неудобно если нет "продуктов" и цена формируется в результате логики.

    Если хранить в LocalStorage

    Зачем? у меня есть user_id

  • Ни разу не видел ни одного интернет-магазина, где она бы не очищалась после оформления заказа.

    • Если хранить cart_items в бд, тогда какой вариант? Просто продублировать позиции из cart_items в order_items после заказа?
    • evomed, не дублировать. У таблицы заказов другая структура должна быть.
    • Сергей Горностаев, не у таблицы заказов, а у order_items. Получается carts связанная с cart_items, orders связанная с order_items и orders, связанная с carts. cart_items будет дублировать по структуре order_items
    • evomed, я её и имел ввиду. Таблица корзин должна хранить внешний ключ на покупателя, внешний ключ на товар и поле для количества товара. Можно ещё дату добавления товара в корзину для обнаружения брошенных корзин. А таблица элементов заказа - это наименование заказа, цена товара на момент покупки и количество купленных товаров. Можно дополнительно хранить внешний ключ на товар для аналитики.
    • Сергей Горностаев, цену товаров, скидки и т.д. не хранить в cart_items и расчитывать "налету" в корзине?
    • evomed, конечно нет. Пока клиент не купил товар, у него может много раз измениться цена например. А вот после покупки история должна оставаться неизменной, если не хочется намотаться на проблем с роспотребнадзором и налоговой.
    • Сергей Горностаев, здесь есть проблема, что пока юзер оплачивает (или идет уведомление) цена может поменяться и есть шанс после оплаты записать в order_items неневерные данные. А если сохранять все условия в cart_items, то тогда данные получишь строго на момент покупки. Но тогда еще придется хранить версии корзин (создавать новую корзину с items при каждом ее открытии).
    • evomed, используйте оптимистичную блокировку.
    • Сергей Горностаев, блокировать изменение цены товара?
    • evomed, нет. Контролировать версию данных. Если в момент покупки данные в каталоги изменились, выдавать клиенту ошибку.
    • Сергей Горностаев, в момент покупки - это когда? Когда нажимает на кнопку перейти к оплате не проблема. Я имею ввиду когда клиент уже смотрит на форму ввода карты на сайте платежной системы. И тут он забыл карту, пошел ее искать и в процессе решил попить чаю. А потом, когда оплатил, у платежной системы или у меня сбой и уведомление пришло через 2 часа. А за это время цена товара изменилась и ты записываешь в order_items не то, что было по факту.
    • evomed, а вот это должен решить бизнес-аналитик.
    • Сергей Горностаев, что должен решить бизнес аналитик? Как устранить уязвимость?
    • evomed, это не уязвимость, а бизнесовое поведение. Мне чаще всего заказывали интернет-магазины, у которых фиксация заказа происходила именно в момент нажатия кнопки "оформить". Далее заказ находился в статусе ожидания оплаты. Иногда действовало ограничение на срок нахождения в этом статусе.
    • Сергей Горностаев, для интернет-магазина это хороший и безопасный вариант. Мне такое в целом не подходит, у меня из-за специфики пользователь не может иметь несколько неоплаченных заказов и потом выбирать что оплатить, но версионность (когда сейвим неоплаченные корзины/заказы) это видимо самый правильный путь.

    Ответы:

    Если хочется хранить корзину в БД - так вам ее все равно хранить после оформления заказа.
    Сделайте таблицу, где большинство полей - NULL до момента оформления заказа (цены и проч. для отображения берется с текущих карточек). Выборка текущей корзины - по order_id = NULL. Заказ оформлен - текущая корзина опустела, товары естественным порядком перекочевали в заказ.

    • Не понял процесс.. Как товары естественным образом перекочуют в заказ? Откуда перекочуют? Если брать из products то в соседнем ответе обсуждали, что там может быть не актуальная информация пока юзер платит. Дыра безопасности.
    • Пользователь добавляет товары в корзину, идет платить, возращается к корзине - добавляет товары еще на миллион долларов, возращается к платежке - оплачивает и мы получаем состав заказа на миллион с оплатой на рубль.
    • evomed, при создании заказа товарам в корзине присвоится ID этого заказа и актуальные цены/скидки вместо NULL. Корзина опустела, теперь эти самые записи - состав заказа, который можно оплачивать. Никакого "возвращаемся к корзине" после формирования заказа уже не будет.
    • Adamos, т.е. добавляем товары в cart_items где все поля условий null. В cart добавляем order_id = null. Когда оплачено, создаем order и сетаем в cart order_id, а в cart_items поля null заполняем данными из products - так, чтоли?
    • evomed, ну, я не знаю ваших таблиц.
      Возможно, до оформления заказа в cart_items будут заполнены только id, created_at, product_id и amount.
      Зато при оформлении зафиксируются текущие данные из prices, bonuses, coupons etc.
    • Adamos, допустим есть только products, я все равно не понял процесса. Если до оформления заказа в cart_items не будет всех условий (прайс скидки название), то после оформления (поступления оплаты) - если данные изменятся то правильную инфу будет неоткуда брать.
    • evomed, юзер набрал корзину.
      В таблицу накиданы записи: товар, количество. Все остальное - NULL, юзеру оно отображается из текущих данных по товарам.
      Юзер захотел оплатить - формируется заказ: запись в таблице заказов, order_id на все строки корзины, все прочие данные в них заполняются из текущих цен и акций.
      Теперь юзер может оплачивать готовый заказ с текущими ценами - или протормозить, и заказ, созданный больше суток (трех, недели?) назад, уходит в "не оплаченные". Хочешь заказать - начинай сначала.
    • Adamos, здесь есть проблема в одинаковом cart_id, что если пользователь вернется с платежной системы в корзину и изменит заказ, а потом обратно переключится на сайт платежки и оплатит, то, когда мой сайт получит уведомление там будет order_id корзины, в которой уже другой состав. Уязвимость. Решается созданием новой carts и всех cart_items при каждом открытии корзины, но тогда нагрузка на бд.
    • Adamos, то есть у пользователя будет много корзин, отображаться будет последняя неоплаченная - ну или что-то типа того
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

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

    Если вы очищаете корзину после успешной оплаты, это может иметь следующие преимущества:

    1. Улучшение пользовательского опыта: Пользователи не будут видеть уже купленные товары в корзине, что может снизить путаницу и улучшить общее впечатление от покупки.

    2. Повышение производительности: Очищение корзины может помочь уменьшить нагрузку на сервер, освободив место для новых покупок.

    3. Улучшение отслеживаемости: После успешной оплаты вы можете легче отслеживать завершенные заказы и управлять вашими данными о продажах.

    Однако есть и недостатки в очищении корзины после оплаты:

    1. Возможная потеря продаж: Если пользователь случайно закрыл страницу после оплаты и захочет вернуться к покупке, ему придется добавить все товары заново, что может отпугнуть его от завершения покупки.

    2. Неудобство для пользователей: Некоторые пользователи могут хотеть оставить товары в корзине для последующей покупки или сравнения, и очистка корзины может создать для них неудобства.

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

    В целом, решение об очистке корзины после оплаты должно быть принято с учетом ваших бизнес-целей и потребностей пользователей, и рекомендуется провести тестирование этой функциональности, чтобы убедиться, что она соответствует ожиданиям и требованиям вашей аудитории.

    Другие ответы (1) Ответить на вопрос
    Алексей Денисов

    Очистка корзины после оплаты - это важный аспект функциональности интернет-магазина, который может повлиять на удобство пользования сайтом и уровень удовлетворенности клиентов. В данном вопросе нет однозначного ответа, так как это зависит от конкретных потребностей и целей вашего бизнеса.

    Если очистка корзины после оплаты не происходит, это может быть удобно для пользователей, которые могут случайно закрыть страницу или перезагрузить браузер во время процесса оплаты. В этом случае они смогут вернуться к своей корзине и завершить оформление заказа без необходимости добавлять товары заново. Это может увеличить конверсию и удовлетворенность клиентов.

    Однако, если корзина автоматически очищается после успешной оплаты, это может быть полезно для управления заказами и инвентаризацией. Это также может предотвратить ситуации, когда пользователи забывают очистить корзину после завершения покупки, что может привести к недопониманиям и ошибкам в заказах.

    В итоге, решение о том, очищать корзину после оплаты или нет, должно быть принято исходя из специфики вашего бизнеса, потребностей пользователей и уровня безопасности. Рекомендуется провести тестирование обеих опций и изучить отзывы пользователей, чтобы принять информированное решение. В любом случае, важно обеспечить прозрачность и удобство для пользователей при совершении покупок на вашем сайте.

    // Пример кода для очистки корзины после оплаты
    if ($payment_successful) {
        clearCart();
    }

    // Пример кода для очистки корзины после оплаты if ($payment_successful) { clearCart(); }

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно