Django: невозможно прочитать параметры POST, отправленные платежным шлюзом - PullRequest
0 голосов
/ 08 марта 2020

Я не могу прочитать параметры POST, отправленные платежным шлюзом после обработки платежа. Платежный шлюз перенаправляет на returnUrl (я передаю это платежному шлюзу до обработки платежа) с некоторыми параметрами по запросу POST.

В url.py

path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),

в views.py

@csrf_exempt
@login_required
def cashfree_response(request):
    print(request.method)
    if request.method == "POST":
        print('inside post method')
        print(request.POST.get('cf_subReferenceId'))
    if request.method == "GET":
        print('inside get method')
        print(request.GET.get('cf_subReferenceId'))

print(request.method) отображается как GET, но предполагается, что это POST метод также print(request.GET.get('cf_subReferenceId')) и print(request.POST.get('cf_subReferenceId')) отображаются как None.

Но это похоже на параметры отправки платежного шлюза как метод POST. Когда я передаю returnUrl как http://127.0.0.1:8000/cashfreeresponse вместо http://127.0.0.1:8000/cashfreeresponse/ ('/' отсутствует в первом), тогда я получаю ошибку как

You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/cashfreeresponse/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

, но я вижу на моей странице Google chrome, что параметры отправки платежного шлюза с запросом POST. На следующем рисунке показаны параметры, отправленные платежным шлюзом по запросу POST

enter image description here

Если в настройках изменить значение urls.py на

path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),

.py к

APPEND_SLASH = False

и returnUrl к http://127.0.0.1:8000/cashfreeresponse, тогда я не получаю никакой ошибки, но все еще не получаю никаких параметров. Как прочитать параметры, отправленные платежным шлюзом по запросу POST? Здесь - документация для платежного шлюза.

Обновление:

Я перепробовал все различные комбинации APPEND_SLA SH, urls.py и returnUrl , Это не сработало ни в коем случае. Ниже приведены типы проблем, которые я получил с каждой комбинацией.

APPEND_SLASH = True
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse/'

APPEND_SLASH = True
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse'

APPEND_SLASH = False
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse/'

APPEND_SLASH = False
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse'

Для всех вышеперечисленных комбинаций django перенаправляется как метод GET и данные POST были потеряны.

APPEND_SLASH = True
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse'

для в этом случае я получаю ошибку ниже

Вы назвали этот URL через POST, но URL не заканчивается на sla sh, и у вас установлено APPEND_SLA SH. Django не может перенаправить на URL sla sh при сохранении данных POST. Измените свою форму, указав 127.0.0.1:8000/cashfreeresponse/ (обратите внимание на завершающий sla sh), или установите APPEND_SLASH = False в настройках Django.

APPEND_SLASH = True
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse/'

APPEND_SLASH = False
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse/'

для этих обоих случаев, Я получаю ошибку проверки csrf.

APPEND_SLASH = False
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse'

для этого случая я получил страницу не найдена ошибка.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

@login_required декоратор вызывал проблему. Я думаю @login_required перенаправить страницу, чтобы увидеть, вошел ли пользователь в систему (даже если пользователь уже вошел в систему), а затем перенаправить обратно в это представление. Во время этого процесса он теряет данные POST и преобразует метод запроса в GET.

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

APPEND_SLASH не должно иметь значения , поскольку это влияет только на URL-адреса, которые не могут быть найдены, но вы явно указываете шаблон URL без sla sh. Таким образом, проблема связана с вашим определением пути.

Если предположить, что мы говорим о главном, уровне проекта urls.py, правильной настройкой будет:

path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
returnUrl = 'http://127.0.0.1:8000/cashfreeresponse'

Но я предполагаю, что Ваш путь с именем cashfree_response определен в приложении (например, polls/urls.py) и что он включен в подпуть на уровне проекта (например, mysite/urls), например:

path('polls/', include('polls.urls')),

В этом В этом случае правильный returnUrl будет http://127.0.0.1:8000/polls/cashfreeresponse.

Вместо жесткого кодирования URL, вы можете использовать reverse вместе с запросом.

from django.urls import reverse
request.build_absolute_uri(reverse('cashfreeresponse')

Примечание: вы можете здесь нужно использовать reverse('<appname>:cashfreeresponse'), например, reverse('polls:cashfreeresponse')

Редактировать: из вашего обновления, похоже, у вас все еще есть конечный sla sh в определении пути:

    path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),

Измените это на

    path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
...