Добавлен новый модуль Кто-где

1. Вантуз-мен 30.06.2025 / 22:25
Новый модуль можно самостоятельно установить на движок rotor, доступно с версии 12.5
https://github.com/visavi/rotor-modules/tree/master/UserLocation
Модуль отслеживает все перемещения авторизованных пользователей и записывает текущую страницу
Дополнительно для безопасности исключает некоторые параметры в get
Действия админа внутри /admin не отслеживается
Для работы модуля было добавлено создание middleware из модулей

Все наши модули
https://github.com/visavi/rotor-modules/tree/master

2. Absurd 01.07.2025 / 05:56
Вантуз-мен, круто! А как установить и прописать в нужных местах чтобы всё работало для нубов?

3. Вантуз-мен 01.07.2025 / 11:03
Пока никак не поставишь, 12.5 нужно для этого модуля, выпущу на днях

4. Absurd 01.07.2025 / 11:09
Вантуз-мен, а остальные модули типа подарков будут работать?

5. Вантуз-мен 01.07.2025 / 11:22
Да, все остальные будут, скачивай, ставь в папку modules и активируй в админке

6. Артур 01.07.2025 / 13:25
Братци покажите свои проекты на роторе

7. Absurd 01.07.2025 / 16:40
Вантуз-мен, после активации нужно будет коды прописать для вывода в нужном месте?

8. Вантуз-мен 01.07.2025 / 16:56
Absurd, да нужно, но я могу через хук прописать где удобнее, наверно в футере пропишу тогда в @footerColumnMiddle

9. Absurd 01.07.2025 / 16:58
Вантуз-мен, было бы здорово!

10. Артур 02.07.2025 / 11:37
Вантуз-мен, все пользователи могут смотреть или админ?

11. Вантуз-мен 02.07.2025 / 13:05
Артур, Все пользователи, с помощью хука ссылка размещается в футере, доступна для всех

12. Absurd 03.07.2025 / 18:35
Вантуз-мен, а сможешь в хуках прописать ссылку на модуль игры и развлечения, чтобы ссылка появлялась после активации модуля в админке?

13. Вантуз-мен 04.07.2025 / 00:20
Absurd, добавил

14. Артур 05.07.2025 / 06:09
Absurd, какой игры?

15. Absurd 05.07.2025 / 06:18
Артур, игры и развлечения https://github.com/visavi/rotor-modules/tree/master/Game

16. Артур 05.07.2025 / 14:14
Absurd, а есть пример игры???

17. Андрей 05.07.2025 / 18:06
Кайф. Видимо пора обновляться..

18. Absurd 05.07.2025 / 18:15
Артур, поставь модуль и увидишь

19. Николай 15.12.2025 / 20:01
Доброго времени суток ребят. Поставил ваш модуль взятый с Githab модуль платежей через юкасса. Пишет ошибку.

image

При изменении кода в /modules/Payment/Services/YooKassaService.php
на этот

<?php

declare(strict_types=1);

namespace Modules\Payment\Services;

use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Client\Response; // Убедитесь, что этот импорт есть
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Modules\Payment\Models\Order;
use RuntimeException;

class YooKassaService
{
    private string $shopId;
    private string $secretKey;
    private string $apiUrl;
    private string $currency;

    public function __construct()
    {
        $this->apiUrl = config('payment.yookassa_api_url');
        $this->shopId = config('payment.yookassa_shop_id');
        $this->secretKey = config('payment.yookassa_secret_key');
        $this->currency = config('payment.yookassa_currency');

        // *** ВАЖНОЕ ДОБАВЛЕНИЕ ДЛЯ СТАРЫХ СЕРВЕРОВ ***
        // Fix for the "Undefined constant CURL_SSLVERSION_TLSv1_2" error
        if (!defined('CURL_SSLVERSION_TLSv1_2')) {
            define('CURL_SSLVERSION_TLSv1_2', 6);
        }
    }

    /**
     * Создание платежа
     */
    public function createPayment(Order $order): array
    {
        $url = $this->apiUrl . '/payments';
        $idempotenceKey = uniqid('', true);


при нажатии кнопку оплатить пишет

image


20. Николай 15.12.2025 / 20:02
<?php

declare(strict_types=1);

namespace Modules\Payment\Services;

use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Client\Response; // Убедитесь, что этот импорт есть
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Modules\Payment\Models\Order;
use RuntimeException;

class YooKassaService
{
    private string $shopId;
    private string $secretKey;
    private string $apiUrl;
    private string $currency;

    public function __construct()
    {
        $this->apiUrl = config('payment.yookassa_api_url');
        $this->shopId = config('payment.yookassa_shop_id');
        $this->secretKey = config('payment.yookassa_secret_key');
        $this->currency = config('payment.yookassa_currency');

        // *** ВАЖНОЕ ДОБАВЛЕНИЕ ДЛЯ СТАРЫХ СЕРВЕРОВ ***
        // Fix for the "Undefined constant CURL_SSLVERSION_TLSv1_2" error
        if (!defined('CURL_SSLVERSION_TLSv1_2')) {
            define('CURL_SSLVERSION_TLSv1_2', 6);
        }
    }

    /**
     * Создание платежа
     */
    public function createPayment(Order $order): array
    {
        $url = $this->apiUrl . '/payments';
        $idempotenceKey = uniqid('', true);

        // Формирование данных (часть, которую вы не показали, но она должна быть тут)
        $data = [
            /* ... данные заказа, как в предыдущем ответе ... */
        ];

        try {
            $response = Http::withBasicAuth($this->shopId, $this->secretKey)
                ->retry(3, 100)
                ->withHeaders([
                    'Idempotence-Key' => $idempotenceKey,
                    'Content-Type'    => 'application/json',
                ])
                ->post($url, $data)
                ->throw();

            return $this->handleResponse($response);
        } catch (ConnectionException $e) {
            Log::error('YooKassa connection failed', [
                'error' => $e->getMessage(),
                'url'   => $url,
            ]);
            throw new RuntimeException('Не удалось подключиться к YooKassa');
        } catch (RequestException $e) {
            // Используем оператор объединения с null (??) для безопасного доступа к json()
            $error = $e->response?->json() ?? $e->getMessage(); 
            Log::critical('YooKassa API error', [
                'error' => $error,
            ]);
            throw new RuntimeException('Ошибка API YooKassa');
        }
    }

    /**
     * Проверка статуса платежа
     */
    public function getPaymentInfo(string $paymentId): array
    {
        $url = $this->apiUrl . '/payments/' . $paymentId;

        try {
            $response = Http::withBasicAuth($this->shopId, $this->secretKey)
                ->retry(3, 100)
                ->withHeaders([
                    'Content-Type' => 'application/json',
                ])
                ->get($url)
                ->throw();

            return $this->handleResponse($response);
        } catch (ConnectionException $e) {
            Log::error('YooKassa connection failed', [
                'payment_id' => $paymentId,
                'error'      => $e->getMessage(),
                'url'        => $url,
            ]);
            throw new RuntimeException('Не удалось подключиться к API YooKassa');
        } catch (RequestException $e) {
            $error = $e->response?->json() ?? $e->getMessage();
            Log::critical('YooKassa API error', [
                'payment_id' => $paymentId,
                'error'      => $error,
            ]);
            throw new RuntimeException('Ошибка API YooKassa');
        }
    }

    /**
     * Обработка ответа
     * 
     * @param Response $response Laravel HTTP Response object
     * @return array Decoded JSON response data
     */
    private function handleResponse(Response $response): array
    {
        // Поскольку вы используете ->throw() в вызывающих методах, 
        // сюда попадают ТОЛЬКО успешные ответы (status 2xx).
        // Дополнительная проверка $response->successful() избыточна, 
        // но безопасна.

        if ($response->successful()) {
            return $response->json();
        }
        
        // Эта часть кода не будет достигнута при использовании ->throw(), 
        // но остается как хороший запасной вариант:

        Log::error('YooKassa API Error (unhandled)', [
            'status' => $response->status(),
            'error'  => $response->json('description'),
        ]);

        throw new RuntimeException('Ошибка API YooKassa');
    }
}


21. Вантуз-мен 15.12.2025 / 20:39
Николай, guzzle прослойка curl, в зависимостях Laravel, требует протокол 1.2
Даже если как-то обойти эту проблему, то скорее всего на стороне юкассы будет ошибка
Одним словом обнови libcurl
Или повысь версию php, возможно там уже посвежее curl

22. Вантуз-мен 15.12.2025 / 20:58
Ошибка с tls скорее всего глубже, закомментируй try catch или посмотри в логах что там за ошибка
в storage/logs/laravel.log

23. Николай 18.12.2025 / 20:18
Вантуз-мен, Все спасибо исправил с помощью ИИ Google так же с ним еще добавил несколько вариантов платежей для сайта

24. Manerov 20.12.2025 / 18:12
Николай, он сам код напишет?

25. ramzes 22.12.2025 / 12:33
Manerov, если правильно попросишь то он тебе и скрипт и программу полноценную напишет

26. Николай 29.12.2025 / 18:21
Manerov, Да именно так. Ну у него есть лимит. попробуй Qwen Chat бесплатный и удобный. Создаешь проект и работаешь

URL: https://visavi.net/topics/44950