Запрещенная (403) ошибка при вызове URL обратного вызова в django - PullRequest
2 голосов
/ 08 марта 2020

Я работаю над django веб-приложением. Я подключил платежный шлюз paytm к приложению django. Я сделал все в соответствии с документами, и все работает. почти.

У меня возникла проблема при вызове URL-адреса обратного вызова после завершения платежа.

Вот код

views.py

def donate(request):
    if request.method == "POST":
        form = DonateForm(request.POST)

        name = request.POST.get('firstName')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        amount = float("{0:.2f}".format(int(request.POST.get('amount'))))
        ord_id = OrdID()
        cust_id = CustID()

        paytm_params = {
            "MID" : MERCHANTID,
            "WEBSITE" : "WEBSTAGING",
            "INDUSTRY_TYPE_ID" : "Retail",
            "CHANNEL_ID" : "WEB",
            "ORDER_ID" : ord_id,
            "CUST_ID" : cust_id,
            "MOBILE_NO" : phone,
            "EMAIL" : email,
            "TXN_AMOUNT" : str(amount),
            "CALLBACK_URL" : "http://127.0.0.1:8000/handlerequest/",

            }

        paytm_params['CHECKSUMHASH'] = Checksum.generate_checksum(paytm_params, MERCHANTKEY)

        return render(request, 'paytm.html', {'paytm_params': paytm_params})

    else:
        form = DonateForm()
        context = {'Donate': form}
        return render(request, 'donate.html', context=context)

@csrf_exempt
def handlerequest(request):
    form = request.POST
    response_dict = {}

    for i in form.keys():
        response_dict[i] = form[i]

        if i == 'CHECKSUMHASH':
            checksum = form[i]

    verify = Checksum.verify_checksum(response_dict, MERCHANTKEY, checksum)

    if verify:
        if response_dict['RESPCODE'] == '01':
            print('order successful')
        else:
            print('error: ' + response_dict['RESPMSG'])

    return render(request, 'paymentstatus.html', {'response_dict': response_dict})

urls.py

path('donate', views.donate, name='donate'),
path('handlerequest', views.handlerequest, name='handlerequest'),

пожертвовать. html

<form class="test_paytm" action="{% url 'donate' %}" method="post">
    {% csrf_token %}
    <div class="row">
        <div class="col">
            {{ Donate.firstName|as_crispy_field }}
        </div>
        <div class="col">
            {{ Donate.lastName|as_crispy_field }}
        </div>
    </div>
    <div class="row">
        <div class="col">
            {{ Donate.email|as_crispy_field }}
        </div>
        <div class="col">
            {{ Donate.phone|as_crispy_field }}
        </div>
    </div>
    <div class="row">
        <div class="col">
            {{ Donate.amount|as_crispy_field }}
        </div>
    </div>
    <button type="submit" name="button" class="btn btn-lg mb-5 contact_submit">Donate</button>
</form>

paytm. html

<html>

<head>
  <title>Merchant Check Out Page</title>
</head>

<body>
  <center>
    <h1>Please do not refresh this page...</h1>
  </center>
  <form method="post" action="https://securegw.paytm.in/order/process" name="paytm">
    {% for key, value in paytm_params.items %}
    <input type="hidden" name="{{key}}" value="{{value}}">
    {% endfor %}
  </form>
</body>
<script type="text/javascript">
  document.paytm.submit()

</script>

</html>

paymenttatus. html

<div class="container">
  {% if response_dict.RESPCODE == 01 %}
  <center>
    <h2>Thank you for your donation</h2>
    <p>
      We are thrilled to have your support. Through your donation we will be able to accomplish our goal. You truly make the difference for us, and we are
      extremely grateful!
    </p>
  </center>

  <h3>Order ID: {{response_dict.ORDERID}}</h3>
  <h3>Order Date: {{response_dict.TXNDATE}}</h3>
  <h3>Amount: {{response_dict.TXNAMOUNT}}</h3>
  <h3>Payment Mode: {{response_dict.PAYMENTMODE}}</h3>

  {% else %}
  <center>
    <p>
      There seems to be a problem. We will try to fix this from our end.
    </p>
  </center>
  {% endif %}
</div>

Но как только платеж завершен, веб-сайт неправильно набирает handlerequest с views.py. Вот почему я добавил @csrf_exempt, чтобы внешняя страница могла без проблем вызывать URL. Но я все еще получаю ошибку 403. Я не уверен, что я делаю неправильно

EDIT1

Я добавил код paytm.html к вопросу. Я лично не чувствую, что проблема с этой страницей, так как все, что делает эта страница - это перенаправление на страницу шлюза платежей в paytm. Проблема, с которой я сталкиваюсь, заключается в том, чтобы вернуться к моему URL ie. paymentstatus.html. Это через представление handlerequest. Процесс пожертвования выглядит следующим образом:

  1. пользователь заполняет форму в donate.html и нажимает кнопку пожертвования.
  2. paytm.html получает информацию и автоматически перенаправляет на платежный шлюз paytm
  3. Пользователь делает пожертвование.
  4. URL-адрес перенаправляется обратно с платежного шлюза paytm на мой URL-адрес.
  5. Отображается страница paymentstatus.html.

Поскольку страница paymentstatus.html вызывается из внешнего URL-адреса, требуется csrf_exempt, который я предоставил. Но по какой-то причине это не работает

EDIT2

Я пытался использовать django-cors-headers. Я отредактировал свой setting.py, как указано в этом учебном пособии

settings.py

INSTALLED_APPS = [
    ...
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ORIGIN_ALLOW_ALL = False

CORS_ORIGIN_WHITELIST = (
    'https://securegw.paytm.in/order/process',
)

[ПРИМЕЧАНИЕ]: вышеуказанный URL-адрес доступен в платеже Docs.

Теперь, когда оплата завершена, я получаю The connection was reset сообщение об ошибке.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Но как только платеж завершен, веб-сайт не вызывает корректный запрос handlerequies от views.py. Вот почему я добавил @csrf_exempt, чтобы внешняя страница могла без проблем вызывать URL. Но я все еще получаю ошибку 403. Я не уверен, что я делаю неправильно

Это ошибка 403 с вашего сервера? Или вы просто видите 403 в браузере ...?

Я не верю, что Paytm может получить доступ к вашему серверу, когда ваш URL обратного вызова http://127.0.0.1:8000. Чтобы Paytm получил доступ к вашему серверу, вы должны указать свой IPL-адрес publi c в URL обратного вызова, а затем настроить маршрутизатор на открытие порта 8000 и затем перенаправить все запросы с порта 8000 на ваш компьютер. Но так как вы не упомянули, что сделали это, я думаю, вы этого не сделали.

0 голосов
/ 19 марта 2020

Я думаю, что вы должны перенаправлять, а не отображать этот запрос в виде доната. Я не думаю, что ваш взгляд на ручку запроса даже тронут. Вот что я вижу в виде доната:

return render(request, 'paytm.html', {'paytm_params': paytm_params})

В вашем шаблоне для сбора платежей. html, у вас есть:

{% if response_dict.RESPCODE == 01 %}

Но вы передали контекст paytm_params, а не response_dict. ЕСЛИ вы никогда не показывали мне, что такое paytm.html.

Редактировать:

Спасибо за добавление Paytm. html. Есть пара вещей, которые вы должны попытаться сделать.

  1. Убедитесь, что ваш браузер не блокирует куки. Некоторые люди блокируют куки, и это портит ваш браузер.
  2. Добавьте тег {% csrf_token %} вверху формы. Маркер CSRF важен, потому что он распространяется везде, независимо от страницы.
  3. Попробуйте удалить csrf_exempt из вида.
  4. Измените имя вашего токена csrf в settings.py на другое, например csrftokenasdfasdfasdf
  5. Есть еще одна вещь, называемая corsheader. Я считаю, что их пакет называется django -cors-headers, и они имеют средний износ, который вы можете использовать, так как вы выполняете кучу прыжков назад и вперед между представлениями.
...