Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс
Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс
Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы
📅 27 ноября 2025
👁🗨 72
<? // /local/php_interface/init.php
use Bitrix\Main\EventManager;
$handler = EventManager::getInstance();
$handler->addEventHandler('sale', 'OnSaleStatusOrder', 'OnSaleStatusOrderHandler');
function OnSaleStatusOrderHandler($ID, $arFields) {
$data = CSaleStatus::GetList(
[],
['ID' => $arFields, 'LID' => 'ru'],
false,
false,
['*']
)->fetch();
if ($data['ID'] == 'B') {
regenerateTinkoffPayment($ID);
}
}
function regenerateTinkoffPayment($orderId) {
$sdkPath = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/tinkoff.payment/install/sale_payment/tinkoff/sdk/TinkoffMerchantAPI.php';
if (!file_exists($sdkPath)) return false;
require_once($sdkPath);
$order = \Bitrix\Sale\Order::load($orderId);
if (!$order) return false;
$orderNumber = $order->getField("ACCOUNT_NUMBER");
$paySystem = \Bitrix\Sale\PaySystem\Manager::getList([
'filter' => ['ACTION_FILE' => 'tinkoff', 'ACTIVE' => 'Y']
])->fetch();
if (!$paySystem) return false;
$paySystemAction = CSalePaySystemAction::GetList([], ['PAY_SYSTEM_ID' => $paySystem['ID']])->Fetch();
if (!$paySystemAction) return false;
$params = unserialize($paySystemAction['PARAMS'], ['allowed_classes' => false]);
$terminalId = $params['TERMINAL_ID']['VALUE'] ?? '';
$secretKey = $params['SHOP_SECRET_WORD']['VALUE'] ?? '';
if (!$terminalId || !$secretKey) return false;
$paymentCollection = $order->getPropertyCollection();
$payment = null;
foreach ($order->getPaymentCollection() as $p) {
if (!$p->isPaid() && $p->getPaymentSystemId() == $paySystem['ID']) {
$payment = $p;
break;
}
}
if (!$payment) return false;
$payment->setField('SUM', $order->getPrice());
$payment->setField('CURRENCY', $order->getCurrency());
$email = $phone = $name = '';
foreach ($order->getPropertyCollection() as $property) {
$prop = $property->getProperty();
if ($prop['IS_EMAIL'] == 'Y') $email = $property->getValue();
if ($prop['IS_PHONE'] == 'Y') $phone = $property->getValue();
if ($prop['TYPE'] == 'NAME') $name = $property->getValue();
}
$orderIdForTinkoff = $orderNumber . '/' . time();
$amount = round($order->getPrice() * 100);
$paymentData = [
'OrderId' => $orderIdForTinkoff,
'Amount' => $amount,
'DATA' => ['Email' => $email, 'Name' => $name, 'Phone' => $phone, 'Connection_type' => 'Bitrix_Event']
];
if (($params['ENABLE_TAXATION']['VALUE'] ?? 0) == 1) {
$items = [];
foreach ($order->getBasket()->getBasketItems() as $item) {
$f = $item->getFieldValues();
$items[] = [
'Name' => mb_substr($f['NAME'], 0, 64, 'UTF-8'),
'Price' => round($f['PRICE'] * 100),
'Quantity' => round($f['QUANTITY'], 3, PHP_ROUND_HALF_UP),
'Amount' => round($f['PRICE'] * $f['QUANTITY'] * 100),
'PaymentMethod' => $params['PAYMENT_METHOD']['VALUE'] ?? 'full_payment',
'PaymentObject' => $params['PAYMENT_OBJECT']['VALUE'] ?? 'commodity',
'Tax' => 'none',
];
}
$deliveryPrice = $order->getDeliveryPrice();
if ($deliveryPrice > 0) {
$deliveryId = reset($order->getDeliverySystemId());
$deliveryData = \Bitrix\Sale\Delivery\Services\Table::getRowById($deliveryId);
$items[] = [
'Name' => mb_substr($deliveryData['NAME'] ?? 'Доставка', 0, 64, "UTF-8"),
'Price' => round($deliveryPrice * 100),
'Quantity' => 1,
'Amount' => round($deliveryPrice * 100),
'PaymentMethod' => $params['PAYMENT_METHOD']['VALUE'] ?? 'full_payment',
'PaymentObject' => 'service',
'Tax' => $params['DELIVERY_TAXATION']['VALUE'] ?? 'none',
];
}
$paymentData['Receipt'] = [
'EmailCompany' => $params['EMAIL_COMPANY']['VALUE'] ?? '',
'Email' => $email,
'Phone' => $phone,
'Taxation' => $params['TAXATION']['VALUE'] ?? 'osn',
'Items' => $items,
];
}
try {
$tinkoff = new \TBank\TBankMerchantAPI($terminalId, $secretKey);
$response = $tinkoff->buildQuery('Init', $paymentData);
$data = json_decode($response);
if (!empty($data->PaymentURL)) {
$propCollection = $order->getPropertyCollection();
$paymentUrlProp = $propCollection->getItemByOrderPropertyCode('PAYMENT_URL'); // PAYMENT_URL - свойство заказа в котором хранится ссылка на оплату
if ($paymentUrlProp) $paymentUrlProp->setValue($data->PaymentURL);
$order->save();
return true;
}
} catch(Exception $e) {}
return false;
}
?>