处理付款后,我无法读取付款网关发送的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请求发送的参数
如果我将urls.py更改为
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
在settings.py中为
APPEND_SLASH = False
和returnUrl
至http://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'
在这种情况下,我找不到页面错误。
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')