Перейти к содержимому

Заказ в один клик - форма, заказ из кода, уведомления

Делаем покупку в один шаг: короткая форма с телефоном, заказ прямо из кода и понятный ответ покупателю - без корзины и оформления.

Механика

Быстрый заказ - это не упрощённое оформление, а другой сценарий. Покупатель оставляет телефон, а всё остальное - доставку, оплату, адрес - магазин выясняет звонком. Отсюда и требования: минимум полей, максимум проверок на сервере и понятный ответ о том, что будет дальше.

Корзину покупателя такой заказ не трогает. Он собирает свою корзину прямо в коде, из одного товара, и сохраняется как обычный заказ. Смешение с настоящей корзиной даёт классическую жалобу: нажал «купить в один клик» - пропало всё, что собирал полчаса.

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

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

Наконец, отдельного внимания стоит ответ самому покупателю. Номер заказа и одна фраза о том, когда перезвонят, снимают половину повторных нажатий, а молчание после отправки формы - самая частая причина трёх одинаковых заказов подряд.

Стоит заранее договориться с магазином, кто и как быстро перезванивает. Быстрый заказ обещает звонок, и обещание это даёт сайт, а выполняет отдел продаж; если звонок приходит через сутки, форма приносит не заказы, а раздражение и отказы, причём винить в этом будут именно сайт.

Шаги

  1. Договориться, что спрашиваем: обычно телефон и, реже, имя.
  2. Собрать форму с проверкой сеанса и полем-ловушкой.
  3. Создать заказ из кода со своей корзиной из одного товара.
  4. Записать источник и телефон в свойства заказа.
  5. Уведомить менеджера и показать покупателю номер заказа.
  6. Закрыть повторы: одинаковые заявки за короткий срок отсекаются.

Код

Собираем короткую форму:

// шаблон карточки товара
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' => 'Не удалось принять заказ, позвоните нам по телефону'];
}
// покупателю - понятная фраза и телефон, разработчику - запись в журнале

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

Ограничения

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

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

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

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

Товары с обязательным выбором варианта требуют оговорки. Заказ в один клик на карточке с размерами и цветами создаёт заказ на первый попавшийся вариант, если не передать выбранный явно.

Типичные проблемы

После быстрого заказа пропала корзина покупателя.

Заказ собран из текущей корзины вместо своей, созданной в коде. Быстрый заказ работает со своей корзиной из одного товара.

Менеджер обрабатывает заказ как обычный.

Источник заказа нигде не записан, и пустые поля выглядят ошибкой. Признак «в один клик» пишут в свойство и в комментарий.

Форму завалило мусорными заявками.

Нет ни поля-ловушки, ни проверки сеанса, ни ограничения частоты. Все три ставят до публикации формы.

Один покупатель прислал три одинаковых заказа.

После отправки формы ничего не показывается, и кнопку нажимают ещё раз. Ответ с номером заказа и защита от повтора закрывают это.

В заказе не тот вариант товара.

С карточки с размерами передан номер товара, а не выбранного предложения. Выбранный вариант передают явно.

Частые вопросы

Что спрашивать в форме?

Телефон, иногда имя. Каждое лишнее поле снижает число заявок заметнее, чем кажется.

Можно ли принимать оплату сразу?

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

Как отличать такие заказы в отчётах?

По свойству источника, записанному при создании. Без него они смешиваются с обычными и портят статистику.

Что делать с товарами, у которых есть варианты?

Передавать номер выбранного предложения, а не товара. Иначе заказ придёт на случайный вариант.

Нужна ли картинка с кодом?

Обычно нет: ловушка и ограничение частоты работают лучше и не мешают покупателю.

Смежное

Первоисточник