@Invest00

Как отправить форму со скрытыми полями Django, значения в которых должны вычислятся на основе не скрытых полей?

Задача - реализовать платежную форму для оплаты в модуль банке. Сделать нужно на чистом Django. Регистрации не предусмотрено, те пользователь заходит на сайт вводит сумму, назначение и почту. В апи банка следующее описание:
"Данный метод предназначен для создания запроса на оплату. В случае корректного составления запроса, откроется платёжная форма для плательщика.
Формат запроса
POST — https://pay.modulbank.ru/pay
Для проведения платежа необходимо отправить POST-запросом форму со следующими полями:
"

И пример такой формы от них же:
<form method="post" action="https://pay.modulbank.ru/pay">
<input type="hidden" name="testing" value="1">
<input type="hidden" name="salt" value="dPUTLtbMfcTGzkaBnGtseKlcQymCLrYI">
<input type="hidden" name="order_id" value="14425840">
<input type="hidden" name="amount" value="973">
<input type="hidden" name="merchant" value="ad25ef06-1824-413f-8ef1-c08115b9b979">
<input type="hidden" name="signature" value="9b28fa592922dc8a0c1ba2e40f2c0432aa617afd">
<input type="hidden" name="description" value="Заказ №14425840">
<input type="hidden" name="client_phone" value="+7 912 9876543">
<input type="hidden" name="client_email" value="test@test.ru">
<input type="hidden" name="success_url" value="http://myawesomesite.com/payment_success">
<input type="hidden" name="receipt_contact" value="test@mail.com">
<input type="hidden" name="unix_timestamp" value="1573451160">
<input type="hidden" name="receipt_items"
value="[{&quot;discount_sum&quot;: 40, &quot;name&quot;: &quot;Товар 1&quot;, &quot;payment_method&quot;: &quot;full_prepayment&quot;,
&quot;payment_object&quot;: &quot;commodity&quot;, &quot;price&quot;: 48, &quot;quantity&quot;: 10, &quot;sno&quot;: &quot;osn&quot;, &quot;vat&quot;: &quot;vat10&quot;},
{&quot;name&quot;: &quot;Товар 2&quot;, &quot;payment_method&quot;: &quot;full_prepayment&quot;,
&quot;payment_object&quot;: &quot;commodity&quot;, &quot;price&quot;: 533, &quot;quantity&quot;: 1, &quot;sno&quot;: &quot;osn&quot;, &quot;vat&quot;: &quot;vat10&quot;}]">
<input type="submit" value="Отправить платеж">
</form>

Для отправки формы требуется предварительно вычислить поле signature которое вычисляется на основе введенных данных.
Если принять post запрос на свой сервис, вычислить/валидировать все необходимые поля и отправить post запрос на API банка, то не происходит редирект на сайт банка.

Собственно вопрос в том как реализовать отправку такой формы, чтобы заказчик именно перенаправлялся на сайт банка?

Возможно я не в ту сторону думаю?
  • Вопрос задан
  • 58 просмотров
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Веб-разработка
Возможно я не в ту сторону думаю?
Определённо.
Этот запрос должен отправлять ваш сервер, а не браузер клиента.
Соответственно, вы делаете "упрощённую" форму, которую клиент заполняет и сабмитит на ваш сервер. А вы уже в обработчике отправляете "полный" запрос к эквайеру.
В ответ банк (не знаю конкретно про Модуль, но это верно про 100% эквайеров, с которыми я интегрировался) вам присылает как раз URL для редиректа и вы этот редирект должны произвести.
Ответ написан
grantur5707
@grantur5707
Full Stack Web Developer
Как минимум не нужно предварительно отправлять 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>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы