Django:无法读取付款网关发送的POST参数

问题描述 投票:0回答:1

处理付款后,我无法读取付款网关发送的POST参数。支付网关通过POST请求重定向到带有某些参数的returnUrl(我在处理支付之前将其传递给支付网关)。

在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'),

在settings.py中为

APPEND_SLASH = False

returnUrlhttp://127.0.0.1:8000/cashfreeresponse,那么我没有收到任何错误,但仍然没有收到任何参数。如何读取POST请求付款网关发送的那些参数? Here是付款网关的文档。

更新:

我尝试了APPEND_SLASH,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'

在这种情况下,我将得到以下错误

您通过POST调用了此URL,但该URL并非以斜杠结尾,并且已设置APPEND_SLASH。 Django在维护POST数据时无法重定向到斜杠URL。更改您的表单,使其指向127.0.0.1:8000/cashfreeresponse/(请注意后跟斜杠),或在Django设置中将APPEND_SLASH = False设置为。

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'

在这种情况下,我找不到页面错误。

python django post payment-gateway
1个回答
0
投票

APPEND_SLASH 不应很重要,因为它只会影响无法找到的URL,但是您正在明确指定URL模式而不加斜杠。因此,问题在于您的路径定义。

假设我们正在谈论项目级的主要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')

© www.soinside.com 2019 - 2024. All rights reserved.