Задать вопрос
@MorphyZ

1C-Битрикс, аспро: лайт-шоп, Юкасса. Оплата по отдельной ссылке юкассы не подтверждает заказ в Битриксе. В чём проблема?

Сделал платёжную систему Юкассу в битриксе, которая туда интегрирована, всё работает, всё хорошо. Но стала необходимость отправлять людям, вместе с письмом создания нового заказа, ссылку на оплату заказа от Юкассы. Перерыл всю документацию, не смог найти откуда взять можно ссылку, пробовал выдернуть с личного кабинета, но она генерируется каждый раз по-новому. Было принято решение, написать с помощью АПИ Юкассы новый пэймент, вытащить из него ссылку и отправить пользователю
function registerOrder(array $data, string $orderNumber, int $cost, string $returnUrl, string $failUrl = '')
{
    $shopId = ****;
    $secretKey = "****";
    $client = new Client();
    $client->setAuth($shopId, $secretKey);
    try {
        $idempotenceKey = uniqid('', true);
        //описание товара
        $description = "Оплата заказа №" . $orderNumber;
        //массив
        $paymentData = array(
            'amount' => array(
                'value'    => $cost,
                'currency' => 'RUB',
            ),
            'confirmation' => array(
                'type'       => 'redirect',
                'return_url' => $returnUrl,
            ),
            'receipt' => array(
                'customer' => array(
                    'full_name' => trim(($data["surname"] ?? '') . " " . ($data["name"] ?? '') . " " . ($data["patronymic"] ?? '')),
                    'email'     => $data["email"] ?? '',
                    // 'phone'   => $data["phone"], // если что для телефона
                ),
                'items' => array(
                    array(
                        'description'    => $description,
                        'quantity'       => 1,
                        'payment_mode'   => 'full_payment',
                        'payment_subject' => 'service',
                        'amount'         => array(
                            'value'    => $cost,
                            'currency' => 'RUB'
                        ),
                        'vat_code' => 1
                    )
                )
            ),
            'capture' => true,
            'description' => $description,
            'metadata' => [
                'order_id' => $orderNumber // или другой идентификатор, который вам нужен
            ],
        );
        // Создаём платеж
        $response = $client->createPayment($paymentData, $idempotenceKey);
        //ошибка
    } catch (\Exception $e) {
        $response = $e;
        $log = print_r('[YooKassaError] = ' . $response, true);
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/local/logs/log_error.txt', $log . PHP_EOL, FILE_APPEND);
        throw new \Exception('Система эквайринга недоступна.');
    }
    if (empty($response)) {
        throw new \Exception('Система эквайринга недоступна.');
    }
    return $response;
}


AddEventHandler("main", "OnBeforeEventAdd", "AddPaymentUrlToMailEventHandler", 1);
function AddPaymentUrlToMailEventHandler(&$event, &$lid, &$arFields)
{
    $logFile = $_SERVER['DOCUMENT_ROOT'] . '/local/logs/yookassa_debug.txt';
    file_put_contents($logFile, "===== OnBeforeEventAdd START =====\n", FILE_APPEND);
    file_put_contents($logFile, "Event: " . $event . "\n", FILE_APPEND);
    file_put_contents($logFile, "LID: " . $lid . "\n", FILE_APPEND);
    file_put_contents($logFile, "arFields: " . print_r($arFields, true) . "\n", FILE_APPEND);
    if ($event == "SALE_NEW_ORDER") {
        file_put_contents($logFile, "SALE_NEW_ORDER event detected\n", FILE_APPEND);
        if (!empty($arFields["ORDER_ID"])) {
            $orderId = (int)$arFields["ORDER_ID"];
            file_put_contents($logFile, "ORDER_ID: " . $orderId . "\n", FILE_APPEND);
            if ($orderId > 0 && \Bitrix\Main\Loader::includeModule('sale')) {
                file_put_contents($logFile, "Sale module included\n", FILE_APPEND);
                $order = \Bitrix\Sale\Order::load($orderId);
                if ($order) {
                    file_put_contents($logFile, "Order loaded. Price: " . $order->getPrice() . "\n", FILE_APPEND);
                    $propertyCollection = $order->getPropertyCollection();
                    $emailProp = $propertyCollection->getUserEmail();
                    $email = $emailProp ? $emailProp->getValue() : '';
                    file_put_contents($logFile, "Email: " . $email . "\n", FILE_APPEND);
                    // Проверяем email клиента
                    if (mb_strtolower(trim($email)) === 'test@mail.ru') {
                        file_put_contents($logFile, "Email matches condition, generating payment link\n", FILE_APPEND);
                        $data = [
                            "surname" => '',
                            "name" => '',
                            "patronymic" => '',
                            "email" => $email
                        ];
                        file_put_contents($logFile, "Data: " . print_r($data, true) . "\n", FILE_APPEND);
                        $sum = $order->getPrice();
                        $accountNumber = $order->getField('ACCOUNT_NUMBER') ?: $orderId;
                        file_put_contents($logFile, "Sum: " . $sum . " AccountNumber: " . $accountNumber . "\n", FILE_APPEND);
                        $returnUrl = "https://shop.poslanie-ottuda.ru/order/?ORDER_ID=" . $accountNumber;
                        $failUrl = $returnUrl;
                        file_put_contents($logFile, "ReturnUrl: $returnUrl\nFailUrl: $failUrl\n", FILE_APPEND);
                        try {
                            $response = registerOrder($data, (string)$accountNumber, $sum, $returnUrl, $failUrl);
                            file_put_contents($logFile, "Response: " . print_r($response, true) . "\n", FILE_APPEND);
                            if ($response && $response->getConfirmation()) {
                                $paymentUrl = $response->getConfirmation()->getConfirmationUrl();
                                file_put_contents($logFile, "PaymentUrl: " . $paymentUrl . "\n", FILE_APPEND);
                                $arFields["PAYMENT_URL"] = $paymentUrl;
                                file_put_contents($logFile, "PAYMENT_URL set in arFields\n", FILE_APPEND);
                            } else {
                                file_put_contents($logFile, "No valid confirmation in response, PAYMENT_URL not set\n", FILE_APPEND);
                                $arFields["PAYMENT_URL"] = '';
                            }
                        } catch (\Exception $e) {
                            file_put_contents($logFile, "Exception: " . $e->getMessage() . "\n", FILE_APPEND);
                            $arFields["PAYMENT_URL"] = '';
                        }
                    } else {
                        file_put_contents($logFile, "Email does not match condition, no PAYMENT_URL added\n", FILE_APPEND);
                    }
                } else {
                    file_put_contents($logFile, "Order not found by ID\n", FILE_APPEND);
                }
            } else {
                file_put_contents($logFile, "Invalid orderId or sale not included\n", FILE_APPEND);
            }
        } else {
            file_put_contents($logFile, "No ORDER_ID in arFields\n", FILE_APPEND);
        }
    } else {
        file_put_contents($logFile, "Not SALE_NEW_ORDER event\n", FILE_APPEND);
    }
    file_put_contents($logFile, "===== OnBeforeEventAdd END =====\n\n", FILE_APPEND);
}

Но вот проблема, при оплате через ссылку, заказ не подтверждается. В чём может быть проблема. Распишите пожалуйста куда копать и где искать)
  • Вопрос задан
  • 59 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы