@Andre548

Как правильно реализовать оплату заказа?

Всем привет, есть сайт с вебинарами, пользователь добавляет их в корзину, в корзине вводит свои данные и нажимает оплатить, мы его регистрируем и после его перенаправляет на liqpay для оплаты, после оплаты мне приходит ответ, и здесь мне нужно определить от какого пользователя положительный ответ об оплате.

использую livewire, пытался в форме liqpay передавать ид пользователя, но всегда передается нулл

#[On('formOrder')]
    public function store($formData)
    {
        $this->name = $formData['name'];
        $this->phone = $formData['phone'];
        $this->email = $formData['email'];
        $this->surname = $formData['surname'];


        // Валидация входных данных
        $this->validate([
            'name' => 'required|string',
            'phone' => 'required|string',
            'email' => 'required|string',
            'surname' => 'required|string',
        ]);
        // Предположим, что $this->email уже заполнен
        $this->user = User::where('email', $this->email)->first();

        if (!$this->user) {
            // Пользователь не найден, создаем нового
            $this->user = User::create([
                'name' => $this->name,
                'surname' => $this->surname,
                'phone' => $this->phone,
                'email' => $this->email,
                'password' => Hash::make('vYjDsM7kkZ'), // Установите безопасный пароль
            ]);
            try {
                event(new SendRegisterEmailUser($this->user, 'vYjDsM7kkZ'));
            } catch (\Symfony\Component\Mailer\Exception\TransportException $e) {
                Log::error("Ошибка отправки почты: " . $e->getMessage());
            }

        } else {
            // Пользователь найден, проверяем наличие фамилии и телефона

            if (!$this->user->surname) {
                $this->user->surname = $this->surname;
            }
            if (!$this->user->phone) {
                $this->user->phone = $this->phone;
            }
            $this->user->save();
        }
        $this->dispatch('cartUpdated');
        $this->dispatch('redirectToPayment');
        
    }


    public function render()
    {
        $webinarNames = [];

        foreach (\Gloudemans\Shoppingcart\Facades\Cart::instance(session()->getId())->content() as $item) {
            $webinarNames[] = $item->name;
        }

        $webinarsString = "Оплата вебинара - " . implode(', ', $webinarNames) . '.';

        $data = [
            'version'       => 3,
            'public_key'    => env('LIQPAY_PUBLIC_KEY'),
            'action'        => 'pay',
            'amount'        => \Gloudemans\Shoppingcart\Facades\Cart::instance(session()->getId())->subtotal(),
            'currency'      => 'UAH',
            'description'   => $webinarsString,
            'order_id' => session()->getId() . '__user_id=' . ($this->user ? $this->user->id : null) . '__' . date('YmdHis'),
            'result_url'     => 'https://stomatwebinar.com/',
            'server_url'     => 'https://stomatwebinar.com/api/getdata'
        ];

        $dataEncoded = base64_encode(json_encode($data));
        $signature = base64_encode(sha1(env('LIQPAY_PRIVATE_KEY') . $dataEncoded . env('LIQPAY_PRIVATE_KEY'), true));

        return view('livewire.components.cart', compact('dataEncoded', 'signature'));
    }


<div class="modal-body">
                    <!-- Form for order -->
                    <form class="order-form" action="https://www.liqpay.ua/api/3/checkout">
                        <input type="hidden" name="data" value="{{$dataEncoded}}"/>
                        <input type="hidden" name="signature" value="{{$signature}}"/>
                        <div class="mb-4">
                            <!-- Input for customer name -->
                            <input placeholder="Ваше імя" type="text" class="form-control" id="name" name="name" required>
                        </div>
                        <div class="mb-4">
                            <!-- Input for customer name -->
                            <input placeholder="Ваше прiзвище" type="text" class="form-control" id="surname" name="name" required>
                        </div>
                        <div class="mb-4">
                            <!-- Input for customer email -->
                            <input placeholder="Ваша пошта" type="email" class="form-control" id="email" name="email" required>
                        </div>
                        <div class="mb-4">
                            <!-- Input for customer phone -->
                            <input placeholder="Ваш телефон" type="tel" class="form-control" id="phone" name="phone" required>
                        </div>
                        <!-- Add more product details if needed -->
                        <button type="submit" class="btn btn-success">Замовити</button>

                        <div class="form-check mt-2">
                            <input type="checkbox" class="form-check-input" id="termsCheckbox" required>
                            <label class="form-check-label" for="termsCheckbox">Підтверджую, що Я уважно ознайомився(лася) з даною інструкцією з накладеними на ній правилами вебінару - *обов'язкове поле
                            </label>
                        </div>
                    </form>
                </div>
<script>
    document.addEventListener('livewire:init', () => {
        Livewire.on('cartUpdated', (event) => {
            window.initPhoneMasks();
        });
        const form = document.querySelector('.order-form');
        form.addEventListener('submit', function (event) {
            event.preventDefault();

            // Сбор данных из формы
            const formData = {
                name: form.querySelector('#name').value,
                surname: form.querySelector('#surname').value,
                phone: form.querySelector('#phone').value,
                email: form.querySelector('#email').value,
            };

            // Отправка данных через Livewire
        @this.dispatch('formOrder', { formData: formData });

        });

        Livewire.on('redirectToPayment', () => {
            form.submit(); // Исправлено для вызова как функции
        });
    })
</script>
  • Вопрос задан
  • 330 просмотров
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
У тебя должна быть таблица выставленных счетов.
Различные экваринги/мерчанты различаются между собой не принципиально.
Есть те, где сперва нужно инициализировать оплату (создать счет через апи), а потом отправить пользователя по ссылке его оплачивать. В этом случае ид_оплаты присваивает платежная система.
А есть, где сам передаешь все нужные данные через метод пост на сайт платежной системы. В этом случае практически у всех известных мне платежных систем, есть поле в котором можно передать свой идентификатор.

У всех систем есть метод проверить статус оплаты по идентификатору. Именно его
нужно дополнительно проверить при возврате пользователя по урлу успеха.
Не стоит верить параметрам из гет.

Авизо (подтверждение успешной оплаты может прилетать ассинзронно на ваш хук). В этом случае после проверки достоверности ставишь флаг оплачено в своей таблице заказов
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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