禁止(未设置 CSRF cookie。):/paypal/ |姜戈
Forbidden (CSRF cookie not set.): /paypal/ | Django
我遇到了django-paypal的问题,问题出现在支付成功后收到paypal IPN的那一刻。
错误:
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:04] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:19] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:42] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:54:24] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:55:45] "POST /paypal/ HTTP/1.1" 403 2896
我不知道发生了什么,我开始调查错误,但我没有取得多大成就,调查我把文件 settings.py
CSRF_COOKIE_SECURE
作为 True
,即使那样它也不起作用,有什么解决办法吗?
这是付款代码:
def process_payment(request, pk):
course = get_object_or_404(Course, pk = pk)
host = request.get_host()
paypal_dict = {
'business': settings.PAYPAL_RECEIVER_EMAIL,
'item_name': course.title,
'amount': course.price,
'currency_code': 'USD',
'notify_url': 'http://{}{}'.format(host, reverse('paypal-ipn')),
'return_url': 'http://{}{}'.format(host, reverse('course:list')),
'cancel_return': 'http://{}{}'.format(host, reverse('payment_cancelled')),
}
form = PayPalPaymentsForm(initial = paypal_dict)
return render(request, 'carts/process_payment.html', {'form': form, 'course': course})
更新
报错的视图不是我做的,来自django-paypal,负责管理paypal IPN,视图名称为ipn
。视图如下:
https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/views.py
该视图是 notify_url
。
有关更多信息,这是我正在做的指南:https://overiq.com/django-paypal-integration-with-django-paypal/
这些是我申请的urls.py:
urlpatterns = [
path('cart/', CartDetailView.as_view(), name = 'cart'),
path('cart-add/', views.add_course, name = 'add_course'),
path('process-payment/<int:pk>/', views.process_payment, name='process_payment'),
path('payment-cancelled/', views.payment_canceled, name='payment_cancelled'),
]
这些是 django-paypal
ipn
应用程序的 urls.py
urlpatterns = [
url(r'^$', views.ipn, name="paypal-ipn"),
]
这将是我的 urlconf:
urlpatterns = [
path('django-admin/', admin.site.urls),
# Paths of My Apps
path('admin/', include(administration_patterns)),
path('', include('core.urls')),
path('', include('carts.urls')),
path('', include(course_patterns)),
path('paypal/', include('paypal.standard.ipn.urls')),
# Paths of Auth
path('accounts/', include('django.contrib.auth.urls')),
path('accounts/', include('registration.urls')),
]
只需在呈现表单的模板上添加 csrf token。
<form method="POST" action="/"> {% csrf_token %}
{{ form }}
</form>
更新
您需要使正在处理 /paypal/
csrf 的视图免除。我假设视图是 paypal 在付款后尝试将用户重定向到的地方:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def paypal_view(req):
...
更新 2
试试这个:
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
url(r'^$', csrf_exempt(views.ipn), name="paypal-ipn"),
]
尝试将 Paypal URL 模式移动到顶部以确保请求实际路由到 django-paypal
:
urlpatterns = [
path('django-admin/', admin.site.urls),
# Paths of My Apps
path('paypal/', include('paypal.standard.ipn.urls')),
path('admin/', include(administration_patterns)),
path('', include('core.urls')),
path('', include('carts.urls')),
path('', include(course_patterns)),
# Paths of Auth
path('accounts/', include('django.contrib.auth.urls')),
path('accounts/', include('registration.urls')),
]
为什么会看到这个错误?
然后请求被路由到视图,这不是 csrf_exempt
,因此 CSRF 中间件需要一个 CSRF cookie。
由于请求是从 Paypal 服务器发送的,它不包含 CSRF cookie,因此您收到错误 Forbidden (CSRF cookie not set.)
为什么请求路由到错误的视图?
模式以深度优先的方式匹配,这意味着 Django 在尝试匹配 path('paypal/', include('paypal.standard.ipn.urls'))
[之前首先尝试 'core.urls'
、'carts.urls'
和 course_patterns
中包含的所有模式=23=]
其中一个包含的 URL 模式匹配路径 /paypal/
,可能类似于 course_patterns
.
中的 path('<slug>/', course_view)
在 urlpatterns
列表中向上移动 path('paypal/', include('paypal.standard.ipn.urls')),
确保 Django 首先尝试匹配它。
我遇到了django-paypal的问题,问题出现在支付成功后收到paypal IPN的那一刻。
错误:
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:04] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:19] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:42] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:54:24] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:55:45] "POST /paypal/ HTTP/1.1" 403 2896
我不知道发生了什么,我开始调查错误,但我没有取得多大成就,调查我把文件 settings.py
CSRF_COOKIE_SECURE
作为 True
,即使那样它也不起作用,有什么解决办法吗?
这是付款代码:
def process_payment(request, pk):
course = get_object_or_404(Course, pk = pk)
host = request.get_host()
paypal_dict = {
'business': settings.PAYPAL_RECEIVER_EMAIL,
'item_name': course.title,
'amount': course.price,
'currency_code': 'USD',
'notify_url': 'http://{}{}'.format(host, reverse('paypal-ipn')),
'return_url': 'http://{}{}'.format(host, reverse('course:list')),
'cancel_return': 'http://{}{}'.format(host, reverse('payment_cancelled')),
}
form = PayPalPaymentsForm(initial = paypal_dict)
return render(request, 'carts/process_payment.html', {'form': form, 'course': course})
更新
报错的视图不是我做的,来自django-paypal,负责管理paypal IPN,视图名称为ipn
。视图如下:
https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/views.py
该视图是 notify_url
。
有关更多信息,这是我正在做的指南:https://overiq.com/django-paypal-integration-with-django-paypal/
这些是我申请的urls.py:
urlpatterns = [
path('cart/', CartDetailView.as_view(), name = 'cart'),
path('cart-add/', views.add_course, name = 'add_course'),
path('process-payment/<int:pk>/', views.process_payment, name='process_payment'),
path('payment-cancelled/', views.payment_canceled, name='payment_cancelled'),
]
这些是 django-paypal
ipn
应用程序的 urls.py
urlpatterns = [
url(r'^$', views.ipn, name="paypal-ipn"),
]
这将是我的 urlconf:
urlpatterns = [
path('django-admin/', admin.site.urls),
# Paths of My Apps
path('admin/', include(administration_patterns)),
path('', include('core.urls')),
path('', include('carts.urls')),
path('', include(course_patterns)),
path('paypal/', include('paypal.standard.ipn.urls')),
# Paths of Auth
path('accounts/', include('django.contrib.auth.urls')),
path('accounts/', include('registration.urls')),
]
只需在呈现表单的模板上添加 csrf token。
<form method="POST" action="/"> {% csrf_token %}
{{ form }}
</form>
更新
您需要使正在处理 /paypal/
csrf 的视图免除。我假设视图是 paypal 在付款后尝试将用户重定向到的地方:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def paypal_view(req):
...
更新 2
试试这个:
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
url(r'^$', csrf_exempt(views.ipn), name="paypal-ipn"),
]
尝试将 Paypal URL 模式移动到顶部以确保请求实际路由到 django-paypal
:
urlpatterns = [
path('django-admin/', admin.site.urls),
# Paths of My Apps
path('paypal/', include('paypal.standard.ipn.urls')),
path('admin/', include(administration_patterns)),
path('', include('core.urls')),
path('', include('carts.urls')),
path('', include(course_patterns)),
# Paths of Auth
path('accounts/', include('django.contrib.auth.urls')),
path('accounts/', include('registration.urls')),
]
为什么会看到这个错误?
然后请求被路由到视图,这不是 csrf_exempt
,因此 CSRF 中间件需要一个 CSRF cookie。
由于请求是从 Paypal 服务器发送的,它不包含 CSRF cookie,因此您收到错误 Forbidden (CSRF cookie not set.)
为什么请求路由到错误的视图?
模式以深度优先的方式匹配,这意味着 Django 在尝试匹配 path('paypal/', include('paypal.standard.ipn.urls'))
[之前首先尝试 'core.urls'
、'carts.urls'
和 course_patterns
中包含的所有模式=23=]
其中一个包含的 URL 模式匹配路径 /paypal/
,可能类似于 course_patterns
.
path('<slug>/', course_view)
在 urlpatterns
列表中向上移动 path('paypal/', include('paypal.standard.ipn.urls')),
确保 Django 首先尝试匹配它。