Как создать платежную форму для оплаты через модуль банка, используя чистый Django? В процессе реализации не предусмотрена система регистрации пользователей. Пользователь просто заходит на сайт, вводит сумму, назначение и адрес электронной почты. В документации API банка указано, что необходимо отправить POST-запрос на <a href="https://pay.modulbank.ru/pay" rel="nofollow">https://pay.modulbank.ru/pay</a> с определенными параметрами. Можете ли вы предоставить пример необходимой формы и какие поля должны быть включены в запрос?
Для создания платежной формы в Django с использованием скрытых полей, вам нужно будет настроить форму и представление (view). Ниже приведены шаги, которые помогут вам создать такую форму и отправить POST-запрос на указанный адрес. ### Шаг 1: Настройка формы Создайте файл `forms.py` в вашем приложении и определите там форму. В форме будут два видимых поля для ввода суммы и назначения, а также скрытые поля, значения которых будут рассчитываться на основе введенных данных. ```python from django import forms class PaymentForm(forms.Form): amount = forms.DecimalField(label='Сумма', max_digits=10, decimal_places=2) purpose = forms.CharField(label='Назначение', max_length=255) email = forms.EmailField(label='Электронная почта') # Скрытые поля merchant_id = forms.CharField(widget=forms.HiddenInput(), initial="your_merchant_id") transaction_id = forms.CharField(widget=forms.HiddenInput()) # Это может быть сгенерированный ID транзакции ``` ### Шаг 2: Создание представления Создайте представление, которое будет обрабатывать форму и перенаправлять данные на API банка. ```python from django.shortcuts import render, redirect from .forms import PaymentForm import uuid # Для генерации уникального идентификатора транзакции def payment_view(request): if request.method == 'POST': form = PaymentForm(request.POST) if form.is_valid(): # Генерация уникального ID транзакции form.cleaned_data['transaction_id'] = str(uuid.uuid4()) return render(request, 'payment_redirect.html', {'form': form}) else: form = PaymentForm() return render(request, 'payment.html', {'form': form}) ``` ### Шаг 3: Создание шаблонов Создайте два шаблона: `payment.html` для отображения формы и `payment_redirect.html` для отправки данных на API банка. **payment.html** ```html <form method="post" action="{% url 'payment_view' %}"> {% csrf_token %} {{ form.as_p }} <button type="submit">Оплатить</button> </form> ``` **payment_redirect.html** ```html <form id="payment-form" method="POST" action="https://pay.modulbank.ru/pay"> {% csrf_token %} <input type="hidden" name="amount" value="{{ form.cleaned_data.amount }}"> <input type="hidden" name="purpose" value="{{ form.cleaned_data.purpose }}"> <input type="hidden" name="email" value="{{ form.cleaned_data.email }}"> <input type="hidden" name="merchant_id" value="{{ form.cleaned_data.merchant_id }}"> <input type="hidden" name="transaction_id" value="{{ form.cleaned_data.transaction_id }}"> </form> <script type="text/javascript"> document.getElementById('payment-form').submit(); </script> ``` ### Шаг 4: Настройка URL Не забудьте добавить URL для вашего представления в `urls.py`. ```python from django.urls import path from .views import payment_view urlpatterns = [ path('payment/', payment_view, name='payment_view'), ] ``` ### Примечания 1. Замените `your_merchant_id` на ваш настоящий идентификатор мерчанта. 2. Убедитесь, что в `settings.py` разрешены обработчики CSRF, если используете CSRF-токены. 3. Добавьте необходимую обработку ошибок и валидацию в вашу форму. 4. Вам возможно потребуется добавить другие параметры в POST-запрос, в зависимости от требований API банка. Убедитесь, что вы изучили документацию вашего банка для подтверждения всех необходимых полей. Теперь у вас есть база для создания платежной формы и обработки данных с использованием Django!
Возможно я не в ту сторону думаю?Определённо.
Этот запрос должен отправлять ваш сервер, а не браузер клиента.
Соответственно, вы делаете "упрощённую" форму, которую клиент заполняет и сабмитит на ваш сервер. А вы уже в обработчике отправляете "полный" запрос к эквайеру.
В ответ банк (не знаю конкретно про Модуль, но это верно про 100% эквайеров, с которыми я интегрировался) вам присылает как раз URL для редиректа и вы этот редирект должны произвести.
Как минимум не нужно предварительно отправлять POST-запрос на ваш сервер перед перенаправлением на платёжную страницу Modulbank. Вместо этого вычисления полей, таких как signature, могут происходить на вашем сервере, но сама форма должна отправляться непосредственно на сайт банка.
from django.shortcuts import render from django.http import JsonResponse import hashlib import time def calculate_signature(data, secret_key): values = f"{data['amount']}{data['client_email']}{secret_key}" signature = hashlib.sha1(values.encode()).hexdigest() return signature def payment_view(request): if request.method == 'POST': amount = request.POST.get('amount') client_email = request.POST.get('client_email') order_id = 14425840 secret_key = 'your_secret_key' signature = calculate_signature({ 'amount': amount, 'client_email': client_email }, secret_key) context = { 'amount': amount, 'client_email': client_email, 'order_id': order_id, 'signature': signature, 'merchant': 'ad25ef06-1824-413f-8ef1-c08115b9b979', 'success_url': 'http://yoursite.com/success' } return render(request, 'payment_form.html', context) return render(request, 'payment_page.html')
<form method="post" action="https://pay.modulbank.ru/pay"> <input type="hidden" name="amount" value="{{ amount }}"> <input type="hidden" name="order_id" value="{{ order_id }}"> <input type="hidden" name="signature" value="{{ signature }}"> <input type="hidden" name="client_email" value="{{ client_email }}"> <input type="hidden" name="merchant" value="{{ merchant }}"> <input type="hidden" name="success_url" value="{{ success_url }}"> <input type="submit" value="Оплатить"> </form>