Paypal call back give me 403 error: csrf token missing or incorrect on django app
Paypal call back give me 403 error: csrf token missing or incorrect on django app
我正在为 django 项目实施 paypal。接收到我的 notify_url 的消息工作正常。但是:当 paypal 试图返回我提供的 return_url 时,django 总是说 csrf-error 并且页面无法显示:
403 error: csrf token missing or incorrect
return_url 指向我的起始页。任何想法有什么问题以及为什么会抛出此错误?
非常感谢您的帮助!
医管局
编辑
views.py
@csrf_exempt
def view_back(request):
return render_to_response("csrf.html",
{"csrftest":"here I am!" },
context_instance=RequestContext(request))
urls.py
url(r'csrf$', 'view_back', name='view_back')
csrf.html
<{% extends 'base.html' %}
<!DOCTYPE html>
{% block content %}
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body><h1>My Test</h1>
<!-- writes out the form tag automatically -->
{{ csrftest }}
</body>
</html>
{% endblock %}
编辑2
urlpatterns = patterns('my_project.views',
url(r'^$', 'calculation', name='calculation'),
url(r'money$', 'view_that_asks_for_money', name='view_that_asks_for_money'),
url(r'csrf$', 'view_back', name='view_back'),
)
我想您正在使用 django-paypal
库,但即使您不是,库文档中的这条注释也解释了一切:
Note that return_url view needs @csrf_exempt applied to it, because
PayPal will POST to it, so it should be custom a view that doesn’t
need to handle POSTs otherwise.
因此,在将 @csrf_exempt
[see the docs] 添加到视图时请小心,出于明显的安全原因,请确保此页面仅用于此目的,而不用于其他 POST。
下面是一个如何将 CSRF 与 paypal 一起传递到 django 后端的示例。
支付:函数(){
return new paypal.Promise(function (resolve, reject) {
$.ajax({
method: 'post',
url: '{% url 'payment_comms' %}',
data: {
what: 'create_payment',
amount: $("#amount").val(),
},
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
success: function (data) {
resolve(data.paymentID);
},
error: function (data) {
reject(data)
}
})
})
},
我对这个问题的回答略有不同,因为我试图弄清楚如何使用 Express Checkout/Server 集成来做到这一点,答案如下:
paypal.Button.render({
env: 'sandbox',
client: {
sandbox: 'sandbox-client-id',
production: 'live-client-id'
},
payment: function(data, actions) {
return actions.request({
method: "post",
url: '/your/django/payment/route/',
headers: {
'X-CSRFToken': "{{ csrf_token }}"
},
json: {
key: value,
}
})
.then(function(response) {
return response.id;
});
},
onAuthorize: function(data, actions) {
return actions.request({
method: "post",
url: '/your/django/execution/route/',
headers: {
'X-CSRFToken': "{{ csrf_token }}"
},
json: {
payment_id: data.paymentID,
payer_id: data.payerID,
key: value,
}
})
.then(function(response) {
// Show the buyer a confirmation message.
return console.log(response);
});
}
}, element_selector);
我正在为 django 项目实施 paypal。接收到我的 notify_url 的消息工作正常。但是:当 paypal 试图返回我提供的 return_url 时,django 总是说 csrf-error 并且页面无法显示:
403 error: csrf token missing or incorrect
return_url 指向我的起始页。任何想法有什么问题以及为什么会抛出此错误? 非常感谢您的帮助! 医管局
编辑 views.py
@csrf_exempt
def view_back(request):
return render_to_response("csrf.html",
{"csrftest":"here I am!" },
context_instance=RequestContext(request))
urls.py
url(r'csrf$', 'view_back', name='view_back')
csrf.html
<{% extends 'base.html' %}
<!DOCTYPE html>
{% block content %}
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body><h1>My Test</h1>
<!-- writes out the form tag automatically -->
{{ csrftest }}
</body>
</html>
{% endblock %}
编辑2
urlpatterns = patterns('my_project.views',
url(r'^$', 'calculation', name='calculation'),
url(r'money$', 'view_that_asks_for_money', name='view_that_asks_for_money'),
url(r'csrf$', 'view_back', name='view_back'),
)
我想您正在使用 django-paypal
库,但即使您不是,库文档中的这条注释也解释了一切:
Note that return_url view needs @csrf_exempt applied to it, because PayPal will POST to it, so it should be custom a view that doesn’t need to handle POSTs otherwise.
因此,在将 @csrf_exempt
[see the docs] 添加到视图时请小心,出于明显的安全原因,请确保此页面仅用于此目的,而不用于其他 POST。
下面是一个如何将 CSRF 与 paypal 一起传递到 django 后端的示例。
支付:函数(){
return new paypal.Promise(function (resolve, reject) {
$.ajax({
method: 'post',
url: '{% url 'payment_comms' %}',
data: {
what: 'create_payment',
amount: $("#amount").val(),
},
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
success: function (data) {
resolve(data.paymentID);
},
error: function (data) {
reject(data)
}
})
})
},
我对这个问题的回答略有不同,因为我试图弄清楚如何使用 Express Checkout/Server 集成来做到这一点,答案如下:
paypal.Button.render({
env: 'sandbox',
client: {
sandbox: 'sandbox-client-id',
production: 'live-client-id'
},
payment: function(data, actions) {
return actions.request({
method: "post",
url: '/your/django/payment/route/',
headers: {
'X-CSRFToken': "{{ csrf_token }}"
},
json: {
key: value,
}
})
.then(function(response) {
return response.id;
});
},
onAuthorize: function(data, actions) {
return actions.request({
method: "post",
url: '/your/django/execution/route/',
headers: {
'X-CSRFToken': "{{ csrf_token }}"
},
json: {
payment_id: data.paymentID,
payer_id: data.payerID,
key: value,
}
})
.then(function(response) {
// Show the buyer a confirmation message.
return console.log(response);
});
}
}, element_selector);