Сделал платёжную систему Юкассу в битриксе, которая туда интегрирована, всё работает, всё хорошо. Но стала необходимость отправлять людям, вместе с письмом создания нового заказа, ссылку на оплату заказа от Юкассы. Перерыл всю документацию, не смог найти откуда взять можно ссылку, пробовал выдернуть с личного кабинета, но она генерируется каждый раз по-новому. Было принято решение, написать с помощью АПИ Юкассы новый пэймент, вытащить из него ссылку и отправить пользователю
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);
}
Но вот проблема, при оплате через ссылку, заказ не подтверждается. В чём может быть проблема. Распишите пожалуйста куда копать и где искать)