Налаштування оплати за посиланням на 1С-Бітрікс
Оплата за посиланням — менеджер формує посилання і надсилає його покупцеві в месенджер, листом або SMS. Покупець переходить за посиланням і оплачує без авторизації на сайті. Затребувано для телефонних замовлень, B2B-продажів, персональних пропозицій. Технічно це спеціальний URL з токеном, який веде на сторінку оплати конкретного замовлення або довільної суми.
Два сценарії оплати за посиланням
Посилання на існуюче замовлення — замовлення вже створене в системі, менеджер надсилає посилання для оплати. Покупець не бачить форму оформлення, лише форму оплати.
Посилання на довільний платіж — менеджер вказує суму та опис, замовлення в Бітрікс створюється в момент переходу за посиланням або підтвердження оплати.
Генерація платіжного посилання
class PaymentLinkService
{
public function generateForOrder(int $orderId, int $expiresInHours = 24): string
{
$order = \Bitrix\Sale\Order::load($orderId);
if (!$order || $order->isPaid()) {
throw new \InvalidArgumentException('Замовлення не знайдено або вже оплачено');
}
// Генеруємо одноразовий токен
$token = bin2hex(random_bytes(32));
$expires = (new \DateTime())->modify('+' . $expiresInHours . ' hours');
PaymentLinkTable::add([
'ORDER_ID' => $orderId,
'TOKEN' => $token,
'EXPIRES_AT' => \Bitrix\Main\Type\DateTime::createFromPhp($expires),
'USED' => 'N',
'CREATED_BY' => $GLOBALS['USER']->GetID(),
]);
return 'https://' . $_SERVER['HTTP_HOST'] . '/pay/' . $token . '/';
}
public function generateCustom(float $amount, string $description): string
{
$token = bin2hex(random_bytes(32));
PaymentLinkTable::add([
'ORDER_ID' => null,
'AMOUNT' => $amount,
'DESCRIPTION' => $description,
'TOKEN' => $token,
'EXPIRES_AT' => \Bitrix\Main\Type\DateTime::createFromPhp(
(new \DateTime())->modify('+24 hours')
),
'USED' => 'N',
]);
return 'https://' . $_SERVER['HTTP_HOST'] . '/pay/' . $token . '/';
}
}
Сторінка оплати за посиланням
// Компонент /local/components/my/payment.link/class.php
class PaymentLinkComponent extends \CBitrixComponent
{
public function executeComponent(): void
{
$token = $this->arParams['TOKEN'] ?? $GLOBALS['APPLICATION']->GetCurDir();
$token = trim($token, '/');
// Шукаємо посилання за токеном
$link = PaymentLinkTable::getList([
'filter' => [
'TOKEN' => $token,
'USED' => 'N',
'>EXPIRES_AT' => new \Bitrix\Main\Type\DateTime(),
],
])->fetch();
if (!$link) {
$this->arResult['ERROR'] = 'Посилання недійсне або прострочене';
$this->includeComponentTemplate();
return;
}
// Якщо посилання на замовлення — показуємо форму оплати існуючого замовлення
if ($link['ORDER_ID']) {
$order = \Bitrix\Sale\Order::load($link['ORDER_ID']);
$this->arResult['ORDER'] = $order;
$this->arResult['AMOUNT'] = $order->getPrice();
} else {
// Довільний платіж — створюємо замовлення «на льоту»
$order = $this->createOrderFromLink($link);
$this->arResult['ORDER'] = $order;
$this->arResult['AMOUNT'] = $link['AMOUNT'];
}
// Ініціюємо платіж
$paySystem = \Bitrix\Sale\PaySystem\Manager::getObjectById(DEFAULT_PAY_SYSTEM_ID);
$payment = $order->getPaymentCollection()->current();
$response = $paySystem->initiatePay($payment, null);
if ($response->isSuccess()) {
// Позначити посилання використаним лише після успішного платежу
// (через callback)
$this->arResult['PAYMENT_URL'] = $response->getPaymentUrl();
}
$this->includeComponentTemplate();
}
}
Управління посиланнями з адміністративної частини
В адміністративному розділі CRM або замовлень додаємо кнопку «Надіслати посилання на оплату»:
// На адмін-сторінці замовлення — додаємо кнопку
$adminPage->AddAdminContextMenuItem([
'TEXT' => 'Створити посилання на оплату',
'LINK' => '/bitrix/admin/payment_link_create.php?ORDER_ID=' . $orderId,
'ICON' => 'btn_pay',
]);
Сторінка /bitrix/admin/payment_link_create.php показує створене посилання, яке менеджер копіює та надсилає покупцеві.
Обмеження кількості використань
Посилання можна зробити одноразовим або багаторазовим:
// У callback після успішної оплати
if ($payment->isPaid()) {
PaymentLinkTable::update($linkId, [
'USED' => 'Y',
'PAID_AT' => new \Bitrix\Main\Type\DateTime(),
]);
}
Терміни
| Завдання | Термін |
|---|---|
| Генерація токенів + таблиця посилань | 0.5 дня |
| Сторінка оплати за посиланням | 1 день |
| Інтерфейс створення в адміністративній частині | 0.5 дня |







