Django:无法读取支付网关发送的 POST 参数
Django: unable to read POST parameters sent by payment gateway
我无法读取处理付款后支付网关发送的 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
。
您可以将 reverse
与请求一起使用,而不是对 URL 进行硬编码。
from django.urls import reverse
request.build_absolute_uri(reverse('cashfreeresponse')
注意:您可能必须在此处使用 reverse('<appname>:cashfreeresponse')
,例如reverse('polls:cashfreeresponse')
编辑: 从你的更新来看,路径定义中似乎还有一个尾部斜线:
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
将其更改为:
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
@login_required
装饰器导致了这个问题。我认为 @login_required
重定向页面以查看用户是否登录(即使用户已经登录)然后重定向回该视图。在此过程中,它正在丢失 POST 数据并将请求方法转换为 GET。
我无法读取处理付款后支付网关发送的 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
。
您可以将 reverse
与请求一起使用,而不是对 URL 进行硬编码。
from django.urls import reverse
request.build_absolute_uri(reverse('cashfreeresponse')
注意:您可能必须在此处使用 reverse('<appname>:cashfreeresponse')
,例如reverse('polls:cashfreeresponse')
编辑: 从你的更新来看,路径定义中似乎还有一个尾部斜线:
path('cashfreeresponse/',views.cashfree_response, name='cashfree_response'),
将其更改为:
path('cashfreeresponse',views.cashfree_response, name='cashfree_response'),
@login_required
装饰器导致了这个问题。我认为 @login_required
重定向页面以查看用户是否登录(即使用户已经登录)然后重定向回该视图。在此过程中,它正在丢失 POST 数据并将请求方法转换为 GET。