Paypal回拨给我403错误:django app上的csrf令牌丢失或不正确

时间:2016-02-04 08:45:53

标签: django paypal csrf

我正在为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'),
)

3 个答案:

答案 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)
        }
      })
    })
  },