如何将codeigniter的CSRF令牌传递给Paypal Express Checkout?

时间:2017-07-14 18:56:22

标签: javascript php codeigniter paypal csrf-protection

我正在将Paypal Express Checkout与服务器端REST集成到我的codeigniter网站中。  根据Paypal doc,我将以下内容添加到我的结帐页面:

<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script>
    var CREATE_PAYMENT_URL  = 'https://#######/paypal/create';
    var EXECUTE_PAYMENT_URL = 'https://######/paypal/execute';

    paypal.Button.render({

        env: 'production', // Or 'sandbox'

        commit: true, // Show a 'Pay Now' button

        payment: function() {
            return paypal.request.post(CREATE_PAYMENT_URL).then(function(data) {
                return data.id;
            });
        },

        onAuthorize: function(data) {
            return paypal.request.post(EXECUTE_PAYMENT_URL, {
                paymentID: data.paymentID,
                payerID:   data.payerID
            }).then(function() {

                // The payment is complete!
                // You can now show a confirmation message to the customer
            });
        }

    }, '#paypal-button');
</script>

一切都运行得很好但是,当我启用codeigniter CSRF保护时,checkout.js使用CREATE_PAYMENT_URL对我的服务器进行的调用会被拒绝做到丢失CSRF令牌的事实。我对JavaScript知之甚少,我需要一些帮助才能将令牌传递给checkout.js,Paypal的文档没有帮助。

我尝试过的事情:

关闭codeigniter配置上的CSRF工作! Paypal快速结账工作完美,但这不是一个选项,CSRF安全必须开启。 从codeignter配置中的CSRF检查中排除URI再次工作完美但我不满意。必须有一种方法来保护使用CSRF令牌的服务器调用。 我希望我的问题很明确,你可以建议一些解决方案。谢谢!

2 个答案:

答案 0 :(得分:3)

return paypal.request({
    method: 'post',
    url: CREATE_PAYMENT_URL,
    headers: {
        'x-csrf-token': CSRF_TOKEN
    }
}).then(function(data) {
    return data.id;
});

答案 1 :(得分:2)

您应该可以通过将X-CSRF-TOKEN参数添加到http标头来解决此问题,以解决这个问题。假设你正在使用jquery,下面应该解决这个问题:

$(document).ready(function(){


    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': '{{PUT_YOU_CSRF_VARIABLE_HERE}}'
        }
    });

    var CREATE_PAYMENT_URL  = 'https://#######/paypal/create';
    var EXECUTE_PAYMENT_URL = 'https://######/paypal/execute';

    paypal.Button.render({

        env: 'production', // Or 'sandbox'

        commit: true, // Show a 'Pay Now' button

        payment: function() {
            return paypal.request.post(CREATE_PAYMENT_URL).then(function(data) {
                return data.id;
            });
        },

        onAuthorize: function(data) {
            return paypal.request.post(EXECUTE_PAYMENT_URL, {
                paymentID: data.paymentID,
                payerID:   data.payerID
            }).then(function() {

                // The payment is complete!
                // You can now show a confirmation message to the customer
            });
        }

    }, '#paypal-button');


});