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);