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

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'

对于这种情况,我遇到了找不到页面的错误。

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。