+7 (987) 026-06-36
Написать в Telegram

Оставить заявку
stanislav_web

Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс

Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы

Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс

Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы

📅 27 ноября 2025

👁‍🗨 72

🔥 0

Создание ссылки на оплату через API модуля Тинькофф при смене статуса заказа в 1С-Битрикс
<? // /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;
}
?>