我正在为django项目实施paypal。收到我的notify_url消息正常。但是:当paypal试图回到我提供的return_url时,django总是说csrf-error并且页面无法显示:
403 error: csrf token missing or incorrect
return_url指向我的起始页面。任何想法都有错,为什么会抛出这个错误? 非常感谢你的帮助! HA
EDIT 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 %}
EDIT2
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'),
)
答案 0 :(得分:1)
对于这个问题,我有一个略有不同的答案,因为我试图弄清楚如何使用Express Checkout /服务器集成来做到这一点,答案如下:
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);
答案 1 :(得分:0)
我想你正在使用django-paypal
库,但即使你不是这个库的文档中的注释也解释了所有内容:
请注意,return_url视图需要应用@csrf_exempt,因为 PayPal将POST到它,所以它应该是自定义的视图,而不是 否则需要处理POST。
因此,在向视图添加@csrf_exempt
[see the docs]时请务必小心,请确保此页面仅用于此目的,而不是出于明显的安全原因而不用于其他POST。
答案 2 :(得分:0)
以下是如何将带有paypal的CSRF传递给django后端的示例。
付款:function(){
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)
}
})
})
},