Заказ в один клик - форма, заказ из кода, уведомления
Делаем покупку в один шаг: короткая форма с телефоном, заказ прямо из кода и понятный ответ покупателю - без корзины и оформления.
Механика
Быстрый заказ - это не упрощённое оформление, а другой сценарий. Покупатель оставляет телефон, а всё остальное - доставку, оплату, адрес - магазин выясняет звонком. Отсюда и требования: минимум полей, максимум проверок на сервере и понятный ответ о том, что будет дальше.
Корзину покупателя такой заказ не трогает. Он собирает свою корзину прямо в коде, из одного товара, и сохраняется как обычный заказ. Смешение с настоящей корзиной даёт классическую жалобу: нажал «купить в один клик» - пропало всё, что собирал полчаса.
Источник заказа для менеджера важен не меньше самого заказа. Менеджер должен видеть, что этот заказ пришёл без адреса и без выбранной доставки, иначе он отправит его в обычную обработку и удивится пустым полям.
Быстрая форма на видном месте - это магнит для роботов. Проверка сеанса, скрытое поле-ловушка и ограничение частоты обязательны с первого дня: без них поток мусорных заявок приходит в тот же вечер, когда форму заметили.
Наконец, отдельного внимания стоит ответ самому покупателю. Номер заказа и одна фраза о том, когда перезвонят, снимают половину повторных нажатий, а молчание после отправки формы - самая частая причина трёх одинаковых заказов подряд.
Стоит заранее договориться с магазином, кто и как быстро перезванивает. Быстрый заказ обещает звонок, и обещание это даёт сайт, а выполняет отдел продаж; если звонок приходит через сутки, форма приносит не заказы, а раздражение и отказы, причём винить в этом будут именно сайт.
Шаги
- Договориться, что спрашиваем: обычно телефон и, реже, имя.
- Собрать форму с проверкой сеанса и полем-ловушкой.
- Создать заказ из кода со своей корзиной из одного товара.
- Записать источник и телефон в свойства заказа.
- Уведомить менеджера и показать покупателю номер заказа.
- Закрыть повторы: одинаковые заявки за короткий срок отсекаются.
Код
Собираем короткую форму:
// шаблон карточки товараecho bitrix_sessid_post(); // признак сеанса обязателен?><input type="hidden" name="PRODUCT_ID" value="<?= (int)$arResult['ID'] ?>"><input type="tel" name="PHONE" required placeholder="Телефон"><input type="text" name="COMPANY" class="hidden" tabindex="-1"> <!-- ловушка -->Форма спрашивает минимум полей, но проверяет их все именно на сервере. Скрытое поле-ловушка отсекает простых роботов, а признак сеанса - отправку с чужой страницы.
Проверяем на сервере:
if (!check_bitrix_sessid() || $request->getPost('COMPANY') !== '') { return ['status' => 'error'];}$phone = preg_replace('/\D+/', '', (string)$request->getPost('PHONE'));if (strlen($phone) < 10) { return ['status' => 'error', 'message' => 'Проверьте номер телефона'];}$productId = (int)$request->getPost('PRODUCT_ID');Проверки на странице удобны человеку, но защитой не являются: запрос отправляют и мимо формы. Телефон приводят к цифрам, номер товара - к числу, а признак сеанса проверяют до всякой работы с пришедшими данными.
Создаём заказ из кода:
$order = \Bitrix\Sale\Order::create(SITE_ID, $userId ?: CSaleUser::GetAnonymousUserID());$basket = \Bitrix\Sale\Basket::create(SITE_ID);$item = $basket->createItem('catalog', $productId);$item->setFields(['QUANTITY' => 1, 'CURRENCY' => 'RUB', 'LID' => SITE_ID, 'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider']);$order->setBasket($basket); // своя корзина, не корзина покупателяЗаказ собирают прямо из кода, не трогая при этом корзину покупателя. Отдельная корзина из одного товара - и есть та деталь, из-за которой быстрый заказ не ссорится с обычной покупкой.
Записываем источник и телефон:
$props = $order->getPropertyCollection();$props->getPhone()->setValue($phone);foreach ($props as $prop) { if ($prop->getField('CODE') === 'SOURCE') { $prop->setValue('в один клик'); }}$order->setField('COMMENTS', 'Быстрый заказ: доставка и оплата уточняются звонком');$order->save();У быстрого заказа свой отдельный признак и свои собственные свойства. Менеджер видит источник сразу и не ищет несуществующий адрес, а отчёты отделяют такие заказы от обычных.
Уведомляем и отвечаем покупателю:
\Bitrix\Main\Mail\Event::send(['EVENT_NAME' => 'QUICK_ORDER', 'LID' => SITE_ID, 'C_FIELDS' => ['ORDER_ID' => $order->getId(), 'PHONE' => $phone]]);return ['status' => 'ok', 'order' => $order->getField('ACCOUNT_NUMBER'), 'message' => 'Заказ принят, перезвоним в течение часа'];Менеджер узнаёт о заявке сразу, а покупатель видит номер своего заказа. Одна фраза про звонок снимает половину повторных нажатий: молчание после отправки формы читается посетителем как сбой, и он нажимает кнопку снова.
Отсекаем повторы:
$recent = \Bitrix\Sale\Internals\OrderTable::getList([ 'filter' => ['=USER_ID' => $userId, '>DATE_INSERT' => $tenMinutesAgo], 'limit' => 1,])->fetch();if ($recent) { return ['status' => 'ok', 'order' => $recent['ACCOUNT_NUMBER']]; }// повтор не создаёт второй заказ, но и не пугает покупателя ошибкойОдинаковые заявки за короткий срок отсекаются молча и без ошибок. Покупатель, нажавший кнопку трижды, получает тот же номер заказа, а менеджер - одну заявку вместо трёх.
Показываем поведение при ошибке:
if (!$order->save()->isSuccess()) { AddMessage2Log('быстрый заказ: ' . implode('; ', $result->getErrorMessages()), 'vendor.shop'); return ['status' => 'error', 'message' => 'Не удалось принять заказ, позвоните нам по телефону'];}// покупателю - понятная фраза и телефон, разработчику - запись в журналеОшибка сохранения не должна выглядеть как молчание. Покупатель получает понятную фразу и способ связаться другим путём, а подробности уходят в журнал, где их найдёт разработчик, а не посетитель.
Ограничения
Онлайн-оплату в этот короткий сценарий обычно вовсе не встраивают. Сумма к оплате зависит от доставки, а доставку выясняют звонком, поэтому оплата остаётся на следующий шаг - после подтверждения заказа менеджером.
Юридические лица таким способом обычно ничего не заказывают. Реквизиты, документы и договорные цены требуют полного оформления, и быстрый заказ для них скорее вреден, чем полезен: он создаёт заявку, которую менеджер всё равно переоформит руками с самого начала.
Согласие на обработку данных требуется и в этом коротком сценарии. Короткая форма не отменяет ни самого согласия, ни его хранения рядом с заказом: спор об этом решается записью в базе, а не воспоминаниями участников. Отметку о согласии сохраняют тем же кодом, что и телефон покупателя, и в том же самом заказе.
Кнопка быстрого заказа конкурирует с обычной покупкой за внимание. На карточке с двумя равными по весу кнопками часть покупателей выбирает ту, что проще, даже когда готова оформить заказ целиком, и магазин вместо оплаченного заказа получает заявку на звонок. Расставлять их стоит осознанно, а не по привычке.
Товары с обязательным выбором варианта требуют оговорки. Заказ в один клик на карточке с размерами и цветами создаёт заказ на первый попавшийся вариант, если не передать выбранный явно.
Типичные проблемы
После быстрого заказа пропала корзина покупателя.
Заказ собран из текущей корзины вместо своей, созданной в коде. Быстрый заказ работает со своей корзиной из одного товара.
Менеджер обрабатывает заказ как обычный.
Источник заказа нигде не записан, и пустые поля выглядят ошибкой. Признак «в один клик» пишут в свойство и в комментарий.
Форму завалило мусорными заявками.
Нет ни поля-ловушки, ни проверки сеанса, ни ограничения частоты. Все три ставят до публикации формы.
Один покупатель прислал три одинаковых заказа.
После отправки формы ничего не показывается, и кнопку нажимают ещё раз. Ответ с номером заказа и защита от повтора закрывают это.
В заказе не тот вариант товара.
С карточки с размерами передан номер товара, а не выбранного предложения. Выбранный вариант передают явно.
Частые вопросы
Что спрашивать в форме?
Телефон, иногда имя. Каждое лишнее поле снижает число заявок заметнее, чем кажется.
Можно ли принимать оплату сразу?
Обычно нет: сумма зависит от доставки, которую уточняют звонком. Оплату дают следующим шагом.
Как отличать такие заказы в отчётах?
По свойству источника, записанному при создании. Без него они смешиваются с обычными и портят статистику.
Что делать с товарами, у которых есть варианты?
Передавать номер выбранного предложения, а не товара. Иначе заказ придёт на случайный вариант.
Нужна ли картинка с кодом?
Обычно нет: ловушка и ограничение частоты работают лучше и не мешают покупателю.
Смежное
- Оформление заказа - оглавление подтемы
- Заказ из кода: чтение, поиск по номеру, изменение состава - как создаётся заказ вообще
- Добавление в корзину: из списка, из кода, с нужными свойствами - обычный путь покупки
- Данные от посетителя: экранирование, проверка, сеанс - проверки на стороне сервера
- Каталог и продажи - устройство магазина целиком