Как правильно реализовать оплату заказа?
Всем привет, есть сайт с вебинарами, пользователь добавляет их в корзину, в корзине вводит свои данные и нажимает оплатить, мы его регистрируем и после его перенаправляет на 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 (SymfonyComponentMailerExceptionTransportException $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 (GloudemansShoppingcartFacadesCart::instance(session()->getId())->content() as $item) { $webinarNames[] = $item->name; } $webinarsString = "Оплата вебинара - " . implode(', ', $webinarNames) . '.'; $data = [ 'version' => 3, 'public_key' => env('LIQPAY_PUBLIC_KEY'), 'action' => 'pay', 'amount' => GloudemansShoppingcartFacadesCart::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')); } |
#[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 (SymfonyComponentMailerExceptionTransportException $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 (GloudemansShoppingcartFacadesCart::instance(session()->getId())->content() as $item) { $webinarNames[] = $item->name; } $webinarsString = "Оплата вебинара - " . implode(', ', $webinarNames) . '.'; $data = [ 'version' => 3, 'public_key' => env('LIQPAY_PUBLIC_KEY'), 'action' => 'pay', 'amount' => GloudemansShoppingcartFacadesCart::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> |
<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>
Дополнительно:
Почему код имеющий отношение к оплате вебинара в функции render? У тебя там пользователь null.
Ответы:
У тебя должна быть таблица выставленных счетов.
Различные экваринги/мерчанты различаются между собой не принципиально.
Есть те, где сперва нужно инициализировать оплату (создать счет через апи), а потом отправить пользователя по ссылке его оплачивать. В этом случае ид_оплаты присваивает платежная система.
А есть, где сам передаешь все нужные данные через метод пост на сайт платежной системы. В этом случае практически у всех известных мне платежных систем, есть поле в котором можно передать свой идентификатор.
У всех систем есть метод проверить статус оплаты по идентификатору. Именно его
нужно дополнительно проверить при возврате пользователя по урлу успеха.
Не стоит верить параметрам из гет.
Авизо (подтверждение успешной оплаты может прилетать ассинзронно на ваш хук). В этом случае после проверки достоверности ставишь флаг оплачено в своей таблице заказов
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для правильной реализации оплаты заказа на вашем сайте, вам потребуется использовать соответствующий платежный шлюз или API платежной системы. В зависимости от вашего региона и предпочтений, можно выбрать такие платежные системы, как PayPal, Stripe, Square, 2Checkout, Braintree и многие другие.
Прежде всего, вам необходимо зарегистрироваться в выбранной платежной системе, получить API ключи и настроить их в вашем магазине. Для этого обычно требуется создать специальный аккаунт разработчика и зарегистрировать свое приложение.
Далее, вам нужно создать форму оплаты на вашем сайте, где пользователи будут вводить данные своей кредитной карты или использовать другие методы оплаты. Помните о безопасности и защите данных пользователей, используйте SSL сертификат для шифрования информации.
После того, как пользователь введет данные оплаты и нажмет кнопку "Оплатить", вы должны отправить запрос к API платежной системы для проведения транзакции. Обработайте ответ от платежной системы (успешно ли прошла оплата или возникли ошибки) и соответственно обновите статус заказа на вашем сайте.
Не забывайте также о возможности обработки ошибок и возврата средств в случае неудачной транзакции. При возникновении проблем, обращайтесь к документации выбранной платежной системы или к их службе поддержки.
Пример использования PHP для отправки запроса к API платежной системы:
// Отправляем запрос к API платежной системы $ch = curl_init('https://api.paymentprovider.com/charge'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'amount' => 100.00, 'currency' => 'USD', 'card_number' => '1234567812345678', 'expiry_month' => '12', 'expiry_year' => '2023', 'cvv' => '123' ])); $response = curl_exec($ch); curl_close($ch); // Обрабатываем ответ от платежной системы if ($response === false) { echo 'Ошибка при отправке запроса'; } else { $payment_result = json_decode($response, true); if ($payment_result['success']) { echo 'Оплата прошла успешно'; } else { echo 'Ошибка оплаты: ' . $payment_result['error_message']; } }
Надеюсь, данная информация поможет вам правильно реализовать оплату заказа на вашем сайте. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.